今年夏天, Milvus 社区与 6 位开源后浪的故事

今夏, Milvus 社区诞生了 6 位后浪贡献者。

这 6 位贡献者:赖伟峰、陈萌、张锦程、黄俊鹏、吴政达与冯吕,他们都还是正在就读本科与研究所的学生。

他们与 Milvus 的故事要从今年中科院软件所和华为 openEuler 项目共同举办的“开源软件供应链点亮计划——暑期 2020” 说起。

  故事的开始

在这 6 位学生成为贡献者的过程中,我们不能不提到那些作为学生指路明灯的社区导师们。

在参与活动前,Milvus 社区负责辅导学生的导师们正聚在一起讨论任务的设计。由于 Milvus 项目相当年轻,这也是许多导师第一次参加类似的活动,大家难免感到些许的忐忑。

“我们的项目对许多有好几年工作经验的程序员都不见得做的来,何况他们都还是学生,会不会太为难他们了?”

“会不会太硬核了就没有人报名了?”

”万一学生坚持不下来,半路就放弃了怎么办?“

最多的担心在于害怕同学们觉得 Milvus 给出的任务难度太高,不敢报名或是报名后无法顺利完成任务。Milvus 项目的困难度在于学生必须要有非常好的阅读代码与写出工程级代码的能力,而这些都是一般学校项目中无法实践到的。但我们一番考虑后,还是决定坚持开放我们认为对同学与社区都有实质意义的项目。

很幸运的是,最终我们还是吸引了一群优秀的学生参加到我们的项目中,并在 7 月- 9 月 3 个月的时间里,Milvus 社区诞生了 6 位开源新星。大部分的学生都是第一次参加到大型的生产项目中,在这个过程中发现自己的不足,也提升了工程实践上的能力,提高了读代码和分析代码的能力。其中也有同学在与社区互动的同时了解了开源社区互助的精神,并祈愿自己能在未来也继续发挥这种精神来帮助更多的人。

这 6 位同学们开发的项目中有些功能已经发布上线,为众多的社区用户所用;其他则会在未来的版本中陆续与大家见面。在后面的文章中我们将详细介绍这 6 个项目的具体细节和学生/导师们对本次开源活动的一些体会:

  项目 1: S3 存储支持

学生:赖伟峰 (西安邮电大学软件工程大四毕业生)

导师:蔡宇东                      

项目描述:S3 是 Simple Storage Service 的缩写,即简单存储服务。它是由亚马逊提出的一套云存储服务接口,现在几乎所有的云服务都兼容 S3。本项目目标是实现一个兼容 S3 存储的 Codec,使得 Milvus 能够将结构化数据和非结构化数据存入兼容 S3 的云端存储,如 MinIO。

学生心得:作为一名热爱参与开源的学生,我很荣幸有机会能被 Milvus 社区选中并负责“S3存储支持”的研发工作。在为 Milvus 贡献代码的过程中我受益匪浅。首先,通过阅读设计文档和源码,我学习到了很多前沿的工程技术。比如,在考虑鲁棒性的情况下如何设计出兼容多种存储模式的存储模块,以及如何设计一个向量搜索引擎的数据落盘方案。其次,我明白了一个开源项目的良好发展离不开互帮互助的开源精神。Milvus 社区有许多热心的工程师和开源爱好者,在我遇到难以解决的问题并向社区的讨论群求助时,他们总能迅速分析并告诉我问题的根源,使我能高效地解决问题。我希望自己能传递这样的开源精神,无私帮助其他热爱开源的人们。

导师心得:第一次参加这样的开源任务,也是第一次以 remote 的方式带学生,体会和感想颇多。赖伟峰作为一名在校学生,没有接触过生产级别的软件,写代码的经验还是有些欠缺的。但是他很勤奋好学,积极主动,乐于发问。这样的学生,所有的导师都喜欢。教师节的时候,还收到来自他的问候,感觉非常开心。也希望赖伟峰以后能为 Milvus 开源社区做出更多贡献!

  项目 2: HDFS 储存支持

学生:陈萌 (北邮计算机大二生)

导师:余昆                
项目描述:HDFS 是基于流数据模式访问和处理超大文件的需求而开发的分布式文件系统,是分布式计算中数据存储管理的基础,为超大数据集(Large Data Set)的应用处理带来了很多便利。本项目目标是实现一个基于 HDFS 存储格式的 Codec,使得 Milvus 能够使用 HDFS 格式来存储结构化数据和非结构化数据。

