天天看点

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)