12月31, 2021

2021年的年度总结

2021年过去的可真快啊。

又到了一年一度的年度总结的时间了。

回去翻了一下2020年的年度总结,还是比较丧的。有悔于2020年的蹉跎,亦有对自己的不满意。不满意主要来自于对待工作和人生的态度有些过于随意了,还有对时间的浪费,很多自己计划的事情没做好。

不过我对于2021还是比较满意的,我的成长超过了我在年初时对自己的预期;我做成了我未曾设想能做到的事情,虽然不是年初规划时的那一件;对于过去困扰我很久的一些心结,我也有了解。照例在新旧之际,好好总结一下吧。

Anylearn

在2020年的年度计划里,我给自己定的目标是想推动Anylearn的开源化。不得不说,这确实是一个很难的事情,至今我们也没做到。但是我们也迈出了一步,就是常态化的运营平台,为组内的科研活动做支撑。事实证明,很多灵感和经验必须要从生产数据中才能拿到。停留在PPT上的系统,永远只能停留在PPT上。

在2021年接近收尾的时候,我和大芃又回到了小白板面前,开始做明年的前期规划。我们开始以快慢数据、性能指标等方法分析系统,我们也开始做一些在我看来真的是很难的事情的设计。无论是技术的复杂度还是工程的难度上,都要远甚于以往。事实上,前三年,我们很难回答Anylearn系统的创新点在哪。但是从第四年开始,我相信这个问题的答案将开始出现解,并且会不止一个解。

我们做Anylearn,既是在做一个业务系统,也是在做一个基础架构。Anylearn是一个Sys For ML。为了支撑这样的一个系统,我们用了足足三年的时间,去踩坑去建构。

我们走了很多弯路。曾经我们希望,让Anylearn成为一个工业场景下,对没有算法开发经验的工程师友好的AI模型开发系统。我们提了很多slogan,比如数据通路,比如低代码,乃至更早的数据模式。我们希望能降低全流程的门槛,但是事实就是,失败了。(我发现我越来越能接受自己失败了,也算一种进步吧)

我觉得问题主要出在两个地方

首先,简单的才是复杂的

一个比较经典的AI降低门槛的思路就是,对通用场景做分类,然后用大量数据构造预训练模型。但是这个思路是有问题的。

AI火起来,一方面是因为硬件的发展。但更重要的因素是数据量的膨胀。毕竟没有足够的数据,现阶段再好的硬件都只是无米之炊。这也是很多论文有漂亮的表格,却无法在真正的生产系统工作的原因。因为用了再多的数据集,跟TB甚至PB级的线上数据比起来,都是那么的不值一提,更别说只在少数几个数据集上凑点的模型了。基于数据归纳的AI方法,与之前基于数据仓库做BI的方法比,一个比较大的进步是人们不需要去自己寻找问题的解,而是可以划出一个求解的范围,然后让模型去收敛出解。

因此AI模型是特定场景下,对求解过程的抽象和压缩。但是现阶段,很多模型和其参数空间本身就是一个小的混沌系统,AI模型的可解释性问题没有通用解。连专业的AI工程师都未必知道什么超参数靠谱,更别提没有AI知识的普通工程师了。为了解决这个问题,人们又引入了AutoML。目前阶段,AutoML思路都很粗暴,就是搜索+剪枝。而搜索是对资源最不友好的一类算法,本质上还是在拿海量的计算资源去填坑。我觉得要想实现真正的AutoML,首先还是得解决模型的可解释性问题,这样才有可能实现定向的搜索。

即使当我们成功对用户屏蔽了算法本身的细节后,我们还不得不让用户去理解数据的结构。目前主流的AI算法都是以非结构化的数据作为输入的,用户需要按照算法规定的格式去准备数据。与BI那样以SQL这样的结构化数据作为输入相比,非结构化数据更难以描述,用户很可能在真正把训练跑起来之前,要反复调整文件夹的格式等等。AI系统可以选择把准备数据的这部分成本完全交给用户,或者引入一些数据清洗的工具。这都要求用户是有经验的数据工程师。或者我们提升算法的“智能”程度,再加一个模块,自动理解目录结构,并改成算法可接受的模式,或者做前置判断。我们做过这样的尝试,叫“数据模式”。我并不喜欢它,因为那不是一个可以收敛的解。我们几乎等于在枚举所有的场景,然后人为的去规定目录结构。

发现没,一个“简单”的AI系统对用户屏蔽的细节越多,那么底层要做的dirty work就越多,系统的复杂性就越高。一旦我们试图在某些地方停下来,提高对用户的要求时,我们的用户画像就自相矛盾了:他既不能有足够的知识,不然他一定会选择自己去虚拟机上写代码训模型,他又要有足够的知识,去解决我们留给他的问题。

