大家好,我是不会写代码却准备all in云原生的纯序员——Chunel Feng,至于为什么要选择云原生,主要是因为我根本不懂什么叫做AI啊。
最近,趁着五一假期的期间,我参与了一个相似搜索相关的研究项目,同时也算是一个CGraph的实际落地项目。正好是去年这个时间吧,也是我现在在的这家咖啡厅,我开始创建CGraph这个项目,并且落了第一行代码,到现在也正好算是一周年了。想从起因、立项、现状和规划几个方面,来review一下这一年里这个项目的情况,和我的一些感悟和成长。
首先,还是照例先上链接:CGraph源码地址
起因 |
去年这时,我一个朋友参加面试,面试官让他写一个节点之间解依赖执行的题目。后来他找到我聊这个问题,问如果是我,会怎么写。我当时也没很明确的思路,只是原来写过一点图查询算法,知道可以用二维矩阵或者邻接表来实现。
那个时候,我在往caiss的框架里添加新的算法的时候,也遇到了一些问题,觉得随便加入一些东西,改动量就很大,还要改原先的一些逻辑,接口也不够通用。再联想到平日上(mo)班(yu)写逻辑的时候,都是把一些逻辑给算子化,注册到一个dag中按序执行。我就在想,为啥不自己写个dag框架玩捏。
这样的话,不仅是我,今后别人想做算法实验或添加逻辑的时候,也会方便许多。再进一步,如果做的好的话,兴许能 沉淀出一套方法论,打出一套组合拳捏,形成一条护城河呢!!!
立项 |
之前也聊过,我做事很少做规划的,而且比较喜欢和欣赏那种一招吃遍天、且极具美感的方法。感觉dag调度可以一劳永逸的解决我现阶段遇到的问题,那就直接开始了。
这就是当时的截图了,整个项目只有一句说明,一行代码也没有。要做成啥样,有哪些方法或者可能,我心里真的一点概念都没有——像极了现在融资之前先画个饼的互联网人。
后来摸排资料,总结几种办法。但考虑到要坚持纯手写、不调用三方包,基本也就确定了现在的 统一实例+邻接表+拓扑排序+分支合并+分治+静态解图 的大体思路。而就是这一套方法,一直沿用到现在,帮助我实现了很多功能,解决了很多问题。
迭代 |
迭代的过程,也就是这一年的commit的记录,大家也可以查一下ChangeLog.md文件。具体的实现思路,就不在这里说了。我在做的过程中,基本每一处功能点都落文章了,有兴趣的话,大家可以去项目中查看。
就说说做的时候,自己其实很多思路都来自于自己的日常工作。我经常会想,我搬砖的时候用的这些框架,如果让我重写,我会如何实现;手头组织的这些逻辑,怎样才能更好的被支持。然后就这样一路的做下来,就有了现在的样子。
针对单进程调度层面,我们提供了并发编程、切面编程、统一调度、外部注入的思路,并且用了很大的精力,来实现调度优化。当前的现状,基本是我个人的能力极限,也很期待大家的意见和指教。
至于架构层面,比如:分布式调度、全局一致性、算力调度、灾备快照等逻辑,我自己的确是没这个能力了。如果今后要做的话,会考虑创建关联项目,然后引入三方库吧,也可能今后忽然掌握了某块知识,回头来自己实现一遍。
无论如何,我一直坚持主项目中仅用原生cpp实现,这样做有个非常明显的好处,就是不用考虑跨平台兼容,使用起来也基本不会有任何环境问题,非常方便使用者入手基本功能,跑起来HelloCGraph
工程。
出圈 |
为了扩展一些影响力,让更多的人看到和用起来这个项目,我一边写代码,一边写文章。穿插着还在我们自己的技术交流群里,开了几次线上直播,介绍实现的原理和现状,搜集意见、方向和规划。
同时,还投递并命中了几个业界比较知名的期刊和榜单,增加了曝光度和影响力。在这期间,还有几个朋友一起加入了共建的过程。感谢的话我们就不再说了,都在图里了,哈哈。
最牛逼的是,我还发挥了自己沉寂了多年的文学天赋,给CGraph写了主题曲——《听码农的话》,简直是码坛方文山了。在没能做到技术上天和产品落地的条件下,实现了项目出圈和文体两开花,也算是在当下极度内卷的环境里,开辟了一条新的赛道吧。
在这里,我们要特别说一下最近在做的事情——GraphANNS。我们打算通过【拆分打散+定向组合】原有图查询算法的思路(卧槽,map-reduce?哈哈),实现一些ANNS算法的创新研究和工程沉淀。
项目刚刚开始,今后也还有大量的适配、编码、实验和优化工作。也提前预祝今后可以在这个领域取得一些小小的成绩。也希望CGraph要配得上、帮得到、撑得住、玩得转高大上的AI领域研究。
看到这里,对这个项目还一脸懵逼的朋友,我推荐看看这个博客:程序员王同学 CSDN,相信看完之后,你就更懵逼了——毕竟是ANNS领域的资深专业人士写的,哈哈哈哈。
规划 |
如果你问我,现在市面上,有很多类似调度的框架,CGraph跟它们比有什么优势?我想说的是,我们功能少,bug多,没提供啥通用的算法,不支持异构计算,也没有网络或者文件功能。但就是因为这样,所有东西都要你自己做,你才能有所成长啊啊哈哈哈哈。
当然了,作为框架侧,我们也会坚持持续演进和支持。说几个暂时能想到的方向吧:设计和完善插件系统,优化dag调度逻辑,提供流式处理的方法,加入协程调度逻辑 ,还有就是我们会坚持【碰瓷名项目】活动,在
纯序员和他的开发者小伙伴们 这个github group中,给大家提供一些开箱即用的CGraph结合其他项目的功能算子,也欢迎大家加入,提提意见和贡献力量。更欢迎大家可以把自己的项目或算法包提供出来,一起共(bai)建(piao)和赋(guang)能(gao)。
看,我们小组已经有四个人了,而且分工明确,各有所长。特别说明一下,本来还请了一位百度的nlp研究员啊,没加进来啊,没进来的原因居然是github账号弄丢了,呜呜呜,重大损失啊。还有一位菜鸟的工程师啊,约好下班回家就加入的,可能现在还没有下班,哈哈哈哈。
总结 |
短短一年的时间吧,自己大部分的业余时间又都花在了开源项目(喝咖啡)上。相比两年前刚写开源的时候,感觉到自己的设计思路、问题排查和编程能力方面,都有了很大的提升。结识了更多的朋友,得到了更多大佬的指导和帮助,在这里向大家问好,给大家点赞。
我自己也有意识的去尝试往一些相关或者交叉领域看一看,寻求出圈和合作的机会,为某一天的可能发生的脱变,积蓄一点能量。我们自己创建的技术交流群,在保持活跃的同时,技术话题的密度也肉眼可见增加。从诗词歌赋和人生哲学,聊到人工智能和云原生。
嗯,自己在日常工作中,也要加把油了,要争取做到“聊以致用”啊。对了,最后顺便提一句,我可是有正儿八经工作的程序员哦,哈哈哈!!!
[2022.05.03 by Chunel]
推荐阅读
- 纯序员给你介绍图化框架的简单实现——执行逻辑
- 纯序员给你介绍图化框架的简单实现——循环逻辑
- 纯序员给你介绍图化框架的简单实现——参数传递
- 纯序员给你介绍图化框架的简单实现——条件判断
- 纯序员给你介绍图化框架的简单实现——面向切面
- 纯序员给你介绍图化框架的简单实现——函数注入
- 纯序员给你介绍图化框架的简单实现——线程池优化(一)
- 纯序员给你介绍图化框架的简单实现——线程池优化(二)
- 纯序员给你介绍图化框架的简单实现——线程池优化(三)
- 纯序员给你介绍图化框架的简单实现——线程池优化(四)
- 纯序员给你介绍图化框架的简单实现——线程池优化(五)
- 纯序员给你介绍图化框架的简单实现——距离计算
- CGraph 主打歌——《听码农的话》
个人信息
微信: ChunelFeng
邮箱: chunel@foxmail.com
个人网站:www.chunel.cn
github地址: https://github.com/ChunelFeng