记录一下那天晚上的排查过程。训练时 nvidia-smi 显示显卡利用率在 25% 到 40% 之间波动,step 时间比预期长了一倍。

刚开始盯着「频繁在 CPU 与 GPU 之间拷贝张量」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。数据加载慢,GPU 在等 batch。也可能是批太小导致每次计算量不足。

不容易想到的是,日志或检查点写入阻塞了主循环。

第一件事是看采样与显存拷贝的耗时占比

python -m torch.utils.bottleneck train.py

增加 worker 并开启锁页内存

loader = DataLoader(ds, batch_size=32, num_workers=8, pin_memory=True)

接着把日志与保存操作移出主循环

if step % 100 == 0: log_async(metrics)

适当增大批大小提升单步计算量

python train.py --batch_size 64

同一份数据我导出了两份,一份留底,一份拿来试。

怎么算真的好了,看的是同一批现象。GPU 利用率稳定在七成以上,单步耗时明显下降,整体训练时间缩短三分之一。

容易忽略的是,利用率低不一定是数据问题,序列长度差异大时也会出现长尾等待,先做一次性能剖析再动手改。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189