在显存有限的条件下,如何通过工程手段实现大厂级的训练效果?本篇文档拆解了“空间换时间”的全部核心逻辑。
一、 Batch Size:模型“见识”的宽度
Batch Size(批大小) 是指模型在每一次参数更新前,一次性处理的样本数量。
1. 运作全流程:看 → 算 → 改
- 看 (Forward):一次读入 条数据。
- 算 (Loss/Gradient):计算这 条数据的平均损失,并推导出梯度的平均方向。
- 改 (Update):优化器根据这个“集体意见”动一次手术,更新参数 。
2. 设置依据与经验法则
- 物理天花板:受显存限制。物理 Batch Size 设多大,取决于显卡能塞下多少。
- 线性缩放 (Linear Scaling):Batch Size 越大,梯度越准。此时通常可以增大学习率 (LR),因为“方向准,油门可以踩得深”。
- 甜点位:对于大模型微调,等效 Batch Size 通常设定在 32 ~ 128 之间。
二、 梯度累加:小显存跑大 Batch 的黑科技
当理想的 Batch Size 超过显存容量时,我们采用**“分批记账,一次清算”**的战术。
1. 核心逻辑
- 只存不更:跑若干次小批次(物理 Batch),计算梯度但不更新参数,而是将梯度存储并不断累加。
- 周期清算:达到预设的累加步数(Steps)后,取累加梯度的平均值,由优化器执行一次参数更新。
2. 核心公式
等效 Batch Size = GPU数量 × 单卡物理 Batch × 梯度累加步数
3. 适用性边界
- Transformer 架构:✅ 完美适用。由于使用 LayerNorm,不依赖跨样本统计量。
- 带有 BatchNorm 的模型:⚠️ 慎用。物理 Batch 过小会导致归一化统计量失真。
三、 数据洗牌 (Shuffle) 与分组策略
同一组数据,不同的“喂养”顺序会产生截然不同的训练效果。
1. Shuffle (洗牌) 的必要性
- 打破序列依赖:防止模型学习到数据排列的虚假规律(如:先代码后诗歌会导致模型“学了后面忘了前面”)。
- Epoch 间重洗:每一轮复习(Epoch)都应重新打乱,让模型在不同组合中寻找共性,提升泛化能力。
2. Length Grouping (长度分组)
- 原理:将长度相近的文本分在同一个 Batch。
- 目的:减少无效的 Padding(补零),极大地提升计算效率,榨干显卡性能。
四、 知识点总结 (Q&A)
| 追问焦点 | 核心结论 |
|---|---|
| Batch Size 越大越好吗? | 不一定。太大可能导致模型掉进局部死循环,适度的随机噪声有助于跳出“坑”找到更优解。 |
| 梯度累加有副作用吗? | 主要是时间成本。参数更新频率降低,训练步数变少,可能需要适当延长训练周期。 |
| 为什么 Transformer 适合? | 它的归一化层(LayerNorm)是单样本独立的,不会因为物理 Batch 小而崩塌。 |
🛠️ 炼丹师备忘录
实战配置建议:
- 先把
per_device_train_batch_size设为显存能承受的最大值(如 4 或 8)。- 再通过
gradient_accumulation_steps凑够你想要的全局 Batch(如 32 或 64)。- 确保
shuffle=True,并开启混合精度训练以进一步优化空间。