学生心得:了解 Milvus 社区是漫长的,也是短暂的。这次活动带给了我很多在学校里学不到的东西,遭遇了困难也成长了。希望能一直学习、进步下去!感谢余昆导师,感谢 Milvus社区!

导师心得:这次开源项目是一个比较有意义也比较有挑战性的项目,让 Milvus 支持 HDFS 存储,HDFS 是 Hadoop 开源的分布式文件系统,要想对分布式系统有所了解,HDFS 是必备的知识技能之一。这次项目过程中,陈萌同学暑期自己学习 HDFS 相关知识,以及 Milvus 底层文件存储相关的技术,然后实现了将 HDFS 接入到 Milvus 中。过程中遇到不少麻烦,但是通过自己的钻研以及及时沟通,成功完成这个项目。
给开源项目贡献代码是一件非常有意义的事情,不仅可以提升自己的技术能力,还给社区带来了贡献,所以希望以后有更多这样的活动,让更多的学生或者是程序员参与到开源社区中来。

  项目 3: GPU 显存使用优化

学生:张锦程 (上海交大电子系研一生)

导师:王翔宇
项目描述:FAISS IVF GPU 算法运行时所需要的显存与 NQ/nprobe 成正比,但 GPU 上的显存有限,因此当 NQ/nprobe 很大时,会出现 Out Of Memory。本项目的目的是优化该算法,减小 GPU 显存使用量。    

学生心得:在本次开源活动中,我参与了“GPU 显存使用优化”项目,首先很感谢 Milvus 社区为我提供了这个机会,以及项目导师在整个过程中给予我的建议和帮助。在这次活动中,我最大的收获是对大型项目代码的阅读以及调试有了更多的经验。希望未来还能参与到开源项目的贡献中,也祝愿 Milvus 社区发展得越来越好!

导师心得:开源任务结束了,虽然在过程中这位同学遇到了不少的问题,但经过不懈的努力最后还是顺利地完成了。给开源项目贡献代码是一件非常有挑战同时也能带来很大成就感的事情,这需要开发者强大的个人能力以及与社区的紧密协作。希望能有更多的开发者对 Milvus 项目感兴趣,加入 Milvus 社区,为 Milvus 社区贡献自己的一份力量!

  项目 4: 新聚类算法实现


学生:黄俊鹏 (北航计算机研一生)

导师:李盛俊
项目描述:Milvus 是一款开源的特征向量搜索引擎。聚类是一种常见的数据分类方法,在索引中有着重要的应用。Milvus 目前使用 k-means 来实现聚类。这个任务将为它添加更多的聚类算法并添加相应的选择开关。

学生心得:前面两个的算法改进的地方主要是针对初始样本的选择,改进的地方比较简单,也可以比较清楚知道编写函数的输入和输出,这部分的代码编写也比较简单,没有遇到太多的问题,主要还是研究 Kmeans++,KmeansII  论文上面的算法描述步骤。Bisecting k-means 的实现就比较复杂,在数据结构上我一开始选择树状数组去存储每个节点二分之后质心和数据索引,后面计算发现这样设置反而会导致存储空间指数级别增加。所以后面采用了结构体作为数据结构存储每个聚类族的参数,然后后面改进聚类的划分效果的时候也可以通过增加左右孩子指针的方式,通过二叉树的形式把这个数据结构保存下来。其次,为了方便计算,我还采用了一个优先队列方便每次输出 SSE 最大的节点,优化以前的遍历找最大的思想。

最后就是这个算法实现过程中遇到一些语法上的错误,这部分代码 debug 比较耗费时间,最后的问题发现是项目是用 C11 标准编译的,而我可能有些地方采样了 C11 以上的标准的写法,导致段错误发生,修改语法后解决,还有就是一些指针数组越界访问的问题。

导师心得:黄俊鹏同学参与的"新聚类算法实现"是一个比较有挑战的项目,它不仅要求学生理解论文算法,而且要求学生高效地实现出来。很高兴黄俊鹏同学成功地完成了 3 个算法的研究与实现,并成为 Milvus 的贡献者之一。
黄俊鹏同学在整个项目中的投入和成长都非常大,其中 kmeans++ 前后优化过 4 个版本,而 Bisecting k-means 更是最后一天还在修复 bug。这些都体现出黄俊鹏同学对整个项目的高度负责和他对自身的严格要求。我们非常高兴有这样优秀的学生参与到我们的开源项目来。

