算法工程師想進一步提高競爭力?向TensorFlow開源社區貢獻你的代碼吧


算法工程師為什么也要向社區貢獻代碼?

[作者:DeepLearningStack,阿里巴巴算法工程師,開源TensorFlow Contributor]

歡迎大家關注我的公眾號,“互聯網西門二少”,我將繼續輸出我的技術干貨~

“做算法的人要熟悉算法框架源碼嗎?算法工程師難道不應該會使用框架建模就可以了嗎?如何成為具有一定競爭力的算法工程師?”...

我經常被不同的人問類似這樣的問題。坦白地說從我個人經驗來看,身邊算法做的不錯的人對算法框架源碼普遍熟悉,而且算法建模這件事在當前來看還並不能純粹的與底層隔離,因為你會經常與計算性能,算法實現原理打交道。當然,我也見過一些比較浮躁的從業者,認為算法工程師應該只做建模不碰源碼,這些人一般都只是根據網上教程跑通了個MNIST,ImageNet的例子就認為自己可以勝任算法工程師的工作了,這種人其實不是想做算法,而是不想寫代碼而已。算法門檻表面上在降低,可其實是不斷升高的。一方面,學術界算法創新競爭越來越激烈,主要表現在AI相關的頂會變多,accept的paper也越來越多,多到根本看不過來,你現在所想到的模型創新,沒准在另一家公司或者學校已經走到實驗驗證階段了;另一方面,性能優化和定制的功能開發等工程能力越來越重要。現在來看,市場上做想要算法的人非常多,但到面試通過的概率很低,這也側面說明了競爭門檻其實是比較高的。

但這也是機會。如果你是做算法的,請趁此機會提升自己的工程能力和算法領域內的影響力。How?其實很簡單——為算法領域的知名開源軟件貢獻代碼。因為我個人是TensorFlow的contributor,所以我以TensorFlow為例為大家介紹。

向TensorFlow社區貢獻代碼的步驟

第一步 Fork!

首先,進入TensorFlow的GitHub頁面,地址如下:https://github.com/tensorflow/tensorflow ,可以看到如下頁面。

紅色框內表示當前TensorFlow這個開源項目已經有1844個人貢獻過代碼,想要加入這個行列的coder們請努力吧,這並沒有想象中那么難。因為我們無法直接對開源項目clone開發,而只能在我們自己的倉庫中開發,所以我們需要點擊Fork按鈕,將該項目Fork到自己的GitHub倉庫名下,然后我們就可以在我們自己的倉庫中看到這個項目。

第二步 Clone自己的倉庫

成功Fork之后,我們就可以將它Clone下來進行開發了。每次開發之前最好切出一個分支出來,避免直接在master上做修改。

第三步 與Fork之前的開源master建立聯系

自從我們Fork新項目起,我們自己倉庫的master將不再與開源master有任何聯系,也就是說我們自己倉庫的master代碼將不再隨着開源master自動更新。那么如何及時更新自己的倉庫呢?這需要為我們clone下來的項目添加upstream,即上游遠程倉庫。這非常簡單,只需要一句命令即可搞定。我們需要將開源master的git地址復制下來然后添加到當前項目的,對於TensorFlow來說執行下面命令即可。

git remote add upstream git@github.com: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走進了一步。

關於PR的狀態跟蹤

一般情況下,TensorFlow的reviewer響應都是比較快的,而且他們對於技術討論非常開放,也非常願意社區積極貢獻代碼。Reviewer會在你的PR上提出各種Comments,在不斷的代碼refine之后,代碼將最終成功merge到開源master中,從狀態上看你的PR將會顯示紫色的Merged。如果到了這一步,那么恭喜你,成功成為了TensorFlow社區的Contributor!

如何與開源master同步

TensorFlow社區master每天都會更新,所以建議每天做一次代碼同步,非常簡單,兩行git命令就能搞定。

git pull upstream master
git push origin master

分別是將upstream(也就是Fork源)代碼更新到本地,向origin(自己的倉庫遠端)更新代碼。

TensorFlow發布通告中會有你的名字

因為你的貢獻讓TensorFlow更加完善,所以在之后的發布通告中會出現你的名字。下面的這段發布通告來自於TensorFlow 1.13.0 RC2,其實你可以從描述中看到,在1800+名Contributor中,絕大部分是Google內部的人,所以Google外部的Contributor非常少。

TensorFlow有那么多待完善的功能嗎?怎么發現它們?

其實非常多。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的人占比並不高,另一方面,在算法工程上理解較深的人也並不多,而在算法和工程兩方面都比較強的人就更少了。現在屬於算法領域較熱的時段,這方面的油水,薪資競爭力和需求量都很大,所以市場上存在很多想要進入這個領域的人,這是好事。但是如果一個人自己跑幾個模型例子就聲稱自己可以做算法並且十分反感寫代碼的話,那他在算法領域也不會有很好的發展。除非,你是一個算法造詣非常高的天才並且能夠勝任算法科學家的人。否則,請不要欺騙自己,認真培養你的算法能力工程能力,畢竟你的目標還是一個合格的算法工程師。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM