1. 程式人生 > 實用技巧 >演算法工程師想進一步提高競爭力?向TensorFlow開源社群貢獻你的程式碼吧

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

演算法工程師想進一步提高競爭力?向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 [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走進了一步。

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

部落格園——DeepLearningStack,未經授權嚴禁轉載