郭人通,华中科技大学计算机软件与理论专业博士,师从廖小飞教授。Zilliz合伙人和产品总监,CCF分布式计算与系统专委会委员。他专注于开发面向AI的高效可扩展的数据分析系统,是Milvus项目的系统架构师和Towhee项目负责人。其工作成果曾发表于SIGMOD、VLDB、USENIXATC、ICS、IEEETPDS等国际顶级会议与期刊。
应实验室公众号“穿过丛林”的邀约,郭人通分享了自己在CGCL求学期间的点滴,以及毕业后创业的“故事”。
感谢你翻开这篇文章,了解我的故事。掰开手指算算,从实验室入学,到博士毕业,再到出来创业,已经十一年了。期间被挺多朋友问过读博、创业的收获,回答也多是专业方面的东西,或是关于前沿技术的,或是关于讲好故事的。直到最近,有幸接受实验室邀稿,又静下心来对这个话题做了重新复盘。
几遍盘下来,觉得期间收获最大的是:一个爱好,外加上两句话。
一个爱好:读paper。自打初中没再学美术之后,从没想过自己这个理工直男能再和什么高雅爱好结缘,直到读博。人生中接触的第一篇paper是The Google File System,记忆犹新。这一篇论文,来来回回精读了接近一个礼拜。读文章的过程,犹如搭思想沙盘,建底座,了解骨架,画上细节,有模糊的地方,阅读参考文献,整明白了再回来补充,最终把整座系统装在脑袋里,让系统动起来、活起来,很有意思。
再后来,读paper逐渐成为了爱好,也成为了习惯。在毕业后进入工业界,paper成了一个僻静的去处,不受外界打扰,可以放心的清空脑袋,享受一段探索时光。
第一句话:“做有意义的系统工作。”这是在实验室期间反复听金海教授提到的一句话。虽然没有官方认证,但我总觉得,这应该是实验室的最佳训言。“系统”这个领域天地广阔,但找到属于自己 “有意义”的那份并不容易。我自己的体会是,越努力的挑战这句话,这句话就会变得越困难。在挑战的过程中,一旦剥去对“有意义的系统工作”的表面定义,露出来的就都是一些硬家伙:如何察觉蛋糕的位置,如何判断入场时机是否成熟,如何有效满足需求,如何权衡资源与目标,如何将前沿技术转化为可落地的价值,如何在飞速迭代中保证复杂度不失控......钱难挣,博难读,系统难做,这个难度顺序,诚不欺我。
第二句话:“要逐渐提升并行解决多个问题的能力。”这是在毕业下山前,我的导师廖小飞教授亲传的一件铁杵,让我把它磨成针。不曾想,没过多久,我在创业过程中把手磨到秃噜皮。在实验室期间,了解前沿工作,写系统,做实验,讲故事,带师弟师妹,本以为这就是“多件事”了。从实验室出来之后,才发现有导师把非技术事项全部屏蔽,自己只需要专注技术是多么幸福的一件事。
从进入实验室,到博士毕业,再到出来创业,已经十一年了。“做有意义的系统工作”与“提升并行解决多件事的能力”这两句话,也挑战了十一年。目前,还在继续。这个过程中,一共做了四个还凑合的工作:NightWatch,MegaWise,Milvus,Towhee。接下来,想分享一下我与这些系统的故事。
NightWatch是一个内存分配器,这个分配器的花里胡哨之处在于,能够同时管理内存与CPU缓存两层存储资源。
那会儿刚读博士不久,参与了“多核/众核运行时系统”863项目。说实话,当时只是觉得有意思,对科研还处于完全不懂的小萌新阶段。“多核”,“众核”在十年前都是新鲜词儿,也没咋听过。俗话说的好,师傅领进门,修行在个人。印象挺深,当时廖老师语重心长的画了一张饼,说是“你要想深入了解一个大的领域,并且能讲好这个领域的故事,那就读一百篇文章”。为了防止我不信,后面还加了一句,“上交的陈海波老师也是这么说的”。那咱也不懂,就听老师的,读吧。。。说实话一开始真挺费劲的,人家写的论文都是人类知识的边缘,但是咱还是从原点出发。递归式的读论文基本避免不了:从那个“边缘”一路刨背景知识,每个背景知识对应几个中括号引用,递归着往下走,直到走到自己知识的边缘。(那会儿突然明白了,所谓的“刨根问底”的“底”,其实是自己的顶。。。)过程不容易,不过好在心态很稳,因为读的那些文章中括号引用的,我都默默算到那一百篇里头了。。。
后来没花几个月还真摸出点儿门道:多核/众核这套东西就硬件体系结构、操作系统、库与运行时系统这么三层。硬件体系结构是计算核、互联、缓存几件套,工作最硬核。这块儿基本的东西都摸明白了,但是太硬了没基础,下不了手(来点儿历史:那会儿是12年,实验室14年开始进军体系结构,15年咱们玩儿转了模拟器,18年开始在系统结构三大顶会发力,目前有了芯片设计、模拟器验证、FPGA验证的系统性能力,正走在流片的路上。回头看和开了火箭差不多!)。太软的纯调度、纯协议又不太喜欢,那就软硬结合,做系统软件里面的硬件资源管理。能把硬件用好,工作听起来也不错!换个维度再复一遍盘,计算资源、CPU时间片、进程/线程这些传统项目,想要打破记录估计比较困难;互联这块儿基本都是走的硬件协议,软件层面不好发力;那缓存有机会吗?好像也是硬件层面管的?又到空白了,不怕,一百篇还没到,那就撸起袖子接着读论文!
不读不知道,还真有!一个缓存被组织成若干个缓存组,所有物理地址经过哈希与缓存组形成静态映射关系。应用程序数据的逻辑地址经过操作系统的paging建立与物理地址的动态映射关系:两层映射一层死的,一层活的,我们通过控制活的这一层,就能最终决定数据会落在哪个缓存组。另一方面,多核环境下并行运行的多个程序的数据局部性不尽相同,我们应该把那些访问局部性很差的数据找出来,限制它们在整个缓存内的资源占用范围,提高整体缓存利用率。
沿着这个思路,接下来决定做一个可以同时管理缓存和内存资源的malloc。花了一年多时间,撸了一遍相关的底层代码,玩溜了vim,搞懂了C,改了操作系统内核内存管理的部分,改了malloc,加了页面访问局部性监测协议。用HPC的SPEC benchmark测了一下效果(其实是持续迭代并改进了几次),和当时最好的内存分配器jemalloc相比,最高性能提升40%多。感觉平生第一次做了点儿有用的东西,挺高兴的(接下来打了一个礼拜游戏)。在金老师、廖老师、谭光老师、岳建辉老师的帮助下打磨好了论文,一开始投MICRO,5个评审里面有一个给了weekre ject,没中,后来投ATC,中了。金老师和廖老师也挺高兴的,说是实验室第一次中USENIX会议,夸了我一顿,差点儿飘了。再后来,就去三藩开会作报告,那阵子中美关系不好,老师们都被check了,一个人过去人生地不熟,但一趟走下来还算顺利。会议上还有个小插曲,被问到为什么选择和jemalloc比。我说因为jemalloc最牛逼,那肯定和这个比。全场都笑了,就我不明白咋回事儿。后来才知道提问的那位学者就是jemalloc的作者,当时觉得挺神奇的。
MegaWise是一个GPU加速的OLAP数据库引擎。To the best of my knowledge,MegaWise是国内第一个能work的GPU OLAP引擎。和全球同行相比,率先通过了TPC-H benchmark。
在读博期间,就一直想做一个像GFS那种受业界认可的系统工作。毕业没多久,被一个自称是师兄,头像又有点像南方老板的人加微信。说叫Charles,从北美Oracle回国,喊我一起去做startup。和廖老师打电话确认,还真是同门。后来在北京胡同的小馆子聊了几次,确认过眼神,觉得GPU数据库确实值得干一票,就从华为出来了。这次选择,对于事情最终成与不成没有太多想法,主要是想做一个像样的系统。当时是18年初,觉得国内资本和人员也逐渐像样了,也许能够支撑这样的工作。
团队不大,七个人,老金、老莫、叶富哥、志锋、翔宇、Charles、我。憋着一股劲儿,三个月连轴转,和大家一起搞定了一版。最后冲刺那周,印象挺深的,为了过TPC-H benchmark,连着通了四天宵。最后一个问题,是被全组人围观着解决的。因为这个事儿,还有了公司第一个梗(叫文化也行吧):大版本发行,谁解决最后的问题,谁就被全组围观。
都是咱们实验室的毕业生
虽说系统刚起步,但还算五脏俱全,Parser、Planner、Optimizer、Execution engine、Storage,等等,都有。有了个底子,紧接着就开始着手打磨优势。既然号称是GPU数据库,那么和传统CPU的比性能,如果不高个数量级,东西都不好意思拿出手。于是研究重点很快聚焦到两个方面:提高主存到显存的数据传输效率;避免过多中间结果在GPU内生成。花了半年时间,团队摸索出一套组合拳来打这两个点。首先是在列存上搞了一整套针对GPU的高并发数据编解码方案。主存和GPU显存内都是存放编码后的列式数据,大幅度提升可支持的数据规模,并有效降低主存到GPU之间的数据传输量。其次就是一套面向GPU的rule-based planning,对SQL语句转成的执行计划树进行rewrite,调整算子执行顺序并进行算子融合。最后是一套基于LLVM的kernel生成框架,根据执行计划,直接生成端到端的CUDA代码,避免了大量中间结果的产生,以及频繁的kernel调用。
至此,都是内核上的技术活,一切顺风顺水。到现在回头再看这套框架,也依然觉得不少地方可圈可点。但故事都有转折。技术做high了,就容易犯错误。一年的时间铆足劲和北美对标的项目PK,结果忽略了中美市场的差异,也忽略了赛道时机的成熟度。按照惯性思维,东西做好了那下一步肯定是要推销出去的。秉承着“并发办好多件事”的原则,在技术之外,又搞起了打单子的事情。一圈下来,有名有号的国企、央企、机关单位都跑过了,但就打下来百十来万的单子。那段时间是夏天,经常和Charles俩人在公司楼下的路灯下复盘,一站就是到半夜。白天跑单子不得不喝酒,晚上复盘,缓解焦虑还得接着喝。
直到有一天,醒了。是被潜在客户打醒的。那天照例讲完PPT,对面负责拍板儿的老领导点了一句:“郭博士,你们这套东西很先进,我们也需要。但是有一个问题,你们是个小公司,用了你们的东西,你们倒闭了,我后面找谁去解决问题?”说的是啊,一缺案例,二没背书,赛道又在很早期,只有头部有少量需求,就靠两个人每天跑几个地方,问题解决不了。
“要逐渐提升并行解决多个问题的能力”,说的是两层功力:并行解决问题的方法论;并行看准问题的方法论。很显然,第二层,没悟出来;系统,也就难做活。第一次感觉到,做系统不是个纯技术活,造系统的是人,成就系统的是时势。时,把不把得准,势,借不借得上,都很关键。
Milvus是一个向量数据库系统,我们将项目贡献给了Linux基金会。目前,Milvus是全球范围内最受欢迎的开源向量数据库系统。
MegaWise聚焦在结构化数据分析,但我们观察到用户侧对于非结构化数据分析的需求增长迅猛,非结构化数据快速占到全球数据总增量的八成。同时,这个领域的系统软件生态仍在初期,存在巨大空缺。Charles果断拍板,转战非结构化数据。
我们的创业团队,都是咱们华科的毕业生
2018年,国内绝大多数团队做非结构化数据应用都是以接项目的形式(现在也是)。但这并非我们擅长的路线,也不是我们愿意走的路线。我们坚信系统软件的重要性与价值。经过抽丝剥茧,我们发现虽然上层的非结构化数据应用种类繁多,但很大一部分都以搜索能力为基础,如推荐系统、文档搜素、图搜、视频分析、数据去重、版权保护、内容安全、药物发现等。这些应用,绝大多数都需要基于神经网络技术对数据内容进行语义理解。再往下挖,我们又发现虽然非结构化数据类型不同、处理过程中所用的神经网络结构/参数不同,但对于这些数据语义的表述形式是相同的:都是依赖稠密向量来编码这些语义信息。
那些年,从word2vec开始,各种2vec技术层出不穷,算法圈甚至出现了“万物皆可embedding”的口号。从系统角度看,这些embedding向量,提供了系统抽象的绝好切入点:稠密向量,可以非常好的统一各类语义信息的表示方式,在数据理解与分析的上游可以由神经网络直接输出,同时,在下游的查询分析过程中易于并行化,可充分发挥现有高性能计算设备的并发能力。
在赛道的逻辑上,也是给了我们非常广阔的想象空间:在结构化数据时代,我们主要依赖数值与字符;在半结构化时代,我们引入了大量文本能力;在非结构化时代,我们必将引入AI与信息向量化。那么,向量数据库,这个新的系统软件品类,也将在整个赛道中占据重要且基础的位置。
至此,方向明朗了,但还不够,我们在打法上也需要进行一轮革新。MegaWise时期所采用的传统传播与销售方式我们没有走通,那在向量数据库这里,只靠Charles和我的两张嘴,四条腿,应该也是走不通的。没错,聪明的你可能已经看出来了,这个位置上如果要打通,就得加杠杆。加什么杠杆?营销,引入渠道入局一起分蛋糕?我们没有走这些老路,而是尝试一条新途径:开源商业化。把关键技术全部开源出去,加足杠杆,对大化与用户的接触面积。现在,可能你不讲开源,都不好意思和VC张口要钱,但在当时的国内,在开源商业化这条路径上真正实践的团队,掰掰手指都能数的过来。
那段时间,像极了我在读博初期接触的ChinaSys。国内做开源的几个团队逐渐形成了小圈子,经常性的组织闭门讨论,分享采坑经验与阶段性成果。经过不断的实践、交流,再实践、再交流,咱们国内的团队开始能做出10Kstars的开源项目,逐渐占据了几个新兴领域的头部位置,由我们团队打造的Milvus项目便是其中之一。现在看来,开源的本质应该是一种商业化途径:在这种极致的竞争形式中占据社区、迭代速度、标准、资本集中度四重优势,持续构建这四点的良性循环,并持续构建商业化漏斗。
很幸运,我在博士期间见证了国内系统研究的早期摸索与起飞,在创业期间也见证了国内系统项目的前夜与黎明。
Towhee是Milvus的姊妹项目,聚焦解决非结构化数据的ETL问题。
AI,非结构化数据,搜索。这三个重点方向的交叉地上,系统软件的积累才刚刚拉开序幕。Milvus是第一个立足点,但要在运动中打赢这场仗,我们需要一个生态。Towhee是我们从一个系统迈向一个生态的第一步。这个项目做的不久,关注度也刚过1.5K stars。回头看,能分享的内容并不太多。但肯定的是,这一切又是一个新的开始。
“做有意义的系统工作。”
“要逐渐提升并行解决多个问题的能力。”
对于这两句话的挑战也还在路上。
有幸能加入咱们“大宇宙实验室”这个大家庭,有幸能与大家在“做系统”这条路上并肩摸索奋战!
徐飞、郭人通、易小萌、周知
穿过丛林
还没有评论,来说两句吧...