第一步、develop版本源码安装
1. 准备一个干净的conda环境,激活
conda create -n PytorchComplie python=3.8
conda activate PytorchCompile
2. 安装一些必要的包
conda install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing
3. 下载pytorch源码(大小1G左右)
git clone --recursive https://github.com/pytorch/pytorch
4. 安装requirmemnt.txt需要的包
cd pytorch
pip install -r requirment.txt
5. 开始编译(这里编译的带有CUDA支持的版本,如果不需要,USE_CUDA置0)
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
DEBUG=1 USE_DISTRIBUTED=0 USE_MKLDNN=0 USE_CUDA=1 BUILD_TEST=0 USE_FBGEMM=0 USE_NNPACK=0 USE_QNNPACK=0 python setup.py develop
编译时间大概在30分钟左右,可以去跑个咖啡等等。
踩坑:编译完成之后,在终端试试是否能够import,如果无报错,说明安装成功。
笔者在import过程中遇到了undefined symbol报错,查询后在libtorch.so.1: undefined symbol: · Issue #10234 · pytorch/pytorch · GitHub找到了解决方案。可能是本人在base环境下的pytorch安装与当前新环境的安装的pytorch环境变量冲突导致,终端运行如下命令,问题解决。
export LD_LIBRARY_PATH=/usr/local/cuda/lib64 #找到你的cuda库路径填入
第二步、Vscode断点调试
1. VsCode安装C++扩展(正常安装,有问题见上篇博客VScode离线安装cpptools插件(C++扩展)-CSDN博客)
2. 以下面代码为例,配置launch.json
import torch
inp = torch.rand(1,3,224,224)
m=torch.nn.Conv2d(3,64,3)
out=m(inp)
vscode左侧栏点击run and debug,如果没有launch.json文件,点击创建
新建后按照如下配置文件配置,该配置文件配置了两个debug设置,分别对应python和C++,目的是为了抓取pytorch中的python前端代码和底层C++代码,注意其中gdb以attach的形式抓取正在运行的python进程。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"python": "/opt/conda/envs/PyTorchCompile/bin/python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false,
"stopOnEntry": true
},
{
"name": "(gdb) 附加",
"type": "cppdbg",
"request": "attach",
"program": "/opt/conda/envs/PyTorchCompile/bin/python",
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
3. 详细抓取步骤:
首先,在python代码第一行,即 import torch处断点,左侧栏run and debug选择python,点击绿三角,此时python进程启动,等待一会,程序会在断点的第一行位置停住
然后,找到torch/csrc/stub.c文件,在PyInit__C函数内断点,左侧栏run and debug选择gdb,点击绿三角,此时gdb将询问attach的进程,通过运行的python文件找到对应的进程,点击。至此gdb会监控当前进程是否进入到C++断点
最后,继续执行python处的代码,如果代码停在了C++的位置,说明代码已经从python前端进入到了C++部分,接下来你就一步步调试来看C++代码的运行逻辑了