一、查找launch.py
使用代码
find / -name launch.py | grep distributed
得到的结果如下
这里我们得到了两个结果,看目标文件的路径名,第二个launch.py
应该在软件的解压缩包里,因此这里使用第一个,记下这个绝对路径。
二、修改launch.json
修改默认的launch.json
文件(没有就新建),一般来说我们使用下面这个配置文件。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "docker",
"type": "python",
"request": "launch",
"program": "main.py",
"args": ["-f","args.config"],
"console": "integratedTerminal"
}
]
}
将它修改为
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "docker",
"type": "python",
"request": "launch",
"program": "/opt/conda/lib/python3.7/site-packages/torch/distributed/launch.py",
"console": "integratedTerminal",
"args": [
"--nproc_per_node=1",
"--use_env",
"main.py"
],
"env": {
"CUDA_VISIBLE_DEVICES":"0"
}
}
]
}
program
就是我们上一步复制的绝对路径。- 建议只用一个GPU来调试,所以
nproc_per_node
的值设置为1,CUDA_VISIBLE_DEVICES
只用一个设备。
三、特别提醒
上面的写法是默认没有任何参数传递给main.py
的,如果要给它传递参数,则一定要写到main.py
之后,例如
3.1 错误的写法
"args": [
"--nproc_per_node=1",
"--use_env",
"--cfg = cfgfile",
"main.py"
],
上面的写法会报错,因为--nproc_per_node=1
,--use_env
以及--cfg=cfgfile
三个变量实际上都是传递给前面"program"
所指示的launch.py
文件的,而该文件并没有cfg
参数,因此会报错。
3.2 正确的写法
"args": [
"--nproc_per_node=1",
"--use_env",
"main.py",
"--cfg = cfgfile"
],
这样写就表示--cfg=cfgfile
参数是传递给main.py
文件的,这样就没有问题啦。