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