背景
GitHub,国际知名社交网站,汇集了全球众多开源项目,卡脖子留下的一口新鲜空气。细心的人可能注意到,我公众号logo就借鉴了github经典配色
如何谈笑风生地做一个开源项目呢?可以做做资料的收集,也就是github惯用的awesome系列。awesome一个研究方向,awesome面试经验,甚至还可以awesome的awesome。
曾做过一个深度学习时序预测工具,也有100star。据我微薄的经验,分享一点开源机器学习的经验。这篇简单的文章,也算多年总结。对时序有兴趣的家人们,也欢迎尝试和参与项目。
github.com/LongxingTan/Time-series-prediction
一: 明确需求、愿景、商业模式
第一步看似没有硬核知识,却最不可小觑。
需求 Requirements
选择自己擅长或喜欢的方向,或有热度的风口方向。好的项目不会被埋没,但流行与否取决于这个方向池子有多大,大致决定了其star上限。
我选择时序是因为18年学编程时做的第一个分析就是时序,之后又一直惯用TensorFlow。所以习惯性地,把二者掺在一起做成撒尿牛丸T(ensor)F(low) T(ime)S(eries)
不曾想,风向很快转了,PyTorch突起,涌现了很多PyTorch时序库,少有人愿意再做Tensorflow,但上限也低。tf2.0后,写法完全变了,不得不重构一版。起了个大早,赶了个晚集。
总之,针对需求,结合自身,参考热点,量力而行,充分发挥先发优势。
愿景 Vision
我最初的设想是功利的,转码简历上留了github地址,好歹写个像样的项目。后来参加比赛,我的愿景变成了全球最好的比赛时序预测工具。正是这个愿景激励着我参加了几场比赛,希望之后能抽出时间在那些“全球”、“世界”开头的比赛里勇夺Top。时间允许的话,更应该像transformers那样支持tf\torch\jax的全面工具。
商业模式 Business
开源的另一大问题是,如何可持续?一些面向KPI开源的大厂,几个commit后已完成KPI就不再维护了。反观一些个人大佬,可以借开源养活自己,文档收费、培训收费、咨询收费等。市场经济里,一定要牢记:
我收到过一个外国小伙的咨询,希望和我合作预测博彩。给劝退了,要真能预测,我早就不在工地起早贪黑了。也曾试图在项目里附上了微信打赏码,但人微言轻,至今没有一分钱赞助。
后来不得不改变商业模式,打比赛。天池气象比赛曾有机会收手,但最后一刻被小号绝杀,奖金立减三万,摩托变单车。只好继续上路,“以赛养包”。
当然,明确开源许可证,避免潜在法律风险。
二: 情报调研
根据需求进行情报调研。零基础,即使有了方向,往往不知从何入手。最简单的当然是临摹别人,一是学习其写法和规范,二是调研其优势和不足,三是确认这个方向未来是否值得继续,是否还有好果子摘。
调研中我找了另一个时序包pytorch-forecasting,学到了很多开源规范性的东西。还去领英加了作者,商业吹嘘一波。时序预测岂止没有免费午餐,付费都不一定能吃上。我本意是多经历比赛的洗礼,在支持模型方面更独到。
明确了需求,收集了情报之后。完成设计文档,设计时尽量保证可扩展、可维护。
三: 明确工程规范
经历所限,我既没有科班经历,也没有软件开发的流程洗礼,很虚。起初,仓库一两百star的时候,根本不是一个包,而是一个demo集合。之后,发现一个完备的Python机器学习包,应该包括测试、文档、CI/CD、示例、构建打包等环节,一点点加了上去。
之后补上的包括代码规范,测试覆盖率,安全扫描等。走了很多弯路之后,发现有一本书已经介绍的很全面了,《publishing python packages》。
四: 细化需求
继续完善设计文档,细化需求。比如最基础的,支持哪个或哪些模型?
设计时,涉及到边界问题,必须清晰。这是团队合作的基础,即使是单人项目,何尝不是在和昨天的自己合作?
以我的为例,支持单变量、多变量、单步、多步,后续是否支持分类、异常检测等任务。
实现不同任务的深度学习方法(单变量、多变量、单步、多步、预测、回归、异常)
实现不同模型(rnn\cnn\transformer, deepar, informer等后台模型)
方便的配置,具备较规范的文档、测试、使用样例等
五:写代码
有了设计文档、工程规范、细化需求之后,就差一个写代码的了。
短期milestone:一个完整的包,包括设计文档,注释、可安装包、colab实例等,复现几个比赛的top solution,争取复现出相对不错的成绩。
文档:我选择的是Sphinx
测试:unittest或Pytest,注重测试用例和测试覆盖率
其实,很多开源项目的代码质量相对是好的,是值得学习的。
六: 营销推广
好的质量很重要,但好的营销更重要。推广之前,需要项目已达到较高的完成度,否则又会走我的弯路。甚至制定开发计划时,也配套一个推广计划。
一个好的项目要有个logo吧,我花5分钟设计的
一个方便民族主义营销的项目,得有个古风名字吧,比如伏羲、八戒、封神榜、山海经之类。配上一句“不转不是中国人”的宣传,想不火都难。我非常喜欢的辛弃疾的一句词:“青山遮不住,毕竟东流去。江晚正愁余,山深闻鹧鸪”。所以tfts的中文名为“东流”,寓意着时间序列问题犹如滔滔江水,滚滚东流,多少离谱预测,都付笑谈中;又犹如黄河泛滥,一发而不可收拾。
- 被动推广:项目初期,有幸得到爱可可老师推广,一天涨了几十star,首次过百,我仍记得那天的兴奋,大佬青睐真是事半功倍。前面介绍的Pytorch-forecasting,接受过TheSequence专访,之后没几天star远远超过我,一骑绝尘,什么是国际巨星啊
- 主动推广:可以自己去社区多写一些示例文章。某厂,star送开发者礼物的事还是要避免。由于机器学习的独特,文章能推广,比赛也能推广。不过激烈赛事,不是我们零基础混的。还可以写一些论文到opensource,arxiv等推广。
- 另外,建立微信、slack、discord社群也是不错的运营方式,可以更真实贴近用户需求。路子可以野一点,为了这碗醋,多包几顿饺子。我甚至想过录一些时序视频来宣传,反过来我这篇文章何尝不是tfts的另类推广呢。
七: 维护更新
很惭愧,因为工作性质,我经常整年断更。除了代码更新,我觉得最起码的要求,是认真回答issue里提的问题,之前很多同事经常重复的一句话:没有愚蠢的问题,只有愚蠢的答案。我一开始,看到很基础的问题不愿意花时间回应,这是不对的;然后就是积极bugfix。可虑用github自带的project功能进行项目规划与管理,也就是认真用项目管理和产品的角度对待自己的开源。为开源世界做一点微小的工作,使得人人有丹炼,人人有源开。