天天看點

pytorch源碼開發:在Ubuntu中的編譯調試(C語言源碼級調試)

如果不需要C語言高度,用anaconda安裝,參考(https://github.com/pytorch/pytorch)過程如下,

官網的依賴都是使用conda,conda預設的安裝都是非調試版的。另外還有一些常用包也列一下,根據需要自己裝吧

另外說明一下,如果你隻是想安裝pytorch使用,而不需要調試或檢視任何源碼或版本,那麼下面這個安裝方法最省事,

更具體的請參考:

https://pytorch.org/get-started/locally

https://anaconda.org/pytorch/pytorch

參考原文:https://blog.csdn.net/tanmx219/article/details/82831964 

Python不一定要調試版,但我個人喜好就是弄個調試版的。

另外我補充一點,通過設定DEBUG=1,調試pytorch時gdb既能進入pytorch的C源碼,也能進入python的源碼,python不需要自己編譯也是沒有問題的(最初我以為這是必須的,後來發現直接用anacon的python編譯pytorch一點問題都沒有)至于為什麼能進入python庫的C源碼,我也不知道,有時間得再細看一下pytorch編譯部分,找到解壓python源碼包的那段估計就是了,。

在後面的描述中都不使用anaconda,而是假設使用python372來調試pytorch。python372是我自己編譯安裝的python調試開發版。關于如何安裝調試版python, 以及如何讓該版本獨立另存,請參考前一個貼子:

https://blog.csdn.net/tanmx219/article/details/86518446

另外,調試最好和開發分開,不要和日常應用弄到一起,道理大家都明白的。

同樣,因為這裡不使用conda,而是我們前面編譯好的pip372,相關指令如下,

編譯調試pytorch,注意這裡需要sudo權限,否則會報錯無法安裝

如果你需要用gdb等工具調試,還需要打開DEBUG (-g)開關,詳細原因請參考後面“問題”部分說明,我一般使用的指令

這裡的USE_OPENCV等就需要根據自己的實際情況取舍了,CUDA也要根據自己的實際機器來,預設這些都是OFF。

編譯完後可能會出現一大堆問題,具體解決方案請參考後面的章節。一般在問題解決之後,需要重新再編譯一次才行。

-- Could NOT find CUB (missing: CUB_INCLUDE_DIR)

之類的報錯,我的主要包括下面這些設定,

此時可直接在環境變量中添加,如

注意執行完上述指令後要重新打開一個終端才會起作用。另外~/.bashrc隻影響目前使用者(sudo -H python372 setup.py build develop),如果要給所有使用者(sudo python372 setup.py build develop)添加,就要使用這個路徑:

完事後用

指令檢視一下環境變量是否已經起作用了。

參考: https://blog.csdn.net/tanmx219/article/details/86534758

還有一個變量可以在編譯前臨時設定一下,不要放到/etc/profile中去,以免對其他程式造成影響(如果是我的話,這裡會把變量名改成TORCH_DEBUG之類的,避免DEBUG這種過于通用的命名):

export DEBUG=1  

export REL_WITH_DEB_INFO=1

我也是看了setup.py中的源碼才知道C語言debug版本的源碼調試需要這個開關,源碼内容是

可見,export DEBUG=1, ON, YES, TRUE, 或Y的效果是相同的,都會開啟DEBUG模式(編譯和連結時的‘-g’開關)。

在不調試的情況下是release版本,為了追求性能優化而抛棄了調試資訊。DEBUG版本為了追求更全面的調試資訊而放棄了速度; 如果使用者既需要調試代碼,需要速度快一點,那麼便可以開始考慮REL_WITH_DEB_INFO這個版本了。

參考:https://blog.csdn.net/tanmx219/article/details/86553485

如果隻是要安裝cudnn,python不用源碼C語言調試的話,那麼anaconda的指令仍然是首選,一條指令就搞定了,如下

conda install cudnn

該警告可以忽略,産生這個警告的原因是,pytorch/third_party/eigen/Eigen/src/Core/util/ConfigureVectorization.h:374行這裡直接使用了定義

#if defined(EIGEN_HAS_CUDA_FP16)

  #include <host_defines.h>

  #include <cuda_fp16.h>

#endif

是以這個是eigen沒有使用cuda_runtime_api.h 或 cuda_runtime.h 而直接引用了host_defines.h所引起的。

because ninja is not installed. Run this to enable it:

 > pip install ninja

===>>>

pytorch使用了setuptools來編譯安裝torch,setup.py中真正執行編譯的部分是函數def build_libs(libs),它通過

 subprocess.call調用../tools/build_pytorch_libs.sh (在windows下是build_pytorch_libs.bat)來編譯生成pytorch庫檔案。

如果不是搞C語言源碼調試的話,還是用anaconda吧,省掉的事情不是一點點。Linux裡面的各種依賴太麻煩了。anacoda中可以非常輕松地進行python包的調試,不過安裝時也要使用build develop。

如何使用gdb調試python,請參考Louie Lu的blog:A guide from parser to objects, observed using GDB

參考:http://lsi.ugr.es/jmantas/pdp/ayuda/datos/instalaciones/Install_OpenMPI_en.pdf

torch-cudnn參考:

https://www.cnblogs.com/darkknightzh/p/5668471.html (Ubuntu16 中安裝torch版的cudnn)

https://github.com/NVIDIA/torch-cudnn

https://blog.csdn.net/Hungryof/article/details/51557666 (ubuntu下100%成功安裝torch,同時配置cuda和cudnn)