博客專欄

        EEPW首頁 > 博客 > 如何參與PyTorch社區開源貢獻?

        如何參與PyTorch社區開源貢獻?

        發布人:計算機視覺工坊 時間:2021-12-08 來源:工程師 發布文章

        以下文章來源于GiantPandaCV ,作者BBuf

        作者丨BBuf233

        來源丨GiantPandaCV

        編輯丨極市平臺

        導讀

        本文作者通過以第一視角展示了自己在2021年為Pytorch發現了的BUG,以及提了相關PR以及ISSUE,給想為開源社區做貢獻的小伙伴們提供一些思路~

        作為深度學習框架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 。

        1.jpg

        為PyTorch指出它們的反卷積在CPU上實現有誤

        并且很快獲得了PyTorch團隊的回復,他們確認是MKLDNN那部分實現出了問題,并表達了感謝以及他們正在修復這個問題。

        2.jpg

        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的第一次合并的流程感覺還是很慢的。(至少對我來說。

        3.jpg

        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。

        本文僅做學術分享,如有侵權,請聯系刪文。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        萬能遙控器相關文章:萬能遙控器代碼


        電流傳感器相關文章:電流傳感器原理
        電子負載相關文章:電子負載原理


        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 九江县| 平潭县| 当雄县| 永善县| 富阳市| 江安县| 黄陵县| 临沧市| 民乐县| 青铜峡市| 武威市| 年辖:市辖区| 太仓市| 离岛区| 九龙县| 额尔古纳市| 台安县| 荔浦县| 张家港市| 浮梁县| 盐池县| 浦城县| 甘泉县| 鞍山市| 武平县| 虞城县| 盐边县| 同心县| 泸西县| 伊金霍洛旗| 获嘉县| 甘孜县| 京山县| 桂东县| 招远市| 广灵县| 康马县| 万年县| 历史| 都兰县| 孝昌县|