在 Debian 上调试 PyTorch 的实用流程
一 环境准备与快速排查
import logging; logging.basicConfig(level=logging.DEBUG)assert x.shape == (N, C, H, W), f"Unexpected shape {x.shape}"next(iter(dataloader)))确认样本可读、形状正确。二 Python 层交互式调试
import pdb; pdb.set_trace(),常用命令:n(下一步)、c(继续)、q(退出)、p <var>(打印变量)。pip install ipdb,使用 import ipdb; ipdb.set_trace(),具备彩色提示与更友好的自动补全。register_forward_hook / register_backward_hook 打印或断点检查中间张量。pip install torchsnooper,用 @torchsnooper.snoop() 自动打印每行张量的 shape、dtype、device、requires_grad,非常适合定位张量形状/设备不匹配等问题。三 性能与资源瓶颈定位
from torch.utils.tensorboard import SummaryWriterwith torch.profiler.profile(on_trace_ready=lambda prof: prof.export_chrome_trace("trace.json")) as prof:prof.step();用 tensorboard --logdir=runs 查看。pip install viztracer,运行 viztracer my_script.py 或使用 with VizTracer(log_torch=True): 捕获 PyTorch 调用与 GPU 事件,生成 HTML 报告离线分析。四 C++/CUDA 扩展与底层问题
sudo apt-get install gdbservergdbserver :9091 python your_script.py(端口可换)ssh -L 9091:localhost:9091 user@server,随后 gdb 中执行 target remote localhost:9091 设置断点、单步。cppdbg 配置 miDebuggerServerAddress 实现图形化远程调试。五 常见问题速查表
| 症状 | 快速定位 | 工具与命令 |
|---|---|---|
| 张量形状/设备不匹配 | 打印 tensor.shape/device/dtype/requires_grad |
pdb/ipdb、@torchsnooper.snoop() |
| 训练不收敛或 NaN | 监控损失与梯度分布 | SummaryWriter 记录标量/直方图 |
| DataLoader 卡住或异常 | 单独迭代一次检查样本 | next(iter(dataloader)) |
| GPU 利用率低 | 定位算子耗时与调用栈 | torch.profiler + TensorBoard |
| 段错误/崩溃 | 捕获信号与调用栈 | gdbserver + gdb 远程调试 |
| 离线环境无可视化 | 生成离线报告 | viztracer my_script.py 或 log_torch=True |