如何參與PyTorch社群開源貢獻?
作為深度學習架構OneFlow的一個全職開發者(聲明我是菜雞),基本上每天都會和PyTorch打交道,是以自問自答一下這個問題,希望對想為開源項目做貢獻的小夥伴們提供一些思路也希望這個問題能獲得更多回複。
OneFlow最近一年切到動态圖模式之後就非常注重和PyTorch在API上進行對齊,以提升動态圖模式的易用性,也即我們的:
import oneflow as torch
特性。為了實作這個目标,我們在寫Op的時候除了肉眼對Python API進行對齊之外還要寫PyTorch的測試樣例。動态圖Op開發前期非常痛苦,因為測試樣例的代碼比較多這對開發者和Reviewer來說都很痛苦。後來@daquexian 寫了一個自動測試架構可以非常友善的測試OneFlow Op的API接口以及計算結果是否和PyTorch的接口完全對齊。這個自動測試架構隻有兩個Python腳本,對原始的PyTorch進行了一個封裝(我把它叫做High Level PyTorch),我們做測試的時候用這個High Level的PyTorch進行測試。測試架構可以像寫dsl一樣随意指定輸入Tensor以及Paramter的形狀和取值範圍等,然後運作時會自動擷取程式中的輸入Tensor,中間Tensor,以及輸出Tensor和它們對應的梯度Tensor,甚至是
nn.Module
的Parameter,隻有OneFlow和PyTorch的所有參數和中間Tensor全部一樣時才可以通過測試。這裡有個issue一看便知 :https://github.com/Oneflow-Inc/oneflow/issues/5549 。後面我基于這個架構下進行了一些改進,比如自動codegen出錯的代碼,可以列印出錯的程式友善OneFlow的開發者進行Debug以及跑CI的過程中直接暴漏出錯程式。後面我會考慮寫一篇文章介紹我們的自動測試架構,歡迎大家關注,它的可移植性非常強,非常友善的可以改到任何深度學習架構。
其實不讀上面那段話也完全沒有關系,我想表達的是我為PyTorch做的貢獻主要是我在開發OneFlow的算子過程中基于OneFlow的自動測試架構發現和完成的。
說回給PyTorch做貢獻,我個人的觀點是,無論是提PR還是提issue實際上都是對開源社群做了貢獻。如果隻是想做一些微小的貢獻(比如我,因為自己還有工作),那麼BUG修複和一些Feature的Small Fix比較适合提PR,而一些侵入軟體系統比較深的問題如果我們解決需要花很長時間或者目前能力還不夠,這個時候就可以送出issue給PyTorch團隊。下面我将以我的第一視角,來展示一下2021年我為Pytorch發現了哪些BUG,以及我提了什麼PR以及ISSUE。
1. PyTorch CPU反卷積實作有BUG
在實作OneFlow的cpu group conv的時候,通過我們的自動測試架構測試發現一直有一些特殊的樣例OneFlow和Pytorch無法對齊,最後Debug良久發現就是
nn.ConvTranspose1D
裡面的weight的梯度無法對齊。然後在錯誤樣例的一步步指引下,最終定位到一組PyTorch在CPU和GPU上輸出結果不一緻的問題。趕緊整理出了複現代碼給PyTorch提了issue:https://github.com/pytorch/pytorch/issues/68868 。

為PyTorch指出它們的反卷積在CPU上實作有誤
并且很快獲得了PyTorch團隊的回複,他們确認是MKLDNN那部分實作出了問題,并表達了感謝以及他們正在修複這個問題。
PyTorch官方做問題确認
2. 我給PyTorch的第一個PR
我在OneFlow開發Upsample這個
nn.Module
的時候發現PyTorch的上采樣系數在在非整數的情況下會出錯,源于PyTorch的代碼實作錯誤,和OpenCV并沒有對齊。我将這個bug報告在了https://github.com/pytorch/pytorch/issues/65200 中。然後我開始修複這個問題,并快速的送出了一個PR給PyTorch官方Review:https://github.com/pytorch/pytorch/pull/61166 。在 jbschlosser 給出代碼方面的review意見之後,我修了他提的意見并且給PyTorch添加了觸發這種BUG的測試樣例就開始了跑PyTorch的CI的流程。但跑完之後PR還是遲遲沒有合并,後來我就每周在PR下面催促他們approve以及合并,直到一個多月後這個PR終于合并進去了QAQ,PyTorch的第一次合并的流程感覺還是很慢的。(至少對我來說。
PyTorch的第一個PR
3. 發現了幾個文檔錯誤相關的PR以及FX子產品的一些錯誤
後面浏覽PyTorch相關文檔時發現了一些文檔錯誤以及FX的一些錯誤,又順手提了2個PR并合并進去了。https://github.com/pytorch/pytorch/pull/64802 & https://github.com/pytorch/pytorch/pull/68043 。當然文檔級的失誤很少,如果你恰好發現了就嘗試體送出一下吧,就可以成為contributor了。不過,文檔也是深度學習架構的一個重要組成部分。
4. 又發現了一些BUG&疑惑
同樣還是在開發OneFlow算子的時候,通過OneFlow自動測試架構,發現PyTorch SoftPlus的梯度有一些問題。然後整理複現代碼送出issue之後發現這個問題已經在PyTorch最近一次版本更新後解決掉了。https://github.com/pytorch/pytorch/issues/61568
然後還有一件疑惑的事情,我在給OneFlow實作CPU反卷積Kernel的時候通過自動測試架構發現在一些非法的資料(反卷積的核的大小比輸入長度還大的時候)上PyTorch仍然正常輸出了答案,而在OneFlow和PaddlePaddle上均有對應的錯誤檢查并抛出異常。我将其回報給了PyTorch,但一直沒有得到回複。https://github.com/pytorch/pytorch/issues/66542
好了,以上就是今年我加入OneFlow做開發的過程中順帶發現的PyTorch問題以及做的貢獻了。**當我們覺得某些情況PyTorch有BUG的時候,要大膽質疑并用其它的架構去驗證。**再次回到題目,如何參與PyTorch社群開源貢獻呢?我們要勇于用issue提出bug,用pr解決bug。至于如何提pr的教程,Google會很詳細的告訴你。
成為很火的開源架構的Contributor是一件不錯的事情,特别是對于學生或者初入職場的工程師來說,履歷上可能是一個加分項。歡迎大家為PyTorch(
https://github.com/pytorch/pytorch
)以及國内的深度學習架構比如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。