TensorFlow技術(shù)主管詳解:谷歌怎樣管理開源軟件(谷歌的tensorflow)
唐旭 編譯自 O’reilly
量子位 出品 | 公眾號(hào) QbitAI
TensorFlow開源一年半以來,在GitHub上已經(jīng)有了820位貢獻(xiàn)者,close了5192條issue,還有1033條開放著。
同時(shí),如果所有TensorFlow團(tuán)隊(duì)成員都在GitHub上,而且屬于這個(gè)組織的話,它在Google內(nèi)部還有著一支75人的團(tuán)隊(duì)。
一支人數(shù)不算少的全職團(tuán)隊(duì),是如何和數(shù)量眾多的開源貢獻(xiàn)者共同改進(jìn)TensorFlow的呢?團(tuán)隊(duì)的技術(shù)主管Pete Warden帶著深深的怨念,在O’reilly網(wǎng)站上發(fā)表文章,講述了他們是如何維護(hù)TensorFlow開源社區(qū)的。
以下內(nèi)容編譯自Warden的文章:
開源可不只是把代碼往GitHub上一扔,然后等著別人去用它就完事了。道理我都懂,可直到在谷歌成為TensorFlow團(tuán)隊(duì)的一員,我才真正開了眼:要圍繞一個(gè)軟件打造出一個(gè)社區(qū),要考慮的因素實(shí)在是太多太多了。
社區(qū)服務(wù)
當(dāng)一個(gè)新的項(xiàng)目剛剛誕生時(shí),在這個(gè)項(xiàng)目上能被稱作專家的,就只有那些把它寫出來的人。他們是僅有的能夠撰寫文檔和解答問題的人,同時(shí),在對(duì)軟件的改進(jìn)方面,他們也是最佳人選。
但結(jié)果,我們這類TensorFlow團(tuán)隊(duì)中的核心成員反倒成為了項(xiàng)目成長的瓶頸。原因其實(shí)很簡單:我們沒法一次性把所有的事情都干完。是,我們確實(shí)知道該怎么騰出時(shí)間去寫代碼和文檔,因?yàn)檫@本來就是我們在谷歌日常工作的一部分;但要給一個(gè)超大社區(qū)里的眾多開發(fā)者解答問題,我們就有點(diǎn)懵比了——盡管我們知道,這對(duì)于項(xiàng)目的成功十分重要。
為了確保用戶們能夠得到他們需要的答案,核心工程團(tuán)隊(duì)的全體成員開始輪班。每個(gè)人可以從以下幾個(gè)活里自己挑:處理Stack Overflow上帶有#tensorflow標(biāo)簽的問題、檢查一遍GitHub上的pull request、給GitHub上的issue分類、同步外部和內(nèi)部代碼,或是找到那些失敗測試的原因。
如何分配這些工作由大伙自己決定。一般來講,如果每個(gè)工程師每次在一個(gè)特定領(lǐng)域負(fù)責(zé)一周的話, 我們勉強(qiáng)能讓這個(gè)輪班機(jī)制循環(huán)起來。這個(gè)機(jī)制實(shí)行之后,工程師們在他們值班當(dāng)周的本職工作產(chǎn)出會(huì)大大降低——不過至少,每個(gè)人的工作被打斷的頻率降到了幾個(gè)月一次。
Pull request
我們將TensorFlow開源來讓社區(qū)能夠?qū)ζ湄暙I(xiàn)力量。到目前為止,已經(jīng)有超過400人從外部為我們貢獻(xiàn)了代碼,這其中既包括簡單的文檔修復(fù),也包括像OS X的GPU支持、OpenCL的執(zhí)行、InfiniBand架構(gòu)下RDMA這樣的大輸血。首先,每次貢獻(xiàn)都會(huì)先從輪值核心工程師那里審一遍,以確定其是否真的管用;如果方案通過了最初的審核,我們會(huì)對(duì)它進(jìn)行一組Jenkins測試來確保它不會(huì)引發(fā)任何故障;如果以上兩道程序都被通過了,輪值工程師會(huì)將方案交給另一位更加擅長相關(guān)領(lǐng)域的核心工程師再次進(jìn)行審核。
在這一過程中,GitHub全新的精細(xì)代碼審核工具能夠?yàn)槲覀兲峁O大的幫助。而在它出現(xiàn)之前,要把所有人的評(píng)價(jià)都處理一遍是個(gè)十分痛苦的事情。當(dāng)一名核心工程師與一位或更多的外部貢獻(xiàn)者協(xié)作時(shí),經(jīng)常會(huì)有更大的pull request會(huì)被放入正在進(jìn)行的工作中。直到每個(gè)人都滿意之后,PR就會(huì)被合并到GitHub上的樹頂,并在下一次同步運(yùn)行時(shí)被合并進(jìn)我們的內(nèi)部代碼庫。
代碼許可協(xié)議
作為自動(dòng)化pull request程序的一部分,我們會(huì)將貢獻(xiàn)者的GitHub賬號(hào)與我們在谷歌開發(fā)者網(wǎng)站上的代碼許可協(xié)議(CLA)記錄相匹配,以確保每個(gè)外部貢獻(xiàn)者都拿到了CLA。我們的目標(biāo)是是確保整個(gè)代碼庫都在阿帕奇2.0協(xié)議下準(zhǔn)確無誤地得到了分配。當(dāng)pull request的輪值工程師要對(duì)出現(xiàn)的全部問題進(jìn)行歸類的時(shí)候,如果一個(gè)pull request的內(nèi)部關(guān)聯(lián)了多個(gè)郵箱,或是貢獻(xiàn)者需要以團(tuán)體名義登錄,情況就會(huì)變得十分麻煩。
GitHub issue
GitHub用戶們已經(jīng)提交了5000多個(gè)關(guān)于TensorFlow的issue。對(duì)于有些人來說,這可能有點(diǎn)讓人沮喪;但對(duì)我來說,issue卻是個(gè)最棒的單位——因?yàn)樗C明,人們是真的在使用這個(gè)軟件。
為了確保我們回應(yīng)了每個(gè)存檔的issue,輪值工程師會(huì)時(shí)刻查看新出現(xiàn)的信息并試著用標(biāo)簽對(duì)其進(jìn)行分類。如果那是個(gè)我們在短期內(nèi)無法在內(nèi)部搞定的問題,它就會(huì)被標(biāo)記成“歡迎貢獻(xiàn)”;對(duì)于一些待處理的bug,我們會(huì)給他們按輕重緩急排個(gè)次序。這些天來,隨著一些外部用戶自己變成了某些問題的專家,越來越多的問題沒有借助我們的力量就被解決掉了,特別是在像Windows這類我們不會(huì)每天都用的平臺(tái)上。
如果一個(gè)issue沒能在社區(qū)中找到回答或修復(fù),而它的優(yōu)先級(jí)又足夠高時(shí),值班的人就會(huì)把它分配給團(tuán)隊(duì)里一個(gè)了解此類問題的工程師。整個(gè)TensorFlow團(tuán)隊(duì)的成員都有自己的GitHub賬號(hào),因此我們可以用正常的GitHub issue追蹤器來實(shí)現(xiàn)任務(wù)的分配。我們確實(shí)考慮過把GitHub上提交的bug復(fù)制到我們的內(nèi)部系統(tǒng)中,但要為相同信息同步兩份副本,代價(jià)太高了。最后,我們讓工程師們除了留意內(nèi)部系統(tǒng)的追蹤器之外,也要打開郵件通知,以便能夠及時(shí)看到自己被分配了哪些GitHub上的問題。
Stack Overflow
Derek Murray是Stack Overflow值班小組的帶頭大哥,我覺得他回答問題的技能真是碉堡了。根據(jù)他的資料頁,這個(gè)人發(fā)過的帖子已經(jīng)觸及到了130萬人;為了讓我們能夠及時(shí)追蹤網(wǎng)站上那些帶有#TensorFlow標(biāo)簽的問題,他還設(shè)法創(chuàng)建了一個(gè)RSS驅(qū)動(dòng)的自動(dòng)化電子表格。起初我們采取每周輪班制,但發(fā)現(xiàn)要處理問題的量對(duì)于一個(gè)人來講實(shí)在是太大了;后來我們采用了自動(dòng)分配系統(tǒng),情況變得好多了。
我本人就在這個(gè)輪班小組里,因此每天早上我瀏覽完自己的郵件后,我都會(huì)查看電子表格來弄清楚自己被分配到了哪些問題。很遺憾,我們沒法自己回答全部的問題,但每一個(gè)新進(jìn)來的問題我們都會(huì)看。如果問題相對(duì)簡單的話,我們就自己把它答了。
當(dāng)然,值班的工程師得頂?shù)奖粏栴}轟炸的前線去,但有些時(shí)候,回答某些問題需要更多的時(shí)間和專業(yè)知識(shí)。如果某個(gè)問題看上去能被答出來,但社區(qū)里卻沒看見站出來的英雄,我們就會(huì)研究一下代碼,扒一下團(tuán)隊(duì)里有誰可能會(huì)對(duì)這個(gè)問題有些想法(通常是用git blame)。然后值班工程師就會(huì)向我們找到的人發(fā)封郵件,看其是否能提供一點(diǎn)幫助。
郵件列表
我們設(shè)置了一個(gè)郵件列表,但起初卻并不知道該怎么用它。我們很快就看出來,用這種方法來追蹤issue和回答一般問題有多辣雞。
后來,我們把它當(dāng)成討論區(qū)來用,GitHub和Stackoverflow都不合適的話題,就發(fā)到郵件列表,但是在實(shí)際操作中我們發(fā)現(xiàn),即便是架構(gòu)問題,用GitHub issue來討論也比郵件列表合適。
現(xiàn)在我們用這個(gè)郵件列表來發(fā)送信息和貼通知,還算是值得訂閱的。
代碼同步
和我聊過的許多人都對(duì)一件事表示十分吃驚——那就是在谷歌內(nèi)部,我們使用的代碼庫和我們在GitHub上所開放的幾乎完全相同。不過,兩者間還是存在一點(diǎn)區(qū)別的,比對(duì)谷歌專用基礎(chǔ)設(shè)施的支持是獨(dú)立的,路徑也和GitHub版不一樣,但同步的過程是完全機(jī)械的。我們至少每周推出一次內(nèi)部更新,更多時(shí)候是下載GitHub版本。
麻煩的是,我們要進(jìn)行雙向同步。在GitHub的公共項(xiàng)目和我們的內(nèi)部版本上,有很多變動(dòng)是同時(shí)發(fā)生的,而我們需要反反復(fù)復(fù)地把它們?nèi)窟M(jìn)行合并。沒有現(xiàn)成的基礎(chǔ)架構(gòu)可供利用,因此我們使用了自己創(chuàng)造的一套Python腳本來處理這些問題。這些腳本能夠?qū)itHub上所有的變動(dòng)拉進(jìn)我們的內(nèi)部資源庫里,轉(zhuǎn)換所有的header path和其他細(xì)微的變化,將它們和最新內(nèi)部版代碼合并,并在內(nèi)部創(chuàng)建一個(gè)副本。隨后就可以進(jìn)行另一個(gè)方向的同步了,我們會(huì)將所有的內(nèi)部代碼轉(zhuǎn)換成外部的格式,并用相同的腳本把這些結(jié)果合并到最新的GitHub版上。
對(duì)于內(nèi)部的修改,我們同樣會(huì)盡力讓每次check-in都呈現(xiàn)為單獨(dú)的git commit,同時(shí)把作者的GitHub賬號(hào)和解釋這些變動(dòng)的評(píng)論包括在內(nèi)。我們在GitHub上有一個(gè)特別的“TensorFlow園丁”賬號(hào)來完成上述過程,一個(gè)內(nèi)部的commit被轉(zhuǎn)移到GitHub上之后,是這樣的:
要確保即使代碼變了,這個(gè)轉(zhuǎn)換流程依然有效,是很有挑戰(zhàn)性的。為了驗(yàn)證這種有效性,我們要求把內(nèi)部代碼通過這個(gè)腳本轉(zhuǎn)換成外部版本,再轉(zhuǎn)換回來之后,和最初的內(nèi)部版一模一樣。在任何接觸到TensorFlow代碼庫的內(nèi)部更改上,我們都會(huì)運(yùn)行這個(gè)測試,通不過測試的修改會(huì)被拒絕。
對(duì)于那些提交pull request的人,我們常常會(huì)提一些奇怪的變更要求,通常,這樣做的原因是我們必須確保他們的代碼能適用于這個(gè)同步流程。
Jenkins測試
因?yàn)橐С趾芏嗖煌钠脚_(tái),我們希望有一個(gè)適用范圍很廣的測試工具。TensorFlow會(huì)在Linux、Windows、OS X、iOS、Android、Android Things、以及樹莓派上運(yùn)行,同時(shí)我們還有為GPU準(zhǔn)備的不同代碼路徑,包括CUDA和OpenCL支持、以及Bazel、cmake,和無格式makefile的構(gòu)建進(jìn)程。
讓每一位開發(fā)者都在做了變更時(shí)手動(dòng)把上面這些東西全都測試一遍,是不可能的。因此,我們有一套能在絕大部分支持平臺(tái)上運(yùn)行的自動(dòng)化測試系統(tǒng),這些系統(tǒng)全都處于Jenkins自動(dòng)化系統(tǒng)的控制之下。始終讓它們發(fā)揮作用也不是件容易事,因?yàn)榭倳?huì)存在操作系統(tǒng)更新、硬件問題以及其他一些與TensorFlow相關(guān)的問題能讓測試失敗。我們有一個(gè)工程師團(tuán)隊(duì),專門負(fù)責(zé)讓整個(gè)測試系統(tǒng)正常運(yùn)行,這個(gè)團(tuán)隊(duì)曾經(jīng)在系統(tǒng)出問題的時(shí)候救過我們很多次。因此在這方面的投入也是值得的。
開發(fā)者關(guān)系
在開源領(lǐng)域,我們在谷歌并不孤獨(dú):我們曾經(jīng)在Kubernetes和“ 開源計(jì)劃辦公室”(Open Source Program Office)這樣的項(xiàng)目上學(xué)到過很多東西。有一支非常勤奮的開發(fā)者關(guān)系專家團(tuán)隊(duì)協(xié)助我們處理這些事務(wù),他們還承擔(dān)了很多圍繞文檔、代碼示例以及其他一些開發(fā)者經(jīng)驗(yàn)方面問題而產(chǎn)生的體力活。我們的長期目標(biāo)是,將關(guān)鍵的專業(yè)知識(shí)傳遞到核心開發(fā)者之外的范圍,以便更多的人能夠?qū)ι鐓^(qū)有所貢獻(xiàn)。
讓這些核心工程師在部分時(shí)間內(nèi)去承擔(dān)客戶服務(wù)工作的一大好處是,它給了我們關(guān)于用戶所遇到問題的直接洞見。參與客戶服務(wù)同樣驅(qū)動(dòng)著我們?nèi)バ迯?fù)那些常見的bug和補(bǔ)充文檔,因?yàn)樗跍p少工作量方面讓我們看見了直接的回報(bào)。
未來,我們希望將這項(xiàng)工作更廣泛地進(jìn)行下去。同時(shí),我們也設(shè)計(jì)了更多的“戰(zhàn)術(shù)指導(dǎo)手冊”以幫助人們處理常見任務(wù)。能有機(jī)會(huì)同如此多的外部開發(fā)者互動(dòng),我感覺十分幸運(yùn);我也希望,自己能對(duì)他們產(chǎn)生積極的影響,幫助他們用機(jī)器學(xué)習(xí)創(chuàng)造新的神奇應(yīng)用。
關(guān)于作者
Pete Warden是TensorFlow Mobile團(tuán)隊(duì)技術(shù)主管。在加入Google之前,他曾任Jetpac CTO,該公司提供為手機(jī)和嵌入式設(shè)備而優(yōu)化的深度學(xué)習(xí)技術(shù),2014年被Google收購。他還曾在蘋果工作,負(fù)責(zé)圖像處理的GPU優(yōu)化。(完)
招聘
量子位正在招募編輯記者、運(yùn)營、產(chǎn)品等崗位,工作地點(diǎn)在北京中關(guān)村。相關(guān)細(xì)節(jié),請?jiān)诠娞?hào)對(duì)話界面,回復(fù):“招聘”。
One More Thing…
今天AI界還有哪些事值得關(guān)注?在量子位(QbitAI)公眾號(hào)會(huì)話界面回復(fù)“今天”,看我們?nèi)W(wǎng)搜羅的AI行業(yè)和研究動(dòng)態(tài)。筆芯~
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。