PhD 上半场
我本来有计划 PhD 每年结束后写一篇总结,但是第一年结束后在挫败感中没有落笔。今年暑假得闲时寥寥记了很多流水账,每隔一阵子又想起来写上一点,SOSP 回来飞机上又打开看,草蛇灰线,希望本文确实是帮我捕捉了一些对于 PhD 上半场的情绪和纪念。
落空的期望
我抱着非常高的期望开始了我的 PhD 第一年,甚至在开始之前就设想了自己的研究主题和风格。在马普所和 Jonathan 共事一段时间以后,我几乎把他作为了 role model。他喜欢去思考少有人关注,但是在细分领域中有趣,基础也常常困难的问题。他的PhD头几年并不是很顺利,但是在最后的几年厚积薄发,接连发了 SOSP 最佳论文和拿了 SIGOPS 最佳博士论文提名,一跃成为了 distributed tracing(分布式追踪)和 observability(可观测性)领域中最瞩目的新星。离开德国前我参与发在 NSDI ‘23 上的 Hindsight 是我至今参与过写出来的最好的一篇论文。observability 是一个非常有意思的领域,他是理解系统性能和行为的一种方法论,是 performance engineering 和 debugging 的基础工具,但是随着场景需求和计算平台的演化,围绕着工具本身也有很多有趣的研究问题。
来了斯坦福以后我很快发现 Christos 的研究兴趣和风格大不一样,他更强调问题本身的重要性和可能的广泛影响,这也和他一直专注在做云计算场景下的资源管理和调度相符。所以对可观测性这种偏工具性质的研究兴趣很小,他鼓励我多从问题出发,我们刚开始见面时我提了几个将可观测性和 GPU,MLSys 相结合的想法,但他都没有表现出很强的兴趣。
我最后加入了组里正在进行的一个定制化网络栈的项目开始我的第一个 rotation 项目(斯坦福第一年的PhD可以选择多位导师做轮转),后来叫做 ZeroNIC,可能也有受 observability 研究思路的影响,相较于提升性能,我把自己的研究聚集在了理解 NCCL over TCP 相较于 NCCL over IB 的性能开销上。Christos 也赞同了这个选择,但是一个学期下来进展的却很不顺利,一方面是因为我对于数据中心网络栈(data center networking)中做性能分析的方法很不熟悉拖慢了进展,但更重要的可能还是硬件平台的问题导致了一系列不一致的结果。因为我后来转去做另一个 rotation 的缘故项目没有持续地推进下去,在另一个 rotation 也结束以后,为了更多地帮到完善论文,我转去帮忙做 evaluation,为 ZeroNIC 定制的软硬件平台移植 Redis 作为一个 application benchmark。我很快迭代了几个版本但是又因为硬件平台的 bug 直到 NSDI deadline 也没有跑出实验数据。直到 NSDI 第一稿交上去,我心中最大的感受就是挫败,整个项目中手上的任务几乎一个都没有做出结果,也因为此取消了去波士顿参加 NSDI ’23 的旅行计划。
Jonathan 在22年底离开马普所加入了 MSR,我在经历了 ZeroNIC 的挫败以后决定第一年暑假去 MSR 和 Jonathan 再续前缘。甚至在开始之前就多次在聊 observability 在时下流行的 MLOps 中可能的研究问题。西雅图见面时叙旧聊到我曾经喝醉酒吐在他家,他问我对这个夏天有什么计划,我郑重其事地讲到希望能帮我后面几年 PhD 确立更清晰的方向,他有些意外,大概因为在德国时我们聊的还是去巴黎的时候应该吃点什么。我很快就嗅到了强烈的 wishful thinking 的危险:因为就像我第一次在马普所见他那样,我们花了头两个礼拜,也没有确立要做的问题:我有的一些想法他觉得 motivation 不够有说服力,而他的几个想法可能又有点太空中楼阁,虽然最终还是他说服了我去尝试更宏大的项目,但是在每几周我们开会讨论以后谈这个项目的前景的时候,他也总是自嘲一下或许刚开始就应该做我提的底层 GPU observability 工具。我们想探究一套,严格的形式化方法和一锅乱炖机器学习之外的,实用的 root cause analysis(RCA,根错误分析)框架,这个问题多少是一个经典的开放问题。我感到就像是一场大雾笼罩了整个夏天,让我一直迷茫看不见方向,尽管是消耗了很多的脑力,但大部分时候都没有能够有效地推进。甚至在MSR时我还去找了 MSCCL 的作者 Saeed 聊我之前关于 NCCL over TCP overhead 的问题,虽然他听后确实有一些兴趣,但最后因为没有合适的机器用来做测量以及我也没有精力去推进就又搁置了。
Christos 曾经引用他导师 Dave Patterson 的一句话,it’s not about how many projects you started, but how many project you finished。我后来深以为然,完成的项目各有各的亮点,但是没有完成的项目们,确实也各有各的不幸。或许是系统过于复杂,或许是方向不对,或许是没有坚持到底,或许是目标不切实际,也或许就是时机不对,但凡此种种,可能总是免不了落空一番期望带来的挫败。
Connecting the dots
在第一年的挫败中,我也感到幸运能找到一些成就感。在一次 CS300 课上我听 Kayvon 聊到他的通过新颖的系统设计来支持大规模视频分析的项目,很受到吸引,他虽然研究的主要兴趣在图形学,但是对于系统非常了解,他自己也是 CUDA 前身 Brook 的作者之一,博士期间的主要研究在于高性能的 GPU 计算。我第二个 rotation 加入了他组里一个叫 Madrona 的项目,Madrona 旨在解决大规模并行强化学习训练中,不同环境之间同质化的计算带来的冗余资源使用,譬如说要同时探索一千种强化学习策略需要创建一千个虚拟世界供 agent 来训练,但其实这一千个世界是大体相近的,资源和计算可以以一种特殊的 batching 方式来进行高效管理。加入时项目本身的大体框架都已经成型,但我很快发现当下的整个系统缺乏一套对于性能理解的框架,导致性能问题很难解决,偶尔并行死锁也很难 debug。我差不多用了一个月的时间就搭好了基础的可观测性框架,而后一直迭代效率,精度和可视化方法。最后项目投到 SIGGRAPH,我在投稿当晚还在优化一个关键的性能图像化展示,凌晨和同样在忙 SIGGRAPH 的 Jiaju 一起从 Gates 出来感觉空气都更轻松了一些。后来论文顺利被接收,这张图可能是我整个第一年唯一收获成就感的结果。
Rotation 结束后我在 Kayvon 组会做了一个总结汇报,在聊如何给 Madrona 增加可观测性时,我回顾了之前做 Rammer(OSDI ‘20)积累的关于 persistent thread 和在 Hindsight(NSDI ’23)中关于 observability 的经验。Kayvon 听完感到很意外,仿佛我就是注定要来帮 Madrona 解决 observability 问题,换做别人很可能就无法做到这个程度。乔布斯曾经在斯坦福有一段著名的毕业演讲,其中提到一句,“you cannot connect the dots looking forward, but you can only connect them backwards”,我在当时很十足地感到这句话的分量。但这些事情的发生似乎又都是很偶然的,譬如说我当时没有去 MSRA 做 DNN compiler,后来在马普所没有因为迟迟回不了国开始更多地研究 Jonathan 关于 observability 的工作,甚至在 Kayvon 没有回复我关于 rotation 的邮件以后,如果我没有去堵他的门找他,都不会发生这个 rotation。
乔布斯演讲中其实还有一句后续,“So in this moment, you have to believe in something, vision, karma, anything, etc and to believe that they somehow connects together”, 在我第二年开始在研究选新项目时 Kayvon 讲了类似的话。去年斯坦福一篇很有名的关于 generative agents 的论文(中文常称作斯坦福小镇),安排了25个 agents 在一个虚拟世界中互相交流,用来研究LLM在agent上的潜力,启发了很多后来的工作。Kayvon 对 scaling 类似的 LLM agent society 很感兴趣,我们能否设计一个系统来支持更大规模的类似模拟?但其实第一个问题应该是,更大规模的 AI Agent Society Simulation 是否有其应用价值。我同 Joon(generative agents 的作者)聊了很多次,但是很遗憾因为他准备毕业,也没有其他合适的人能够推荐合作推进这个想法。在我犹豫不定时 Kayvon 讲做研究常常是 “bet on something”,对我很有鼓励,或许这是一个鸡生蛋和蛋生鸡的问题。后来随着项目推进,发现了一个比较新颖的 dependency 问题,设计了一套对应的系统调度,即使还没有真正看清楚可能用户的需求,但在第二年暑假开始之前也顺利把第一版 simulation engine 原型 AI Metropolis 成稿投了出去。后来陆续也看到一些硅谷的初创公司在做大规模的 AI Agent Society,最让人印象深刻的演示可能是 Altera.AL推出的 Project Sid。逐一聊下来发现尽管具体的应用和需求还很不明朗,但水下似乎确有暗潮在涌动,未来会走向何处自然是无人能够预料的。
AI Metropolis 项目期间,一次跟 Ying 和 Lianmin 聊了以后发现对于 context caching 优化的想法有一些重合,于是也决定加入了 SGLang 这个项目贡献一点力量,事后看其实是一个很正确的决定,同期类似的想法很快就出了好几篇论文,而SGLang作为一个很有影响力的开源项目有长久的多的生命力。后来 SGLang 也成为了我研究中很顺手的平台,方便快速实现和验证想法,同时也更容易地对接了社区的需求。
第二年里也帮着把 ZeroNIC 的拒稿重投了OSDI,对于和硬件相关的问题最终实在没有办法,也意识到指望不上合作公司的工程师,只能重写最小测试样例来触发 bug,然后去逐行代码地去排查触发条件,最终终于定位到了一长串的具体的硬件和驱动限制有关的 bug,终于能跑通并且在投稿 OSDI 时起码确实有了一组在实际应用上的实验结果。后来论文被接收我长舒一口气,终于是对这个项目有一个交代。
我最后也下定决心要给暑假期间MSR的项目一个交代,甚至为此选修了一门课来借课程项目推动进展。通过反复的讨论,终于把问题定位在了很具体的观测数据语义(semantic)缺失上,最后设计用LLM来弥补语义的隔阂,将非结构化的对于观测数据的知识,转化为结构化富含因果关系的 causal graph,再基于此用统计方法来做观测数据之间的因果分析(causal reasoning),因为缺乏trace还写了一个模拟器产生观测数据来验证有效性。春假在匹兹堡探亲时,也借机会结识了做因果分析的 Yujia,帮忙解决了论文里重要的对经典因果发现(causal discovery)方法的比较。最后终于成稿了 Cloud Atlas。
东隅已逝,桑榆非晚
在离开德国之前 Jonathan 问我对于在马普所的一年是否感到满意,我讲毕竟我不是在读 PhD,尽管一年没取得什么具体的成绩,但我确实有一段愉快,难忘的时光。结束夏天的实习,站在第三年的开头上,如果对过去两年问同样的问题,可能很难感到满意。尽管参与的工作都有了一个交代,但是自己的两个投稿最近都吃了据信,虽然有一些 review 确实没什么道理,但我也明白因为一些条件限制,确实无法或者很难通过特别详尽的 evaluation 来非常好地支持。但是完成好过完美,下一篇 paper 会更好:)
或许还有几个角度可以宽慰过去这两年:学术写作比起读 PhD 前有成熟,在日常交流中也更能够表达清楚研究想法;在定位选题和快速验证想法上有了更多的经验,很明显地反映在了我暑假在 NVIDIA 的实习中;更多地认识到自己内源的激情和驱动力比外界的期待和压力重要的多,这可能更多是受到环境的影响,Christos 对于学生非常 hands-off,在我每次表达焦虑时他总是宽慰我,讲不需要跟任何人去比较,Kayvon 也总讲,拖延症的主因往往是自己缺乏 motivation,要去做真正让自己兴奋的事情;还骑了两三千公里的自行车,开了一万多公里的车,飞了几万公里,虽然没有读上万卷书,但是真的行了万里路。
进入第三年后,Christos 更认真地问我对于教职和业界的想法,似乎不应该用“还早”来应付了。在今年的 OSDI 和 SOSP,Meta Platform 连拿了两篇 best paper,恰好又都和 observability 关系很大,都是团队常年累月从实际生产环境的积累,我专门去聊了一下结合 causal reasoning 的可能。他们表示感兴趣,但是我也清楚 more is different,千倍的规模下可能会带来根本性的新挑战和机遇。或许就算是仅从满足好奇心的角度来讲,对于计算机系统而言,学界可能也并非是最好的场所,毕竟往往看清楚一个问题比尝试解决要更难。我两个暑假的实习都选择了很纯粹的 research lab,但或许后面应该尝试去更面向实际问题的部门看看。从学界的标准上讲,我也还没有看清楚自己的一亩三分地,或许确实还需要一些时间来有答案。
“Pain is inevitable, but suffering is optional”,当年从村上春树书里读到时对这句话还没有实感,但是两年下来更多理解了,困难使命中 pain 大概是难以避免的,它藏在每一次尝试中,钻进每一次焦虑的缝隙里,也砸在每一次蹬踏板挑战峭壁的大腿上,它是具体的,甚至是可以度量的。但是 suffering 却是如鬼魅一般的,它禁锢力量,恫吓此路不通,虽然不总能意识到,但我通常是有选择不受其支配的自由的。
既然都已经到这里,不妨再对下半场的PhD也报有刚开始同样高的期望好了。
Feedback? email, anonymously or comment below: