介绍

最近一直在网上寻找能否使用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数据类型的内部信息不能在左上角显示出来。不过这也足够了。
这里面的报错都不用去管他,反正不影响执行就行了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