另外,AI系统就是大数据系统,大数据系统又具有其天然的复杂性。其承载的数据量,对存储系统的读写性能、稳定性都有很高的要求。尤其是目前应用比较广泛的图像领域,需要存储系统解决海量小文件场景下随机访问的性能问题。这些如果想对齐AI开发上希望给用户提供的“简单”的体验,要做的事情同样不会少。
以上这些复杂度,对于一个小团队来说,是不可接受的。

其次,缺少场景

在20乃至30年前,学校相对于业界是有国家倾斜的资源优势的,而且软件需要解决的问题主要瓶颈不在规模,而在功能的完整度上和细节的复杂度上。但是在当下,工业界的主要问题的瓶颈都在规模上,尤其是平台式的软件。为什么99.6%的模型比99.5%的模型好,在学术视野下是很难理解这个问题的,但是在工业视野就很好理解。当DAU的单位是以亿计算时,稳定多0.1%的准确率,意味着多十万级的请求能得到正确结果。一个系统设计在二三十个人这样的用户规模下可能勉强能用,偶尔还会出点故障。到了百人千人团队的时候,很可能就是大面积的不可用和故障。一个模型的准确率到底有多稳定,一个系统设计到底经不经得住造,只有在大规模的数据场景下,才能去对科研的结果做验证。学校团队是天然劣势的。

这样两个大问题横在面前,我们最终发现,Easy AI这样的理想,对于我们这样的团队可能很难。所以2021年我们做的最大的调整就是,回归学校的科研场景,提高对用户能力的期待值。当我们放弃对“Easy”的追求后,我们反而同时降低了用户理解的成本和设计的复杂度。这是我们天然熟悉的场景,我们可以实实在在地承载起来,并且在生产中收集数据。而这样的场景是一种长尾的场景,全国可能有很多我们组这样的二三十人的科研团队,这个市场不见得不够大。转型之后,Anylearn的成长速度比以前要快了很多。这离不开大芃和团队其他同学的辛苦付出(salute)。

目前,我们为22年做的一些规划里,已经从上层业务系统的构建,开始向底层基础架构的探索去渗透。我们在21年规划了资源利用率提升的目标,在22年会尝试各种方式去寻找解。这在我看来是非常积极的信号,说明我们开始做一些有望追赶前沿的尝试。诞生于学校的系统是一定不能在业务层面去试图与大厂掰手腕的,只会死的很惨。但是当我们把问题重新从规模化转为一些复杂度的问题时,我们就可以一定程度上去缩小学校和工业界的差距。这其实是借鉴了AI灌水文的思路,如果主赛道玩不转,那就去设置一些很奇怪的偏门settings。

我自己对基础架构进行了代际上的划分。第一代基础架构是完全基于人治的系统,搭建容易维护难,所有的运维都需要人来做。第二代基础架构是基于固定规则的系统,可以支持一些基于固定策略的自动化运维手段。第三代的基础架构是基于归纳生成的规则运行的Data Driven系统,系统可以分析过往的运行数据,代替人的“经验”去管理系统。而第四代的基础架构,是在大量的经验模型之上,构建出具有强人工智能形态的复杂系统,可以自动发现“经验”中的错误,并加以修正和成长。顺便说一句,关于强人工智能,我个人的判断是:

  1. 强人工智能一定是诞生于系统构建的实践当中,绝不会是一两个算法模型能做到的。
  2. 很多人担心强人工智能出现后会取代人类,我觉得是多虑了。很多人会在强人工智能出现之前就被取代了。

Anylearn的上层是Sys for ML,我们希望在基架层面,可以去做ML for Sys。得益于云原生的火车,Anylearn的基础架构可以从第二代开始直接起步,不需要再一步一步的从洪荒时代走过来。我们在这样的基础上,去做一些第三代基础架构的尝试。正因为我们的系统小,一些大规模场景下不可行的解法有可能在这样的规模下是可行的,我们有更广阔的探索空间。希望2022年能有一些好的结果。

字节跳动

今年,在字节跳动的实习是我最重要的经历。加入字节跳动给我带来了我意想不到的成长速度,因此我也在秋招季选择了它。

如果要我问什么样的方式能让一个人成长的最快,那我的答案可能就是把尽可能困难的问题抛给他去解,同时也信任他。在字节,我接到了去解决一个复杂问题的机会,并且也得到了来自同事们的信任。我不知道别的公司是什么情况,但是让一个实习生去组织一个跨团队的项目,这种机会怎么想也不会是俯拾皆是的。

我们做的问题是:如何在物理层面,通过感知业务的拓扑,去构建一个从上到下的完整性,进而做优化。在微服务的体系下,大量的优化实践只关注其物理信息,比如CPU、内存,设备亲和性,碎片率等等,并不关注进程所携带的业务属性。合并部署是其中的一个解,把相关联的业务调度到同机上,以本地通信去替代远程通信,换取链路上的优化。在上层流量面上做流量的规整,向这种本地通信方式倾斜流量,将收益体现出来。

