vscode连接远程服务器,并在docker中利用torchrun分布式调试代码
遇到的问题: 我之前使用的经验是在conda 中调试,并且代码的启动方式是python XX.py 。像这样在docker容器内部并且调试多卡执行的程序着实费了一番功夫,下文主要是解决在vscode中调试分布式程序时的经验
vscode 连接远程服务器准备
在 远程资源管理器 的 SSH配置文件中,添加服务器的用户名和地址
点击小齿轮这里就可以添加啦
docker准备 (略)
在远程服务器中,
- 安装docker
- 拉取镜像
- 创建容器
在vscode中安装docker扩展
安装好之后会看到:
- 侧边栏有一个鲸鱼🐳图标
- 远程服务器所有的容器以及他们的状态
- 远程服务器所有的镜像
从容器中新建VSCode窗口
- 在我们想要调试环境的容器中,附加VScode。右键待选择的容器选择 “附加Visual Studio Code”。此操作会新建一个VScode窗口
- 会等待一段时间,会新打开一个窗口,在这个窗口中新建的终端都是在容器环境内的
- 新建的窗口可能会导致原来安装的插件不可用。
- 在新建窗口的资源管理器中打开需要远程调试的文件夹,操作和不在docker里面调试是相同的。
配置文件
- 在运行和调试中,编辑launch.json文件。
例如原来启动的shell脚本:
export CUDA_DEVICE_MAX_CONNECTIONS=1
export OMP_NUM_THREADS=1
export CUDA_VISIBLE_DEVICES=4,5
torchrun --nproc_per_node 8 --nnodes 2 --node_rank 0 \
XXX.test.py \
--dataset-path xxx \
--iteration xxx \
--lr xxx \
则转到launch.json文件的内容为:
{
"version": "0.2.0",
"configurations": [
{
"name": "megatron-core", //名字自定义
"type": "python",
"request": "launch",
"program": "/usr/local/bin/torchrun", // torchrun的位置,可在终端中执行which torchrun得到
"console": "integratedTerminal",
"env": {
"CUDA_DEVICE_MAX_CONNECTIONS": "1",
"OMP_NUM_THREADS": "1",
"CUDA_VISIBLE_DEVICES": "4,5",
"PYTHONPATH": "/xxx/xxx/file_path1:/xxx/xxx/file_path2" // 放入自己的文件的路径,冒号分隔
},
"args": [
"--nproc_per_node",
"8",
"--nnodes",
"2",
"--node_rank",
"0",
"XXX.test.py", //建议绝对路径
"--dataset-path",
"xxx",
"--iteration",
"xxx",
"--lr",
"xxx",
]
}
]
}
具体来说,要注意三个地方:
- “program” 后面是torchrun的位置
- “env” 后面是环境变量,冒号后面接每个环境变量的值
- “args” 后面是原来torchrun命令后面的所有的内容,包括节点数量等。每个值用双引号指定。
launch.json中的内容 根据自己的任务修改
调试
在运行和调试中, 选择自己写好的配置,就可以单步调试执行了。