对学生的寄语:动态规划、二分查找,这些基础算法在很多人眼里平时根本用不到。不过在这个项目里,我们不仅有使用,而且还要结合进并行计算里。卓越的工程师和普通程序员最大的区别是有分析有设计,并且有能力写出高效的程序。希望黄俊鹏同学在今后的学习中不断锤炼自己,最终成为一名优秀的人才。

  项目 5:FLAT 索引支持运行时指定距离类型

学生:吴政达 (深圳大学物联网大二生)

导师:李盛俊
项目描述:因 Milvus 目前尚不支持一份数据的多种距离计算, 从而导致了某些场景的使用不便。该项目是为了实现 Flat 索引支持计算时再指定距离类型的功能。本项目的产出需求包括:(1) 修改 Query 接口添加可选参数 metric_type, 完成端到端的功能实现。(2) 添加单元测试保证代码正确性。(3) 修改用户手册。    

学生心得:前期开始对项目代码的整体结构理解不是很清楚,经过导师的指导,在这方面得到了较好的解决。对 git 的使用不够熟练,在导师的指导和学习下,在这方面也得到了较好的解决。本次任务是我第一次参与开源项目的开发,通过本次开发,知道了目前自己在知识和能力上欠缺的部分, 加强了我在工程实践上的能力,提高了我读代码和分析代码的能力。在本次任务开发中,我遇到的问题还是挺多的,包括对 Milvus 代码的不熟悉和一些知识的欠缺,我遇到的问题可能是参与本次活动中较多的一个,感谢李盛俊老师对我耐心的指导和对相关问题的解答。

导师心得:吴政达同学参与的项目“Flat 索引支持运行时指定距离类型”是很多用户非常期待的功能之一。很高兴吴政达同学利用今年暑假加入我们项目,并顺利完成该功能的开发。随着九月 Milvus-0.10.3 的发布,该功能已经正式与用户见面了。非常感谢吴政达同学为我们开源社区所做的贡献。开发期间,吴政达同学通过不断学习,逐步了解项目的各个模块,积极提出修改意见并最终实现了功能。吴政达同学在项目中始终保持积极热情的态度,努力解决各种困难,不断提升自己,给大家留下非常深刻的印象。

对吴政达同学的寄语:我刚参加工作时,第一次打开一个庞大项目也有过不知所措的经历。希望你也能在今后的学习工作中,不畏艰难,不断成长,让阅读代码渐渐成为一种能力。

  项目 6: 为 Milvus 提供更多的索引类型

学生:冯吕 (中科院计算机研一生)

导师:李成明
项目描述:Milvus 目前已经实现了基于空间分类的、基于图的等多种索引类型。NGT 是一个开源的 ANN 库,其性能在 ann-benchmark 中有不俗的表现,这个项目将为 Milvus 引擎接入 NGT 库并支持 NGT.PANNG 和 NGT.ONNG 两种索引类型。               

学生心得:在过去这三个月的时间里,有幸参与到了 Milvus 项目的开发中,从而了解了特征向量相似度检索这一领域,并“认识”了 Milvus 这一优秀的开源项目。在项目开发过程中,李成明老师给予了我许多宝贵的指导和建议,对我的技术提升以及今后的“成长”有很大的帮助。最后,祝愿 Milvus 越来越好!

导师心得:冯吕同学参加的项目是“为 Milvus 添加 NGT 索引库“。NGT 索引库是目前最优秀的 ANN 库之一,其中的 PANNG 和 ONNG 图索引在 ann-benchmark 中不同的数据集上都有着优异的表现,这个项目的目标就是将这两个图索引引入到 Milvus 中。项目过程中,从前期的索引原理论文的阅读,到中期的 NGT 源码和 Milvus 索引框架的源码阅读理解,再到后期的代码修改、整合、测试,冯吕同学基本上都是独立完成的,有很强的自学习能力。感谢冯吕同学为 Milvus 开源社区做出的贡献,期待新索引早日上线回馈广大社区用户。

  To be continued....

这次的活动对同学和对导师来说都是意义非凡的,不管同学们未来是否继续为 Milvus 社区贡献,希望这次的活动能为他们成为职业程序员铺路与点亮他们对开源的热情。

星星之火,可以燎原。夏天或许过去了,但你与 Milvus 社区的故事仍未完待续,

欢迎每个希望为 Milvus 项目贡献的伙伴们加入我们,与我们谱写更多的故事!

你可以从这里开始:

https://github.com/milvus-io/milvus/issues

  欢迎加入 Milvus 社区

github.com/milvus-io/milvus    源码

milvus.io    官网

zhihu.com/org/zilliz-11/columns    知乎

zilliz.blog.csdn.net    CSDN 博客

space.bilibili.com/478166626    Bilibili