资料摘要:personal chatgpt 11 — gradient accumulation 显存优化 trick
本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列。
梯度累积把多个 micro-batch 的梯度先累加,再执行一次参数更新。它不让单次前向/反向传播承载完整的逻辑 batch,因此能用更小的瞬时显存近似更大的有效 batch。代价是完成一次 optimizer update 需要多次前反向计算,训练吞吐和状态更新频率也会变化。
1. 普通训练与梯度累积
Section titled “1. 普通训练与梯度累积”普通循环通常对每个 batch 都执行 zero_grad → forward → backward → step。梯度累积则把 optimizer.step() 和 optimizer.zero_grad() 延后到累计若干个 micro-batch 之后。
课程强调的动机不是“减少模型权重显存”,而是当大模型迫使 batch_size 变得过小时,用多个小 batch 形成较大的有效 batch,以缓解训练不稳定、收敛慢等问题。
2. 有效 batch size
Section titled “2. 有效 batch size”在单卡且没有其他并行因素时:
Notebook 的最终实验使用 per_device_train_batch_size=1、gradient_accumulation_steps=4,所以有效 batch 为 4。前一段对照代码使用 per_device_train_batch_size=4。
3. 实验与证据边界
Section titled “3. 实验与证据边界”实验用随机生成的 1,024 条、序列长度 512 的分类数据和 bert-large-uncased。Notebook 保存的梯度累积运行结果为:训练约 102.82 秒、约 9.96 samples/s、GPU 占用 13,166 MB。视频约 07:45 口述“13G 对 20GB”的对比,但对照运行的完整 20GB 输出没有保存在 Notebook 中,不能把它写成已由当前文件复现的结果。
公式 / 代码
Section titled “公式 / 代码”training_args = TrainingArguments( per_device_train_batch_size=1, gradient_accumulation_steps=4, **default_args,)trainer = Trainer(model=model, args=training_args, train_dataset=ds)trainer.train()手写循环还应考虑按累计步数缩放 loss,以保持与大 batch 平均损失的梯度尺度一致:
loss = model(**batch).loss / accumulation_stepsloss.backward()if (step + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad()后一个除法是对课程伪代码意图的规范化表达;实际 Trainer 会按其实现管理累计与缩放。
| 时间 | 内容 |
|---|---|
| 00:00 | 引入 gradient accumulation,说明它是小而实用的显存优化技巧 |
| 00:47 | 对比每个 batch 更新一次与累计多个 batch 后再更新 |
| 01:43 | 说明小 micro-batch 如何形成更大的有效 batch |
| 02:18 | 普通训练循环与 optimizer.step() 的位置 |
| 03:31 | 梯度累积循环:多个 batch 共用一次参数更新 |
| 07:45 | 口述 13GB 与 20GB 的显存对比 |
| 08:08 | 总结:用梯度累积缓解显存压力 |
- 运行标签:conditional。 需要 CUDA、可下载
bert-large-uncased、transformers、datasets、PyTorch 和 NVML/pynvml。 - Notebook 会训练模型并写入
output_dir="tmp";不能视为只读演示。 - 代码设置本地代理
127.0.0.1:7890,在没有该代理的环境应移除或改写。 source_bundle仅复制 Notebook,没有../imgs/grad-accumulation.png;主仓库中的相对图片存在。- 本次只做静态审计,没有重新执行 GPU 训练;保存输出来自原 Notebook。
与前后讲关系
Section titled “与前后讲关系”- 承接第 10 讲: 第 10 讲已进入大模型实践阶段,本讲把重点转到训练显存与 batch 设计。
- 引出第 12 讲: 第 12 讲的 SFT 训练需要小 batch、量化和 PEFT;梯度累积是这类训练参数设计的基础。
- 与第 13 讲互补: 梯度累积减少单步 batch 激活占用;梯度检查点通过反向时重算激活换显存,二者可组合但优化对象不同。
- 单卡上
batch_size=2、gradient_accumulation_steps=8时,有效 batch size 是多少? - 为什么梯度累积不能减少模型权重和 optimizer state 本身的显存?
- 手写梯度累积循环时,
optimizer.step()与zero_grad()应放在哪里? - 课程中“13G 对 20GB”哪一部分由 Notebook 保存输出支持,哪一部分仅由视频口述支持?
- 视频:gradient accumulation 显存优化 trick
- 转录:🔒 personal chatgpt 11 视频转录
- 课件 / 代码:🔒 gradient_accumulation.ipynb
- 滴答清单抓取时学习状态:已完成。
- 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
- notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。