跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 11 — gradient accumulation 显存优化 trick

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列

    梯度累积把多个 micro-batch 的梯度先累加,再执行一次参数更新。它不让单次前向/反向传播承载完整的逻辑 batch,因此能用更小的瞬时显存近似更大的有效 batch。代价是完成一次 optimizer update 需要多次前反向计算,训练吞吐和状态更新频率也会变化。

    普通循环通常对每个 batch 都执行 zero_grad → forward → backward → step。梯度累积则把 optimizer.step()optimizer.zero_grad() 延后到累计若干个 micro-batch 之后。

    课程强调的动机不是“减少模型权重显存”,而是当大模型迫使 batch_size 变得过小时,用多个小 batch 形成较大的有效 batch,以缓解训练不稳定、收敛慢等问题。

    在单卡且没有其他并行因素时:

    Beffective=Bmicro×NaccumulationB_{\text{effective}}=B_{\text{micro}}\times N_{\text{accumulation}}

    Notebook 的最终实验使用 per_device_train_batch_size=1gradient_accumulation_steps=4,所以有效 batch 为 4。前一段对照代码使用 per_device_train_batch_size=4

    实验用随机生成的 1,024 条、序列长度 512 的分类数据和 bert-large-uncased。Notebook 保存的梯度累积运行结果为:训练约 102.82 秒、约 9.96 samples/s、GPU 占用 13,166 MB。视频约 07:45 口述“13G 对 20GB”的对比,但对照运行的完整 20GB 输出没有保存在 Notebook 中,不能把它写成已由当前文件复现的结果。

    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_steps
    loss.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-uncasedtransformersdatasets、PyTorch 和 NVML/pynvml。
    • Notebook 会训练模型并写入 output_dir="tmp";不能视为只读演示。
    • 代码设置本地代理 127.0.0.1:7890,在没有该代理的环境应移除或改写。
    • source_bundle 仅复制 Notebook,没有 ../imgs/grad-accumulation.png;主仓库中的相对图片存在。
    • 本次只做静态审计,没有重新执行 GPU 训练;保存输出来自原 Notebook。
    • 承接第 10 讲: 第 10 讲已进入大模型实践阶段,本讲把重点转到训练显存与 batch 设计。
    • 引出第 12 讲: 第 12 讲的 SFT 训练需要小 batch、量化和 PEFT;梯度累积是这类训练参数设计的基础。
    • 与第 13 讲互补: 梯度累积减少单步 batch 激活占用;梯度检查点通过反向时重算激活换显存,二者可组合但优化对象不同。
    1. 单卡上 batch_size=2gradient_accumulation_steps=8 时,有效 batch size 是多少?
    2. 为什么梯度累积不能减少模型权重和 optimizer state 本身的显存?
    3. 手写梯度累积循环时,optimizer.step()zero_grad() 应放在哪里?
    4. 课程中“13G 对 20GB”哪一部分由 Notebook 保存输出支持,哪一部分仅由视频口述支持?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。