如何通过为 TensorFlow 贡献代码实现能力升级?阿里巴巴算法专家王思宇为大家介绍了他向 TensorFlow 社区提供代码的经验,快阅读下文学习,实现工程技术和领域影响力的双重进阶吧。
本文来自社区投稿与征集。
“做算法的人要熟悉算法框架源码吗?”
“算法工程师难道不应该会使用框架建模就可以了吗?”
“如何成为具有一定竞争力的算法工程师?”
我经常被不同的人问类似这样的问题。
坦白地说从我个人经验来看,身边算法做的不错的人对算法框架源码普遍熟悉,而且算法建模这件事在当前来看还并不能纯粹的与底层隔离,因为你会经常与计算性能,算法实现原理打交道。
当然,我也见过一些比较浮躁的从业者,认为算法工程师应该只做建模不碰源码,这些人一般都只是根据网上教程跑通了个 MNIST,ImageNet 的例子就认为自己可以胜任算法工程师的工作了,这种人其实不是想做算法,而是不想写代码而已。
算法门槛表面上在降低,可其实是不断升高的。
一方面,学术界算法创新竞争越来越激烈,主要表现在 AI 相关的顶会变多,accept 的 paper 也越来越多,多到根本看不过来,你现在所想到的模型创新,没准在另一家公司或者学校已经走到实验验证阶段了。
另一方面,性能优化和定制的功能开发等工程能力越来越重要。现在来看,市场上做想要算法的人非常多,但到面试通过的概率很低,这也侧面说明了竞争门槛其实是比较高的。
但这也是机会。如果你是做算法的,请趁此机会提升自己的工程能力和算法领域内的影响力。
How?其实很简单——为算法领域的知名开源软件贡献代码。因为我个人是 TensorFlow 的 contributor,所以我以 TensorFlow 为例为大家介绍。
第一步 Fork!
首先,进入 TensorFlow 的 GitHub 页面,可以看到如下页面。
红色框内表示当前 TensorFlow 这个开源项目已经有 1844 个人贡献过代码,想要加入这个行列的 coder 们请努力吧,这并没有想象中那么难。因为我们无法直接对开源项目 clone 开发,而只能在我们自己的仓库中开发,所以我们需要点击 Fork 按钮,将该项目 Fork 到自己的 GitHub 仓库名下,然后我们就可以在我们自己的仓库中看到这个项目。
第二步 Clone 自己的仓库
成功 Fork 之后,我们就可以将它 Clone 下来进行开发了。每次开发之前最好切出一个分支出来,避免直接在 master 上做修改。
第三步 与 Fork 之前的开源 master 建立联系
自从我们 Fork 新项目起,我们自己仓库的 master 将不再与开源 master 有任何联系,也就是说我们自己仓库的 master 代码将不再随着开源 master 自动更新。那么如何及时更新自己的仓库呢?这需要为我们 clone 下来的项目添加 upstream,即上游远程仓库。这非常简单,只需要一句命令即可搞定。我们需要将开源 master 的 git 地址复制下来然后添加到当前项目的,对于 TensorFlow 来说执行下面命令即可。
1git remote add upstream [email protected]:tensorflow/tensorflow.git
这样就与开源社区 master 建立起了联系,我们可以看到配置文件 .git/config 文件中确实添加了 upstream。
第四步 编写代码,提交到我们的仓库中
这一步比较常规,在本地切出开发分支,编写代码,提交到我们自己的仓库中。
第五步 生成 Pull Request
当我们将自己的 commit 提交到自己的 GitHub 仓库之后,就可以向 Fork 源 master 提交 Pull Request(简称 PR)申请了。首先进入自己的 GitHub 仓库页面,点击 New pull request 按钮。
点击后进入 Comparing 页面,我们选择需要往 Fork 源 merge 的分支,如下所示。由于我当前这个分支已经提交了 PR,但还处于 review 期间,所以生成的页面不太一样。
第六步 填写代码贡献说明
这是最后一步,需要在生成的页面中填写自己要贡献这段代码的原因,然后引入相关的 reviewer 进行讨论。不得不说,这一部分非常关键,因为大部分 reviewer 只会 review 代码规范,而这段代码的作用本身需要大家自己解释清楚。如果你曾经在该项目中贡献过代码,那么会显示 Contributor 字样。
自此,你成功的向开源社区提交了一个 PR,离成为 Contributor 走进了一步。
一般情况下,TensorFlow 的 reviewer 响应都是比较快的,而且他们对于技术讨论非常开放,也非常愿意社区积极贡献代码。Reviewer 会在你的 PR 上提出各种 Comments,在不断的代码 refine 之后,代码将最终成功 merge 到开源 master 中,从状态上看你的 PR 将会显示紫色的 Merged。如果到了这一步,那么恭喜你,成功成为了 TensorFlow 社区的 Contributor!
TensorFlow 社区 master 每天都会更新,所以建议每天做一次代码同步,非常简单,两行 git 命令就能搞定。
1git pull upstream master
2git push origin master
分别是将 upstream(也就是 Fork 源)代码更新到本地,向 origin(自己的仓库远端)更新代码。
因为你的贡献让 TensorFlow 更加完善,所以在之后的发布通告中会出现你的名字。下面的这段发布通告来自于 TensorFlow 1.13.0 RC2,其实你可以从描述中看到,在 1800+ 名 Contributor 中,绝大部分是 Google 内部的人,所以 Google 外部的 Contributor 非常少。
其实非常多。TensorFlow 一大特点是通用性,希望能够在各种场景下均能够变得成熟。但是这个目的工程量浩大,不免存在 Bug,设计不完善,性能不理想,功能不全面等情况。其实在使用 TensorFlow 建模时就会遇到他们,而且概率还真不小。当然你可以遇到问题选择绕开它们,但这可能也意味着你错失了一个提 PR 的机会。提 PR 的前提是你必须对源码有所了解,所以算法工程师们在读 paper 读累了的时候不妨换换思路,每天看一点 TensorFlow 源码多提升一些工程素养。
TensorFlow 社区值得关注的东西
TensorFlow 是 Google 重要的算法军火库,Google 围绕着 TensorFlow 本身还做了其他子项目,他们也非常重要。另外,也可以加入讨论组。
TensorFlow 生态中的其他子项目
TensorFlow 生态中子项目相当丰富,有前端 TensorBoard,有易用性框架 Estimator 等等。这些子项目也同样需要社区贡献力量。
TensorFlow 2.0 的标准制定项目 —— Community
Community 子项目其实就是 TensorFlow 的 RFC 文档,它是 TensorFlow 2.0 的标准,里面含有一些模块和接口的设计。为什么要关注 RFC 文档?这是因为 TensorFlow 的发展比较快,经常出现某些模块被弃用,某些新模块将要大力发展的情况。这些信息对于开发者非常重要,如果你想共享一段代码,但它与社区的发展标准背道而驰,那么将是无用功,所以 RFC 文档对于避免虚工是非常有用的。但一个标准的提出也需要经过社区的审核和讨论,所以如果有自己的想法,可以在 Community 中提出自己的 comments,引入更多的人参与讨论。
扩展 —— 与 TensorFlow 有关的项目
从 TensorFlow 项目这一个点出发,我们可以不怎么费力气地学习到更多的开源项目,而且 TensorFlow 架构和源码设计足够复杂,这使得我们在看其他相关项目时变得相对轻松。比如当你对 TensorFlow 使用单机多卡 GPU 通信感兴趣时,可以参考 NCCL。当你对多机分布式感兴趣时,你或许可以看看 Uber 开源的 Horovod。当你想要研究不同框架之间的差异时,你也许可以看看 Pytorch,caffe2 和 MXNet。这种辐射式的积累会让我们学习更多的软件设计哲学。
由于本人也是算法工程师,工作中不仅是 TensorFlow 的用户,也在自己所任职的公司参与 TensorFlow 的定制开发与性能优化。
从我个人角度来看,算法工程师这个职位不得不说是含有大量水分的,一方面真正懂算法能够在 AI 顶会发一些高质量 paper 的人占比并不高,另一方面,在算法工程上理解较深的人也并不多,而在算法和工程两方面都比较强的人就更少了。现在属于算法领域较热的时段,这方面的油水,薪资竞争力和需求量都很大,所以市场上存在很多想要进入这个领域的人,这是好事。
但是如果一个人自己跑几个模型例子就声称自己可以做算法并且十分反感写代码的话,那他在算法领域也不会有很好的发展。
除非,你是一个算法造诣非常高的天才并且能够胜任算法科学家的人。
否则,请不要欺骗自己,认真培养你的算法能力和工程能力,毕竟你的目标还是一个合格的算法工程师。
本文作者王思宇,阿里巴巴算法专家,从事深度学习算法平台建设,TensorFlow 分布式架构设计与大规模分布式性能优化工作,开源 TensorFlow 项目 contributor。
想了解更多大神的经验分享?扫码关注TensorFlow官方微信公众号( TensorFlow_official ),产品更新、课程教学、技术实践、应用实例等精彩内容一网打尽!