VSCode调试PyTorch需配置launch.json:console设为"integratedTerminal",env添加{"CUDA_VISIBLE_DEVICES": "0", "PYTHONUNBUFFERED": "1"};启用Pylance并标注device类型以显示张量形状;用Jupyter插件内联绘制loss曲线。

VSCode能直接调试PyTorch训练循环并实时看张量、损失曲线和GPU占用,但前提是launch.json里必须显式传参且禁用输出缓冲——否则断点不生效、变量面板为空、TensorBoard打不开。
launch.json必须加console: "integratedTerminal"和env: {"PYTHONUNBUFFERED": "1"}
PyTorch调试卡在model.train()不进断点?大概率是输出被缓冲了。默认console: "internalConsole"会吞掉print和日志,导致调试器收不到运行时信号;而PYTHONUNBUFFERED=1强制Python逐行刷stdout,让VSCode能同步捕获变量状态和异常堆栈。
- 必须写成
"console": "integratedTerminal",不能用externalTerminal(Windows下会闪退)或internalConsole(Linux/macOS下tensor形状不显示) -
env字段要显式声明{"CUDA_VISIBLE_DEVICES": "0", "PYTHONUNBUFFERED": "1"},漏掉PYTHONUNBUFFERED会导致torch.cuda.memory_allocated()返回0 - 如果用
args传配置文件,路径必须是相对${workspaceFolder}的,比如"--config", "configs/train.yaml",绝对路径在远程开发时会失效
变量面板看不到batch张量形状?检查Pylance是否识别device类型
VSCode默认把batch['image'].to(device)当普通dict处理,不会展开torch.Tensor结构。Pylance语言服务器需要明确知道device是torch.device类型,才能触发PyTorch专用的变量渲染逻辑。
- 确保已安装
Pylance扩展,并在settings.json中设"python.languageServer": "Pylance" - 在代码顶部加类型提示:
device: torch.device = torch.device("cuda" if torch.cuda.is_available() else "cpu"),否则Pylance推断为Any - 鼠标悬停在
batch['image']上,若显示Tensor (shape: [4, 3, 224, 224], dtype: torch.float32, device: cuda:0)才算成功;否则右键变量→“Copy Value”粘贴到Python终端里手动查.shape
想点一下就看loss曲线?别手动开TensorBoard,用Jupyter插件嵌入训练脚本
VSCode里开单独TensorBoard进程(tensorboard --logdir=runs)再切浏览器,效率太低。更直接的方式是:把训练循环封装成函数,在.ipynb里调用,利用Jupyter插件的内联图表能力。
- 新建
debug_train.ipynb,第一行加载环境:%run -i train.py(注意-i参数保持交互式命名空间) - 后续单元格调用
train_one_epoch(model, dataloader, ...),在循环内插入plt.plot(losses); plt.show(),图表直接渲染在notebook里 - 关键点:Jupyter内核必须和
launch.json用同一conda环境,否则torch.cuda.is_available()返回False - 如果图表不刷新,检查
settings.json里是否禁用了"jupyter.askForKernelRestart": false
真正卡住人的不是功能不会用,而是launch.json里少一个逗号导致整个调试配置静默失败,或者Pylance没识别出torch.device类型就放弃张量渲染——这些细节不报错,只让调试体验倒退到print大法时代。











