最近在做一个简单的CIFAR-10分类任务,用的ResNet18,batch size设了64,结果训练到第10个epoch左右就报“CUDA out of memory”。我一开始以为是batch太大,调到32还是爆,甚至试了16也撑不到20个epoch。我检查了代码,没有明显的循环累积梯度或者没释放的变量。
想请教一下大家,这种“训练中途显存突然暴涨”的情况一般是什么原因?是不是DataLoader里pin_memory或者num_workers设置的问题?或者是我模型里某些层(比如BN层)有缓存没清理?有没有什么工具(比如nvidia-smi或者torch.cuda的API)能实时监控显存占用,定位到具体哪一行代码在吃显存?求大佬们给点排查思路,孩子快被显存搞自闭了……