先把当时的情况摆出来。在 T4 16G 上跑到 32 正常,把 batch size 提到 64 后第一步就抛 RuntimeError,原文是 CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate,清理缓存也没用。
这类报错背后常见的原因有几处,逐个排除就行。工作区显存不够,cuBLAS 句柄创建失败。另一种情况是同进程里还留着上一个模型的显存碎片。
还有一种情况,矩阵形状变大后 workspace 需求是按平方增长的。另外,用了 fp32 而不是 amp,激活占用翻倍。
先看当前显存与碎片情况
python -c "import torch;print(torch.cuda.memory_allocated()/1024**3, torch.cuda.memory_reserved()/1024**3)"
降到 48 并开混合精度重试
python -c "print({'batch_size':48,'amp':True})"
随后设置按需增长减少预留冲突
python -c "import os;os.environ['PYTORCH_CUDA_ALLOC_CONF']='expandable_segments:True';print('set')"
等前面都确认过,再把大 batch 拆成梯度累积
python -c "print({'micro_batch':16,'accum':4})"
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
怎么算真的好了,看的是同一批现象。训练能连续跑完一个 epoch,显存峰值低于 15G,loss 曲线与 batch 32 时基本重合。
补一句。CUBLAS 分配失败通常不是总量不够而是连续空间不够,开可扩展段比单纯调小 batch 更有效。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
