因为 ZeRO-3 把参数本身也切碎了,导致每次前向和反向传播都要频繁地 All-Gather 参数。而 ZeRO-1 和 ZeRO-2 只在特定阶段通信,频率和量都小得多。
| ZeRO-1 | ZeRO-2 | ZeRO-3 | |
|---|---|---|---|
| 切分对象 | 优化器状态 | 优化器状态 + 梯度 | 优化器状态 + 梯度 + 参数 |
| 前向传播通信 | 无 | 无 | 每层 All-Gather 参数 |
| 反向传播通信 | 无 | 每层 Reduce-Scatter 梯度 | 每层 All-Gather 参数 + Reduce-Scatter 梯度 |
| 参数更新通信 | All-Gather 参数 | All-Gather 参数 | All-Gather 参数 |
关键区别:ZeRO-1 和 ZeRO-2 在前向/反向传播过程中不需要通信参数,因为每个 GPU 都有完整参数副本,可以独立计算。而 ZeRO-3 没有完整参数,算每一层之前都得先把这层的参数从其他 GPU 收集过来。
可以,而且这通常是 ZeRO-3 在显存极度紧张时的标准“救命”配置。ZeRO-3 本身已经通过切分参数、梯度和优化器状态把显存占用压得很低了,但当你连切分后的那部分都放不下,或者想在一张卡上跑更大的模型时,就需要配合 Offload 把数据进一步挪到 CPU 内存甚至 NVMe 硬盘上。
在 DeepSpeed 的配置里,ZeRO-3 主要支持把两块东西 Offload 出去:
评论专区
评论加载中...登录后即可发表评论