使用vscode在linux平台上单步调试libtorch
介绍
最近一直在网上寻找能否使用vscode调试libtorch的方法,但是搜索到的基本都是要么只有windows平台,要么是linux,但只能运行不能单步调试。经过一些努力,总算是找到了方法。使用vscode编辑器,在linux操作系统上调试libtorch,并且可以进行单步调试!不过这种方法的缺点是无法看到tensor的内部变量。
一、Cmake编译工程
首先就是从pytorch官网下载一个linux,c++版本的torch,并上传到服务器,这一步就不再赘述了,上传完之后长这样:

接下来我们要创建一个示例cpp文,命名为test.cpp 再新建一个build文件夹。
这是个具有训练功能的小demo,没啥用。但只要能跑通这个代码那就说明配置成功了。
#include <torch/torch.h>
#include "torch/script.h"
#include <iostream>
using namespace std;
int main() {
torch::Tensor cin = torch::ones({ 1,64 }, torch::kFloat32);
torch::Tensor label = torch::ones({ 1,3 }, torch::kFloat32);
torch::nn::Sequential model(
torch::nn::Linear(64,64),
torch::nn::LeakyReLU(),
torch::nn::Linear(64,64),
torch::nn::LeakyReLU(),
torch::nn::Linear(64, 64),
torch::nn::LeakyReLU(),
torch::nn::Linear(64, 3)
);
torch::optim::Adam optimizer(model->parameters(), 0.01);
while (1) {
optimizer.zero_grad();
torch::Tensor output = model->forward(cin);
torch::Tensor loss = torch::mse_loss(output, label);
loss.backward();
optimizer.step();
float* ptr = (float*)output.data_ptr();
cout << ptr[0]<<" " << ptr[1] << " " << ptr[2] << endl;
}
}
最后长这样:

下一步创建CMakeLists.txt文件,这是文件内容,放到和test.cpp同级目录下。这里把c++版本指定为17,因为发现指定为14的话容易报错。这里面的test可以根据自己的命名需要进行修改
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(test)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(test test.cpp)
target_link_libraries(test "${TORCH_LIBRARIES}")
set_property(TARGET test PROPERTY CXX_STANDARD 17)
接着cd到build目录下,执行命令使用cmake编译出Makefile文件。这里的目录要根据自己的情况修改
$ mkdir build
$ cd build
$ cmake -DCMAKE_PREFIX_PATH=~/libtorch_linux/ ..
二、修改make配置
接下来是关键一步,我们需要在 build>CMakeFiles>test.dir(可能不一样)>flags.make 文件中修改一些东西。
这个文件里面有一个条目:CXX_FLAGS,这是make的生成规则, 长这样:
CXX_FLAGS = -D_GLIBCXX_USE_CXX11_ABI=1 -D_GLIBCXX_USE_CXX11_ABI=1 -std=gnu++17
我们需要在这后面加上一个选项 -g表示生成调试信息。这一步很重要,关系到cpp中的断点能否中断。
改完长这样:
CXX_FLAGS = -D_GLIBCXX_USE_CXX11_ABI=1 -D_GLIBCXX_USE_CXX11_ABI=1 -std=gnu++17 -g
三、修改tasks.json配置
我们先点击一下这个调试开关,或是其他方式尝试启动调试

这时候就能弹出这个对话框,我们选第一个就行。

此时会报错,但不用慌张,这一步是为了让vscode生成一个tasks.json文件。

vscode里面的tasks.json是为了帮我们调用gcc编译cpp文件,然后执行文件用的。但我们使用make来编译工程,不使用gcc,因此我们可以选择直接把“command”字段里的内容给清空。“args”里面的内容顺便也清空吧。
当然还有一个更优雅的方法,我们把gcc指令替换成make指令,这样就不用我们手动编译工程手动移动文件了。
tasks.json 可以写成这样:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc build active file",
"command": "rm test \n cd build \n make \n mv test ../test",
"args": [
// "-fdiagnostics-color=always",
// "-g",
// "${file}",
// "-o",
// "${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
command字段里的意思是:先删除原文件、进入build文件夹、执行make编译、把编译好的文件移动出来。这里“\n”是换行符,用来给每个指令做分割。
我只修改了command和args部分,其他不影响,懒得改了。
四、单步调试
此时我们的所有工作都做好了,可以直接点击右上角的调试图标进行调试了。像这样:

我自己测试过,这种方法调试libtorch甚至可以单步到libtorch框架里面进行调试,但tensor数据类型的内部信息不能在左上角显示出来。不过这也足够了。
这里面的报错都不用去管他,反正不影响执行就行了。
更多推荐
所有评论(0)