转载自:https://blog.csdn.net/qianbin3200896/article/details/108182504
尊重原创,请看原文
在VS Code中想要调试Python脚本很简单,只需要创建一个launch.json文件即可。如果没有launch.json文件,只需要单机下图中“python:当前文件”旁的齿轮按钮即可创建一个launch.json文件。
下面是最关键的地方,用于为debug设置配置参数,具体如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "/home/dl/anaconda3/lib/python3.7/site-packages/torch/distributed/launch.py",//可执行文件路径
"console": "integratedTerminal",
"args": [
"--nproc_per_node=1",
"tools/train.py",
"--model",
"bisenetv1",
],
"env": {"CUDA_VISIBLE_DEVICES":"0"},
}
]
}
其中,program参数用于设置使用torch分布式包中的launch.py文件来作为启动脚本,具体路径请参照具体的torch安装路径来修改。args用于设置每个参数。env用于设置环境变量。具体debug时,建议只用1个GPU来进行调试,所以nproc_per_node设置为1,CUDA_VISIBLE_DEVICES设置为0。
到这里如果直接按F5调式运行,可以勉强运行起来,如下所示:
也就是在循环取数据的时候卡死在这一步了。然后在google继续查原因,终于发现问题了,在设置dataloader的时候,一般都会这么写:
dl = DataLoader(
ds,
batch_size=batchsize,
shuffle=shuffle,
drop_last=drop_last,
num_workers=4,
pin_memory=True,
)
return dl
这里注意,有一个num_workers参数,如果是命令行运行,这样设置没有任何问题,但是在VS Code调试模式下这样设置就有问题了,google有人给出的解释是说“我们想通过这个参数来启动多个进程来加载数据,但是VS Code调试模型并不能成功的开启新进程”,到这里问题就变得显然了。只需要将num_workers设置为0即可。如下所示:
dl = DataLoader(
ds,
batch_size=batchsize,
shuffle=shuffle,
drop_last=drop_last,
num_workers=0,
pin_memory=True,
)