怎樣看 pytorch 源碼最有效?
【GiantPandaCV 導語】現在深度學習項目代碼量越來越大,並且單個文件的量也非常的大。筆者總結了一些專家的經驗並結合自己看的一些項目,打算總結一下如何探索和深入一個深度學習項目庫。
- 基礎知識
首先,需要保證有一定的深度學習基礎知識,吳恩達的深度學習課還有斯坦福大學的 CS231n 都是不錯的入門教程,只需要有大學數學的基礎就可以看懂。
然後,需要對 Linux 系統使用有一定的瞭解,一般選擇 Ubuntu 系統作爲主力系統,瞭解一下基礎的系統命令就可以了,比如 rm,ls,cd,cat,vim,sudo,find,df,top 等,在 B 站上搜索一下 Linux 的視頻,很快就可以入門。之後遇到新的命令只需要查詢 API 即可。
其次,還需要保證對 python 語言和深度學習框架的瞭解,python 上手是很快的,可以看一下菜鳥教程或者莫煩 python 教程,上首頁很快。深度學習框架方面可以買一些書籍,邊看邊敲,找一個小項目敲一敲,瞭解一下大部分 API 就已經達到上手水平了。深度學習框架一般選 tensorflow、pytorch,因爲大部分項目大多是基於這兩個框架的。他們官方網站的教程也是非常不錯的參考,可以看看官方提供的教程,跑一下 github 上提供的 demo。
最後,營造科研的環境,可以關注一些領域相關的大牛、公衆號,也可以加入一些交流羣,多和羣友交流,儘可能提升領域的常識。不要亂問問題,一定要有自己的思考和想法,然後再到羣裏問問題和交流。
- 項目分析閱讀
從 Github 上拿到一個項目,可以按照以下的步驟進行分析和閱讀。
-
項目背景調研:
-
項目是否是對應一篇論文?如果對應論文,可以先閱讀一下 Paper,對背景和項目的細節有一個大概的瞭解。
-
項目是否有說明文檔?一般比較大型的項目,比如 pytorch,nni,mmdetection 等較多人維護的項目是會在 readthedoc 上提供說明書,建議優先閱讀說明。
-
項目是否有 README?README 文件通常包含了項目創建者想要告訴你的信息,對於一些專業的項目庫而言,閱讀 README 文件絕對對你理解整個項目代碼有幫助。
-
什麼都沒有??極少數會遇到這種情況,但如果遇到的話,就進行下一個階段吧。
-
通過文件命名分析:
-
數據處理、數據加載部分,通常命名可能有 xxx_dataloader.py 等
-
網絡模型構建部分,通常命名可能爲 resnet20.py model.py 等
-
訓練部分腳本,通常命名可能爲 train.py 等
-
測試部分腳本,通常命名可能爲 test.py eval.py 等
-
工具庫,通常命名爲 utils 文件夾。
-
根據文件夾、文件的命名,判斷其可能的功能。一般在深度學習項目中,通常有幾部分組成:
-
舉個例子,以 once for all 項目爲例:
.
├── build.sh # 環境構建
├── eval_ofa_net.py
├── eval_specialized_net.py # 驗證專用網絡
├── figures
│ ├── cnn_imagenet_new.png
│ ├── diverse_hardware.png
│ ├── imagenet_80_acc.png
│ ├── ofa-tutorial.jpg
│ ├── overview.png
│ └── video_figure.png
├── LICENSE
├── ofa
│ ├── imagenet_classification
│ │ ├── data_providers # 數據加載
│ │ ├── elastic_nn # 算法核心模塊
│ │ ├── __init__.py
│ │ ├── networks # 網絡構建
│ │ └── run_manager # 訓練代碼核心邏輯
│ ├── __init__.py
│ ├── model_zoo.py # 模型庫
│ ├── nas # nas相關工具
│ │ ├── accuracy_predictor
│ │ ├── efficiency_predictor
│ │ ├── __init__.py
│ │ └── search_algorithm
│ ├── tutorial # 教程
│ │ ├── accuracy_predictor.py
│ │ ├── evolution_finder.py
│ │ ├── flops_table.py
│ │ ├── imagenet_eval_helper.py
│ │ ├── __init__.py
│ │ └── latency_table.py
│ └── utils # 工具庫
│ ├── common_tools.py
│ ├── flops_counter.py
│ ├── __init__.py
│ ├── layers.py
│ ├── my_dataloader
│ ├── my_modules.py
│ ├── pytorch_modules.py
│ └── pytorch_utils.py
├── README.md # 項目介紹,初次接觸需要閱讀
├── requirements.txt # 環境文件
├── setup.py # pip構建環境所需文件
├── train_ofa_net.py # 訓練腳本
└── tutorial # 教程
├── local_lut.npy
├── ofa.ipynb
├── ofa_resnet50_example.ipynb
└── README.md
-
找到程序運行入口:
-
第一類 bug,環境不兼容導致的 bug,嚴格按照作者提供的運行環境,並對照環境的版本信息,對齊本地環境和作者要求的環境。
-
第二類 bug,深度學習框架帶來的 bug,這部分 bug 可以在 bing 上進行搜索,查看解決方案。
-
第三類 bug,項目本身相關的 bug,這類 bug 最好是在 github 的 issue 區域進行查找,如果無法解決可以在 issue 部分詳細描述自己的問題,等待項目庫作者的解答。
-
通過上一步的分析,找到了項目的介紹的話,在自己機器上完成環境配置。
-
一般可以找到項目運行的主入口,比如 train.py,試着運行項目。
-
遇見 bug 怎麼辦?
-
運行順利的話,代表可以進行 debug 操作,對文件某些細節不確定的話,可以通過 debug 的方式查看變量詳細內容。
-
用 IDE 打開項目:
-
閱讀入口文件的邏輯,查看調用到了哪些包。
-
通過 IDE 的功能跳轉到對應類或者函數進行繼續閱讀,配合代碼註釋進行分析。
-
分析過程可能會需要軟件工程的知識,比如畫一個類圖來表述項目的關係。
-
一開始可以泛讀,大概瞭解整體流程,做一些代碼註釋。而後可以精讀,找到文章的核心,反覆理解核心實現,抽絲剝繭,一定可以對這個項目有進一步的理解。
-
筆者是 vscode 黨,推薦使用 vscode+scp+mobaxterm + 遠程服務器的方式進行運行。
-
打開項目以後,從運行入口(通常是 train.py)開始閱讀:
-
實在讀不懂怎麼辦?
-
在 Github 的 issue 上進行提問。
-
如果有項目作者的聯繫方式,可以聯繫作者,發郵件提問。
-
看看有沒有其他人寫過相關的博客。
- 參考
https://www.zhihu.com/question/26480537
https://www.zhihu.com/question/29416073/answer/44301979
https://github.com/phodal/articles/issues/14
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/C-5CEji0JQW6UNwxB07WMQ