本文记录一下自己在windows环境下编译pytorch源码所经过程和踩过的坑。
CentOS Linux release 7.9.2009
MindSpore version :1.10.1
Visual Studio Code:1.76.1
gdb:8.0.1
还有一些环境在编译Mindspore环节具体展开
在Linux环境下,输入命令创建环境,这里直接指定python版本。
conda create -n mindsporedebug python=3.7
conda activate mindsporedebug
进入mindsporedebug虚拟环境:
接下来安装所需环境,可以参考这篇博客
在Linux上体验源码编译安装MindSpore GPU版本
这里要注意几点:
本人安装为CPU版本,所以编译选项为
./build.sh -e cpu -d
注意要加上-d选项以编译debug版本。
这里本人采用conda安装>pip安装>源码安装,版本可以高但不能低,尽量一致。
conda有的时候找不见包可以去官网https://anaconda.org/搜一下,通常是包名不一样比如numa包名为libnuma等。
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镜像下载。
打开VSCode后,要先安装插件Remote SSH
然后远程连接Linux
首先F1打开
选择Connect to Host>选择Add New SSH Host
这里根据提示键入
ssh username@XXX
建立远程ssh连接
这里容易出以下错误
这里可以尝试
1.删除通过F1,选择Kill VS Code Server on Host,再建立
2.删除C:\users\XXX.ssh\known_hosts,打开找到对应host ip那一行删除,再连接
可能是SSH的path不对,应为git\usr\bin\ssh.exe
虚拟机网络原因,可以尝试修改Remote SSH设置
首先打开Setting->Remote.SSH: Default Forwarded Ports
打开json文件,添加选项来指定SSH path
可以先查看commit id,在help->about内
用Xftp进入.vscode-server中,打开bin/你的commit id目录,如果有两个0大小的这样的文件就需要自己下载vscode-server服务
具体解决可以参考这篇博客
无法安装vscode-server服务
调试之前还需要在VS Code安装以下插件
C/C++
Python
GDB Debug
在你远程连接选择的文件夹下创建.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
}
]
}
]
}
这里写了比较简单的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右下角的python环境,一定要与conda一致
点击按钮开始调试
进入调试
点击step into/F11可以逐步看代码运行,可以看到这里跳转至tensor.py
想要进入C++层面调试,必须使用gdb来进行调试。在调整launch.json(在1.创建配置文件这一步完成)后,进行如下步骤:
1.先要运行一个python进程。这里虽然在launch.json中调整过python的path,但仍要注意vscode右下角指定环境(之前提到过)。
在python文件中加入断点后,点击运行python debug,然后显示如下
按钮全部亮起后进行下一步
2.gdb attach模式debug。这一步需要在相应C++语句打断点。这里我采用动态图执行这段代码,那么在/mindspore/mindspore/ccsrc/pipeline/pynative/pynative_execute.cc中,找到相应语句,打断点在C++层面进行调试。
而后,切换gdb attach进行debug。
因为是attach模式,需要attach到一个进程上,先前的launch.json中设置要自己输入进程PID,这里可以直接搜自己python文件名的PID,挑选进程号较大的一个,这里直接点下边21639那个。
调用栈如下
这里gdb下的几个进程可能会加载的有点慢,耐心等
3.接下来要使python debug调试至对应调用C++语句的代码(可以慢慢点step into,也可以直接continue到C++断点上),然后由python debug进入gdb debug,从python debug PAUSED状态变为gdb Attach处于PAUSED状态。如果上图gdb下的进程没有加载出的话,python debug中的step into是点不动的。
停在C++层面如下图
而后就可以在gdb里进行调试啦。
[1]: 在Linux上体验源码编译安装MindSpore GPU版本
[2]: VSCode 联合调试Python/C++
[3]: MindSpore源码阅读系列(三):统一调试MindSpore Python与C++