如何參與PyTorch社區(qū)開源貢獻(xiàn)?
以下文章來源于GiantPandaCV ,作者BBuf
作者丨BBuf233
來源丨GiantPandaCV
編輯丨極市平臺
導(dǎo)讀
本文作者通過以第一視角展示了自己在2021年為Pytorch發(fā)現(xiàn)了的BUG,以及提了相關(guān)PR以及ISSUE,給想為開源社區(qū)做貢獻(xiàn)的小伙伴們提供一些思路~
作為深度學(xué)習(xí)框架OneFlow的一個全職開發(fā)者(聲明我是菜雞),基本上每天都會和PyTorch打交道,所以自問自答一下這個問題,希望對想為開源項目做貢獻(xiàn)的小伙伴們提供一些思路也希望這個問題能獲得更多回復(fù)。
OneFlow最近一年切到動態(tài)圖模式之后就非常注重和PyTorch在API上進(jìn)行對齊,以提升動態(tài)圖模式的易用性,也即我們的:import oneflow as torch 特性。為了實現(xiàn)這個目標(biāo),我們在寫Op的時候除了肉眼對Python API進(jìn)行對齊之外還要寫PyTorch的測試樣例。
動態(tài)圖Op開發(fā)前期非常痛苦,因為測試樣例的代碼比較多這對開發(fā)者和Reviewer來說都很痛苦。后來@daquexian 寫了一個自動測試框架可以非常方便的測試OneFlow Op的API接口以及計算結(jié)果是否和PyTorch的接口完全對齊。
這個自動測試框架只有兩個Python腳本,對原始的PyTorch進(jìn)行了一個封裝(我把它叫做High Level PyTorch),我們做測試的時候用這個High Level的PyTorch進(jìn)行測試。測試框架可以像寫dsl一樣隨意指定輸入Tensor以及Paramter的形狀和取值范圍等,然后運(yùn)行時會自動獲取程序中的輸入Tensor,中間Tensor,以及輸出Tensor和它們對應(yīng)的梯度Tensor,甚至是nn.Module的Parameter,只有OneFlow和PyTorch的所有參數(shù)和中間Tensor全部一樣時才可以通過測試。這里有個issue一看便知 :https://github.com/Oneflow-Inc/oneflow/issues/5549 。
后面我基于這個框架下進(jìn)行了一些改進(jìn),比如自動codegen出錯的代碼,可以打印出錯的程序方便OneFlow的開發(fā)者進(jìn)行Debug以及跑CI的過程中直接暴漏出錯程序。后面我會考慮寫一篇文章介紹我們的自動測試框架,歡迎大家關(guān)注,它的可移植性非常強(qiáng),非常方便的可以改到任何深度學(xué)習(xí)框架。
其實不讀上面那段話也完全沒有關(guān)系,我想表達(dá)的是我為PyTorch做的貢獻(xiàn)主要是我在開發(fā)OneFlow的算子過程中基于OneFlow的自動測試框架發(fā)現(xiàn)和完成的。
說回給PyTorch做貢獻(xiàn),我個人的觀點(diǎn)是,無論是提PR還是提issue實際上都是對開源社區(qū)做了貢獻(xiàn)。如果只是想做一些微小的貢獻(xiàn)(比如我,因為自己還有工作),那么BUG修復(fù)和一些Feature的Small Fix比較適合提PR,而一些侵入軟件系統(tǒng)比較深的問題如果我們解決需要花很長時間或者目前能力還不夠,這個時候就可以提交issue給PyTorch團(tuán)隊。下面我將以我的第一視角,來展示一下2021年我為Pytorch發(fā)現(xiàn)了哪些BUG,以及我提了什么PR以及ISSUE。
1. PyTorch CPU反卷積實現(xiàn)有BUG
在實現(xiàn)OneFlow的cpu group conv的時候,通過我們的自動測試框架測試發(fā)現(xiàn)一直有一些特殊的樣例OneFlow和Pytorch無法對齊,最后Debug良久發(fā)現(xiàn)就是nn.ConvTranspose1D里面的weight的梯度無法對齊。然后在錯誤樣例的一步步指引下,最終定位到一組PyTorch在CPU和GPU上輸出結(jié)果不一致的問題。
趕緊整理出了復(fù)現(xiàn)代碼給PyTorch提了issue:https://github.com/pytorch/pytorch/issues/68868 。
為PyTorch指出它們的反卷積在CPU上實現(xiàn)有誤
并且很快獲得了PyTorch團(tuán)隊的回復(fù),他們確認(rèn)是MKLDNN那部分實現(xiàn)出了問題,并表達(dá)了感謝以及他們正在修復(fù)這個問題。
PyTorch官方做問題確認(rèn)
2. 我給PyTorch的第一個PR
我在OneFlow開發(fā)Upsample這個nn.Module的時候發(fā)現(xiàn)PyTorch的上采樣系數(shù)在在非整數(shù)的情況下會出錯,源于PyTorch的代碼實現(xiàn)錯誤,和OpenCV并沒有對齊。我將這個bug報告在了https://github.com/pytorch/pytorch/issues/65200 中。
然后我開始修復(fù)這個問題,并快速的提交了一個PR給PyTorch官方Review:https://github.com/pytorch/pytorch/pull/61166 。在 jbschlosser 給出代碼方面的review意見之后,我修了他提的意見并且給PyTorch添加了觸發(fā)這種BUG的測試樣例就開始了跑PyTorch的CI的流程。但跑完之后PR還是遲遲沒有合并,后來我就每周在PR下面催促他們approve以及合并,直到一個多月后這個PR終于合并進(jìn)去了QAQ,PyTorch的第一次合并的流程感覺還是很慢的。(至少對我來說。
PyTorch的第一個PR
3. 發(fā)現(xiàn)了幾個文檔錯誤相關(guān)的PR以及FX模塊的一些錯誤
后面瀏覽PyTorch相關(guān)文檔時發(fā)現(xiàn)了一些文檔錯誤以及FX的一些錯誤,又順手提了2個PR并合并進(jìn)去了。https://github.com/pytorch/pytorch/pull/64802 & https://github.com/pytorch/pytorch/pull/68043 。當(dāng)然文檔級的失誤很少,如果你恰好發(fā)現(xiàn)了就嘗試體提交一下吧,就可以成為contributor了。不過,文檔也是深度學(xué)習(xí)框架的一個重要組成部分。
4. 又發(fā)現(xiàn)了一些BUG&疑惑
同樣還是在開發(fā)OneFlow算子的時候,通過OneFlow自動測試框架,發(fā)現(xiàn)PyTorch SoftPlus的梯度有一些問題。然后整理復(fù)現(xiàn)代碼提交issue之后發(fā)現(xiàn)這個問題已經(jīng)在PyTorch最近一次版本更新后解決掉了。
https://github.com/pytorch/pytorch/issues/61568
然后還有一件疑惑的事情,我在給OneFlow實現(xiàn)CPU反卷積Kernel的時候通過自動測試框架發(fā)現(xiàn)在一些非法的數(shù)據(jù)(反卷積的核的大小比輸入長度還大的時候)上PyTorch仍然正常輸出了答案,而在OneFlow和PaddlePaddle上均有對應(yīng)的錯誤檢查并拋出異常。我將其反饋給了PyTorch,但一直沒有得到回復(fù)。https://github.com/pytorch/pytorch/issues/66542
好了,以上就是今年我加入OneFlow做開發(fā)的過程中順帶發(fā)現(xiàn)的PyTorch問題以及做的貢獻(xiàn)了。當(dāng)我們覺得某些情況PyTorch有BUG的時候,要大膽質(zhì)疑并用其它的框架去驗證。 再次回到題目,如何參與PyTorch社區(qū)開源貢獻(xiàn)呢?我們要勇于用issue提出bug,用pr解決bug。至于如何提pr的教程,Google會很詳細(xì)的告訴你。
成為很火的開源框架的Contributor是一件不錯的事情,特別是對于學(xué)生或者初入職場的工程師來說,簡歷上可能是一個加分項。
歡迎大家為PyTorch(https://github.com/pytorch/pytorch)
以及國內(nèi)的深度學(xué)習(xí)框架比如:
OneFlow(https://github.com/Oneflow-Inc/oneflow)
Paddle(https://github.com/PaddlePaddle/Paddle)
Mindspore(https://github.com/mindspore-ai/mindspore)
MegEngine(https://github.com/MegEngine/MegEngine)
等做出貢獻(xiàn),成為Contributor。
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。
萬能遙控器相關(guān)文章:萬能遙控器代碼
電流傳感器相關(guān)文章:電流傳感器原理 電子負(fù)載相關(guān)文章:電子負(fù)載原理