在VSCode、Linux环境编译并调试Mindspore源码

前言

本文记录一下自己在windows环境下编译pytorch源码所经过程和踩过的坑。

系统环境

CentOS Linux release 7.9.2009
MindSpore version :1.10.1
Visual Studio Code:1.76.1
gdb:8.0.1
还有一些环境在编译Mindspore环节具体展开

1.源码编译Mindspore

在Linux环境下,输入命令创建环境,这里直接指定python版本。

conda create -n mindsporedebug python=3.7
conda activate mindsporedebug

进入mindsporedebug虚拟环境:
接下来安装所需环境,可以参考这篇博客

在Linux上体验源码编译安装MindSpore GPU版本
这里要注意几点:

1.注意编译选项

本人安装为CPU版本,所以编译选项为
./build.sh -e cpu -d
注意要加上-d选项以编译debug版本。

2.没有root权限下安装

这里本人采用conda安装>pip安装>源码安装,版本可以高但不能低,尽量一致。
conda有的时候找不见包可以去官网https://anaconda.org/搜一下,通常是包名不一样比如numa包名为libnuma等。

3.编译报错

C++: fatal error: Killed signal terminated program cc1plus
或者是collect2: fatal error: ld terminated with signal 9 [Killed]
通常为系统内存不够,可以采用增加内存/swap区来解决,这里注意debug版本要更加吃内存(这里大约需要24G+)
也可已通过设置编译线程数来解决,默认为8,可以添加-j n选项来调整。
还容易出现下载第三方github包出错情况,有两种解决方式
1.自己下载github、gitlab包,然后上传至报错处指定位置
2.指定gitee下载,通过增加-S编译选项,将从对应的gitee镜像下载。

2.VSCode SSH远程连接

打开VSCode后,要先安装插件Remote SSH
在VSCode、Linux环境编译并调试Mindspore源码_第1张图片
然后远程连接Linux
首先F1打开
在这里插入图片描述
选择Connect to Host>选择Add New SSH Host
这里根据提示键入

ssh username@XXX

建立远程ssh连接
这里容易出以下错误

1.提示试图写入的管道不存在/Remote Host Identification has Changed

这里可以尝试
1.删除通过F1,选择Kill VS Code Server on Host,再建立
2.删除C:\users\XXX.ssh\known_hosts,打开找到对应host ip那一行删除,再连接

2.Xshell、Xftp能连接,VSCode连接不上

可能是SSH的path不对,应为git\usr\bin\ssh.exe
虚拟机网络原因,可以尝试修改Remote SSH设置
首先打开Setting->Remote.SSH: Default Forwarded Ports
在VSCode、Linux环境编译并调试Mindspore源码_第2张图片
打开json文件,添加选项来指定SSH path
在这里插入图片描述

3.存在一直连接,一直弹窗Retry

可以先查看commit id,在help->about内
在VSCode、Linux环境编译并调试Mindspore源码_第3张图片
用Xftp进入.vscode-server中,打开bin/你的commit id目录,如果有两个0大小的这样的文件就需要自己下载vscode-server服务
在VSCode、Linux环境编译并调试Mindspore源码_第4张图片

具体解决可以参考这篇博客
无法安装vscode-server服务

3.VSCode调试步骤

调试之前还需要在VS Code安装以下插件
C/C++
Python
GDB Debug

1.创建配置文件:

在你远程连接选择的文件夹下创建.vscode/launch.json,进行编辑

{
    "configurations": [
        {
            "name": "python",
            "type": "python",
            "request": "launch",
            "program": "${file}",  //file会自动指定当前所在页面的文件,将会执行这个文件
            "console": "integratedTerminal",
            "justMyCode": false
        },
        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "processId":"${command:pickProcess}", //设置手动指定进程id
            "program": "/anaconda3/envs/mindsporedebug/bin/python",//这里指定python所在目录
            "miDebuggerPath": "/usr/bin/gdb",//这里指定gdb所在目录
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

2.创建Python脚本进行调试:

这里写了比较简单的Tensor相加示例

import numpy as np
import mindspore as ms


x = ms.Tensor(np.array([1.0, 2.0, 3.0]))
y = ms.Tensor(np.array([4.0, 5.0, 6.0]))
z = x + y

在z = x + y处打一个断点
在VSCode、Linux环境编译并调试Mindspore源码_第5张图片
打开调试按钮,这里注意VSCode右下角的python环境,一定要与conda一致
在这里插入图片描述
点击按钮开始调试
在这里插入图片描述
进入调试
在VSCode、Linux环境编译并调试Mindspore源码_第6张图片
点击step into/F11可以逐步看代码运行,可以看到这里跳转至tensor.py
在VSCode、Linux环境编译并调试Mindspore源码_第7张图片

3.GDB Attach模式调试:

想要进入C++层面调试,必须使用gdb来进行调试。在调整launch.json(在1.创建配置文件这一步完成)后,进行如下步骤:
1.先要运行一个python进程。这里虽然在launch.json中调整过python的path,但仍要注意vscode右下角指定环境(之前提到过)。
在VSCode、Linux环境编译并调试Mindspore源码_第8张图片
在python文件中加入断点后,点击运行python debug,然后显示如下
在VSCode、Linux环境编译并调试Mindspore源码_第9张图片

按钮全部亮起后进行下一步
在这里插入图片描述
2.gdb attach模式debug。这一步需要在相应C++语句打断点。这里我采用动态图执行这段代码,那么在/mindspore/mindspore/ccsrc/pipeline/pynative/pynative_execute.cc中,找到相应语句,打断点在C++层面进行调试。
在VSCode、Linux环境编译并调试Mindspore源码_第10张图片
而后,切换gdb attach进行debug。
在VSCode、Linux环境编译并调试Mindspore源码_第11张图片
因为是attach模式,需要attach到一个进程上,先前的launch.json中设置要自己输入进程PID,这里可以直接搜自己python文件名的PID,挑选进程号较大的一个,这里直接点下边21639那个。
在VSCode、Linux环境编译并调试Mindspore源码_第12张图片
调用栈如下
在VSCode、Linux环境编译并调试Mindspore源码_第13张图片
这里gdb下的几个进程可能会加载的有点慢,耐心等
在VSCode、Linux环境编译并调试Mindspore源码_第14张图片

3.接下来要使python debug调试至对应调用C++语句的代码(可以慢慢点step into,也可以直接continue到C++断点上),然后由python debug进入gdb debug,从python debug PAUSED状态变为gdb Attach处于PAUSED状态。如果上图gdb下的进程没有加载出的话,python debug中的step into是点不动的。
停在C++层面如下图
在VSCode、Linux环境编译并调试Mindspore源码_第15张图片
而后就可以在gdb里进行调试啦。

参考文章

[1]: 在Linux上体验源码编译安装MindSpore GPU版本
[2]: VSCode 联合调试Python/C++
[3]: MindSpore源码阅读系列(三):统一调试MindSpore Python与C++

你可能感兴趣的:(Mindspore,linux,vscode)