跑微调时最常见的卡点是:调大 batch size 就爆显存,调小又训练抖动、loss 下不去,还搞不清该不该用梯度累积凑等效批量。这篇不堆公式,按「先估显存 → 再定批量 → 最后看曲线」的顺序,给你一套能直接照做的排查和调整路径,也说明什么情况下这套思路不适用。
跑微调最常见的卡点是:调大 batch size 就直接爆显存,调小又训练抖动、loss 下不去,还搞不清该不该用梯度累积凑一个等效批量。这篇不堆公式,按「先估显存 → 再定批量 → 最后看曲线」的顺序,给你一套能直接照做的路径。
先说清一件事:batch size 不是一个孤立参数,它和序列长度、学习率、并行卡数绑在一起。你只动它一个,别的不动,训练行为的变化往往不是你预期的那一种。下面每一节都尽量给可执行的判断标准和动作。
batch size 到底动了哪几根弦
它同时影响三件事:单步显存占用、梯度里的噪声大小、以及每个 epoch 的更新次数。这三者经常互相拉扯——你把批量调大,显存涨、梯度更稳,但更新次数少了,收敛反而变慢。所以不存在一个「最优 batch size」,只有针对你当前显存和训练目标的取舍。
显存里被 batch 直接放大的是激活值,权重和优化器状态基本不随 batch 变化。这意味着小模型、浅层结构更容易「加得动」,而大模型往往是激活值先撑不住。另外要区分场景:同样叫 batch size,全量微调和 LoRA 这类参数高效微调的含义不一样,后者可用的上限通常高得多。
- 单步显存
- batch 越大,前向激活值占的显存越多,是最先撞墙的部分
- 梯度噪声
- batch 越小,单步梯度越抖,训练曲线越毛糙
- 更新次数
- batch 越大,同样数据量下参数更新次数越少,收敛步数变多
先按显存定上限,再谈调参
- 单步跑通把 batch size 设成 1,跑通一个完整的前向加反向 step,记录峰值显存和单步耗时,这是后面所有倍数的基准。
- 逐档放大从基准往上翻倍去试,每档都完整跑一遍,记录峰值显存,遇到吃紧或报错就退回上一档,别一上来就设一个中间值。
- 固定序列长度放大期间序列长度保持不变,否则你分不清显存涨是 batch 还是长度造成的。
序列长度对显存的拉动往往比 batch size 更猛,两者要一起看。长样本建议先降 batch,或者改成分桶打包,把长度接近的样本凑在一起,减少填充浪费。算不准卡数和显存就先去站内 /models/deploy 按模型和量化方式过一遍,再结合 /compute/sizing 估算。
显存不够时,用梯度累积凑等效批量
梯度累积的意义是拿时间换显存:小批量多步累加,得到接近大批量的梯度效果。但代价是优化器状态的更新频率变了——等效批量翻倍,但你每个 epoch 里真正更新参数的次数少了。很多人换了大批量之后不收敛,问题就出在这里。
| 现象 | 可能原因 | 先动的参数 |
|---|---|---|
| 换大批量后 loss 不降 | 学习率没跟着调 | 先提学习率,再动累积步数 |
| 显存还够但训练很慢 | 累积步数设太大 | 降累积步数,加单卡 batch |
| 累积后曲线更抖 | 等效批量其实没变大 | 核对单卡 batch 乘累积步数 |
累积步数不是越大越好。超过一定范围后再往上加,梯度质量的收益很小,训练时长却几乎线性上涨。判断点在于:加一档之后曲线形态没有再变稳,就说明这一档已经不划算了。
怎么判断当前批量是偏小还是偏大
看曲线要固定其他变量,并且看足够长的窗口,短窗口的波动不足以说明问题。loss 抖得厉害、时不时出现尖刺,通常说明 batch 偏小或学习率偏高,先降学习率再考虑动 batch。loss 长期平、下降很慢但很稳,可能是 batch 偏大导致更新次数太少,可以减小批量或适当提高学习率。
- 先固定学习率和数据顺序,只观察,不改参数
- 抖且尖刺:优先降学习率,学习率降完还抖再考虑加 batch
- 平且稳但慢:优先减小批量或提高学习率,别直接加训练轮数
- 改完一个变量至少看够长的一段曲线再下结论
- 小数据集上这套经验会明显失效,曲线噪声本身就很大
分辨不清是批量的问题还是学习率的问题时,永远先动学习率——它的影响更直接,也更容易回退。
一份可执行的调整顺序
- 记录基准单卡 batch 设 1 跑通,记录峰值显存和单步耗时。
- 逐倍放大逐步翻倍,显存吃紧或报错就退回上一档,确定单卡上限。
- 补等效批量显存到顶还不够大,开梯度累积,并同步重设学习率。
- 跑短训练看形态跑一轮短训练看曲线,再决定是调批量还是调学习率。
- 重算全局批量多卡并行时单卡 batch 与全局 batch 是两回事,改卡数后必须重算等效批量。
要提醒的是,这套顺序在多机多卡、序列长度差异极大、或者用了特殊并行策略时会打折扣,显存瓶颈可能不在激活值上。这时候优先看框架的显存报告,而不是继续按倍数试。想对照不同模型的资料和部署条件,可以到站内 /models 和 /models/deploy 核对当时的数字,价格与配置这类会变的信息不要凭记忆下判断。
下一步拿你正在跑的任务按上面的顺序走一遍,把峰值显存和曲线形态记下来;再对照站内模型资料确认当前配置是否还有余量。→常见问题
batch size 调大是不是一定训练更快?
不一定。单步确实更省时间,但每轮更新次数变少,达到同样效果所需 epoch 可能更多,总体时长不一定下降。显存吃紧时还可能被迫降序列长度或加梯度检查点,反而更慢。建议用短跑对比总耗时,而不是只看单步速度。
没有大显存,是不是就没法训大模型?
不是。梯度累积、LoRA 这类参数高效微调、以及量化训练都能把门槛压下来,代价是训练时间变长或效果上限略有差异。先明确你的显存预算,再决定用哪种组合,具体配置测算可以到 /compute/finetune 对照不同方案的取舍。
换个 batch size 就要重跑全部实验吗?
通常不用推倒重来,但学习率往往要跟着调,否则曲线形态会变。稳妥做法是固定数据与随机种子,只改批量和学习率两项做小规模对照,确认趋势后再上全量。若数据集很小或任务本身噪声大,这种对照的结论参考价值会打折。