在这里面,基于业务的亲和性做调度是完成了业务拓扑和物理拓扑的对齐,流量调度是完成了业务拓扑和数据拓扑的对齐。而我们还没有完全实现业务、数据、物理这三层拓扑结构完全的对齐,物理拓扑和数据拓扑的对齐是空白的。这也是明年努力的一个点。

在一开始,我只是去做这样的一个方案的预估收益分析。到之后主动去联系各个方向的同学做方案的规划、实现,进而去联系业务做试点、验证。今年春节会有一个初具规模的上线计划,让实战来检验方案的可行性。

我很感谢最初的自己足够野心勃勃,接住了机会,而不仅仅只是得过且过。实习生可以成为开玩笑时的谈资,但是绝对不应该成为一直寻求帮助逃避成长的借口。这是一个很棒的项目,它不仅锻炼了我coding的能力,更重要的是要求我主动扩大自己的视野,从不同的层面和维度上去思考问题,梳理细节。因为涉及多个团队,我需要主动去理解每个团队是怎么认识和解决问题的。我会时常担心自己的思考会不会因为见得太少而有天然的局限性,因此会主动去与前辈们聊,问他们是如何看待字节基架当中的一些问题的,将自己的想法与整个调度团队的思考对齐,尽可能避免无效的投入,或者做出与大方向相悖的设计决定。在合并部署之外,我也加入了GPU常态混部以及云原生机器学习系统构建这样的方向。一方面是为了能从中学到对设计Anylearn有帮助的经验知识,另一方面也是为了在更难解的问题中,探索成长的空间。

在12月31日,合并部署2021年最后一次周例会上,当我拉着各个方向完整地梳理出合并部署项目在2022年的年度规划之后,我知道跟当初刚加入公司时相比,无论是能力上还是心态上,我都已经有了很多不一样的地方。

其他的一些零碎

以上两件事是很重要的两块。它们对于我能力和心态的塑造起到了至关重要的作用。也让我对一些过去的心结有了新的看法。比如我的高中生活。

我其实是很不喜欢高中那段生活的。有比较糟糕的人际关系,有一些很不愉快的回忆。上大学之后的很长一段时间里,我一直保持着对这三年时光的一种恶意,可以说是耿耿于怀,但是我又一直很难说清楚,我到底为什么不喜欢。直到今年,我给这个问题画了一个句号:我对那段生活绝大多数的恶意,都来自于对当时弱小、自大、愚蠢、自私的自己的厌恶。有很多学习之外的事情,比如人际关系,比如情绪控制等等,当时的我都没能很好的处理。我有意或者无意间,给很多人带来了困扰。而当我受到这些行为的反噬时,我甚至没能意识到那些是咎由自取。当下的我能给自己的宽慰就是,现在的我可能有足够的敏锐和能力,去尽可能避免给他人带来负担和烦恼。让这段黑历史不再重演于未来。也许这会与我一贯随心所动的行事风格相悖,但尽可能无扰于人是我所必须恪守的准则。

在时光的间隙中,我也完成了一些小的目标。比如找一份满意的工作,拿到一个不错的薪资水平。比如虽然时断时续,但是保持着健身的习惯,希望能早日降到我初二时的体重水平(140)。比如带着大碗去成都旅行。有人说双人旅行是检验亲密关系最好的一种手段,还好我们的旅程都挺顺利。说起来,当我忙于那些工作的时候,我也很感谢大碗主动静默,尽可能少的打扰我。她是一个很好的陪伴者。为了我所想成就的目标,我牺牲了一些休息的时间,而她牺牲了一部分从我这里的情感的诉求。我只能通过她最喜欢的大吃大喝去弥补她。确实牺牲和弥补不太相称,但是在如今的环境下,这个岁数拒绝躺平选择闷头往前冲可能会让以后的我们感谢现在的自己。

我已经很久没打DOTA2和CSGO了,永劫无间也停在陨星段位后就不打了。倒不是我不会累不需要休息了,而是我发现了比电子竞技更有趣的天梯游戏,那就是人生。

现实的生活里,是不会有《鬼灭之刃》里面的十二分级,或者是《咒术回战》里面的术师分级这样明确的量化等级的。也许有所谓的大厂技术序列职级来侧面反映,但是终究不会有一个绝对标准。不过,没有可量化的标准不代表无法感知到成长。当我发现我的能力越来越强时,自我肯定带来的喜悦可以带给我甚于游戏上分的喜悦。

曾经我希望成为一名架构师,现在我对目标做了一些具体化:我希望自己能够成为第三代基础架构资深的构建者,并且在时代进步到第四代基础架构时,成为一个或多个方向的引领者。

除此之外,明年怎么在更繁忙的安排中更流畅的切换context,更好的处理工作以外的生活是我要关注的问题。毕竟人不是机器,还是要想办法为祖国健康工作五十年的。

结语

能看到这里,证明你对于我这样一个平凡且无聊的人很关心。谢谢屏幕那边的你,新年快乐。

本文链接:https://blog.magichc7.com/post/review-of-2021.html

-- EOF --

相关评论