Linux下VsCode调试Pytorch源码

第一步、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++代码的运行逻辑了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值