返回关卡地图
闯关题:0 / 2 XP 0 / 200

Level 27 | 零基础导学关卡

ZeRO Optimizer Sim

先用小例子把必要知识学会,再用 2 道闯关题检查理解,最后回到 notebook 写真正的 PyTorch 作业。

27_ZeRO_Optimizer_Sim.ipynb ZeROOptimizer StateSharding
概念输入
闯关检查
Notebook 作业
ZeRO-1: states; ZeRO-2: +grads; ZeRO-3: +params
Mission 1 TODO 1 / TODO 2

ZeRO:把优化器状态切给不同 GPU

先补的知识

  • Adam 等优化器会为参数保存额外状态。
  • 每张卡都保存完整状态会浪费显存。
  • ZeRO 把参数或优化器状态按 shard 分给多张卡。

图解原理

多人共同保管一本大账本,每个人只负责自己的几页,需要时再同步完整结果。

GPU0: 参数 0-3GPU1: 参数 4-7GPU2: 参数 8-11

语法热身:用参数列表划分负责范围

params = list(model.parameters())
half_idx = len(params) // 2
gpu_partitions = {
    0: params[:half_idx],
    1: params[half_idx:],
}

闯关题

ZeRO 分片的直接目的是什么?

回到 notebook 的作业

这里不直接写答案。你已经拿到足够输入,最后用 notebook 的 TODO 做举一反三。

Mission 2 TODO 3 / TODO 4

局部更新:单机模拟里原位修改就是同步

先补的知识

  • 每张卡只遍历自己负责的参数列表。
  • TODO 3 要更新局部动量并用动量更新参数。
  • TODO 4 在本 notebook 中不需要写代码,只要理解真实多卡需要把更新后的权重同步出去。

图解原理

本练习里每个 p 都是同一个 Parameter 的引用;你原位改 p.data,模型里的参数也同步变了。

GPU0 负责 fc1GPU1 负责 fc2p.data 原位更新真实多卡才需要广播

语法热身:遍历本 GPU 参数和梯度

for p, g in zip(params, grads):
    momentum = states[id(p)]
    momentum = momentum + g
    states[id(p)] = momentum
    p.data = p.data - lr * momentum

闯关题

为什么 notebook 的 TODO 4 不需要额外写 All-Gather 代码?

回到 notebook 的作业

这里不直接写答案。你已经拿到足够输入,最后用 notebook 的 TODO 做举一反三。

完成 2 道闯关题后,本关即算完成;作业 checklist 用来辅助你回 notebook 练习。
进度只保存在当前浏览器 localStorage,分享 HTML 不会带走你的记录。
上一关:L26 下一关:L28