大数跨境
0
0

Zero Redundancy Optimizer (ZeRO) 系列解析

Zero Redundancy Optimizer (ZeRO) 系列解析 Lisa聊外贸
2025-10-12
0
导读:在大模型训练中,显存瓶颈是制约模型规模的重要因素。DeepSpeed 推出的Zero Redundancy Optimizer(ZeRO) 系列,通过将模型状态(参数、梯度、优化器状态)分布到不同 G

📚分布式训练系列文章


数据并行VS模型并行VS混合并行

分布式训练原理与基础架构解析

数据并行训练实践:PyTorch&TensorFlow

模型并行训练策略:张量并行、流水线并行与混合并行

本文建议阅读时长:8分钟

在大模型训练中,显存瓶颈是制约模型规模的重要因素。DeepSpeed 推出的Zero Redundancy Optimizer(ZeRO) 系列,通过将模型状态(参数、梯度、优化器状态)分布到不同 GPU 上,实现显著的显存优化。

本文将详细介绍 ZeRO-1、ZeRO-2、ZeRO-3 的原理、区别与应用场景。

希望大家带着下面的问题来学习,我会在文末给出答案。

1.ZeRO 系列优化器的核心原理是什么?
2.ZeRO-1、ZeRO-2、ZeRO-3 有哪些区别?
3.不同 ZeRO 版本适合的应用场景是什么?


1. ZeRO 核心原理


ZeRO的全称为 Zero Redundancy Optimizer,意思是去除冗余的优化器,我们都知道在分布式训练中,主要的参数包括三部分:模型参数(Parameters)、优化器状态(Optimizer States)、梯度(Gradients),其中优化器状态会占据大约2倍参数量的显存空间,ZeRO 的目标就是 减少每个 GPU 的显存占用,从而支持更大模型训练。它通过 分布式存储模型状态 来降低冗余:

·传统数据并行问题
o每个 GPU 都保存完整的参数、梯度和优化器状态。
o对于千亿参数模型,这会导致显存占用过高,限制可训练模型规模。
·ZeRO 优化思路
o将模型状态按 GPU 分片(Shard),每个 GPU 只存自己负责的一部分。
o在前向和反向传播计算时,通过通信获取必要的参数和梯度,实现显存按需使用。


2. ZeRO-1:优化器状态分片


ZeRO-1仅将 优化器状态(如 Adam 的动量、平方梯度)分片到不同 GPU,参数和梯度仍是完整拷贝。

模型训练过程中正向传播和反向传播中并不会用到优化器状态,只有在梯度更新的时候才会使用梯度和优化器状态计算新参数,因此每个GPU单独使用一段优化器状态,对各自GPU的参数更新完之后,再把各个GPU的模型参数合并成完成的模型。

它的训练过程与DDP类似,forward过程由每个rank的GPU独自完整的完成,然后进行backward过程,在backward过程中,梯度通过AllReduce进行同步。

ZeRO-1使显存占用下降,支持更大 batch-size 或更大模型,并且实现简单,通信开销低,适用于模型参数较大,但优化器状态占显存比例高的场景


3. ZeRO-2:优化器状态 + 梯度分片


ZeRO第二阶段在 ZeRO-1 基础上,进一步将 梯度 分片。前向计算后,GPU 只保存本地梯度的部分,反向传播完成后通过 AllReduce 聚合梯度。

ZeRO显存节省比 ZeRO-1 更大,支持更大模型和更高 batch-size。AllReduce 用于聚合梯度,需要一定通信开销,但与显存节省相比收益明显。适用于模型参数大、梯度占用显存较多的场景,在多节点训练中尤为有效。


4. ZeRO-3:全模型状态分片


ZeRO-3将 参数、梯度、优化器状态 全部分片到不同 GPU。每个 GPU 只持有自己负责的模型片段,计算时通过通信获取必要片段。

ZeRO-3显存占用最低,理论上可以训练无限大模型(受通信和计算限制),支持千亿、万亿参数级别模型训练。参数和梯度都需要按需通信,通信开销较 ZeRO-1/2 高,需要精心设计分片策略和通信调度以提升效率。

适用于超大模型训练(千亿参数以上),多节点训练、大 batch-size、混合精度训练场景。


5.图解ZeRO


官方给出了一个5分钟的解释视频,我们一帧帧的看一下:

1. 我们拥有一个由 16 个 Transformer 块组成的模型,每个块都是一个完整的 Transformer 模块。 

2. 在训练中,我们使用一个大型数据集并借助 4 张 GPU 进行训练。 

3. 为此,采用了 三阶段分布式策略,对模型参数(Optimizer + Parameter + Gradient,简称 OPG)和数据同时进行切分与分配,使得它们分布在四张 GPU 上。 

4.每个模块下的方格表示该模块的显存占用情况:

·第一行:表示模型的 FP16 权重参数
·第二行:是用于反向传播的 FP16 梯度,用以更新权重;
·其余大部分绿色区域对应的是 优化器状态所占显存,包括 FP32 精度的梯度、副方差、动量以及参数。这些优化器状态在计算完 FP16 梯度后才会被加载使用。由于 ZeRO Stage 3 采用混合精度训练,因此在前向传播中模型参数均以半精度(FP16)进行计算。

此外,每个模块还需要分配一部分显存用于保存激活值(Activation),图中以蓝色部分表示。

5.在ZeRO3模式下,每张GPU仅负责模型的一部分参数,训练流程如下:

(1)参数广播与前向计算

·首先,GPU_0 将自己持有的模型分块权重 broadcast 给其他 GPU。



·所有 GPU 收到该权重后,除 GPU_0 外,其余 GPU 会将其暂存于缓存中。
·各 GPU 使用这部分参数在各自的数据上执行前向传播,并保存相应层的激活值。

·当前层的计算完成后,临时参数从除 GPU_0 外的所有设备中释放。

(2)依次广播其余分块

·接着,GPU_1 将其负责的参数广播给所有 GPU,并重复上述前向计算与释放过程。

·然后是 GPU_2、GPU_3 依次进行广播与计算,直到全部 16 个 Transformer 块的前向传播完成。此时,每张 GPU 都基于各自的数据计算出一个损失值。

(3)反向传播阶段

·反向传播从最后一个模型分块(假设在 GPU_3 上)开始。所有 GPU 载入该分块权重,利用之前保留的激活值计算梯度。
·其他 GPU 会将本地计算得到的该分块梯度发送至 GPU_3,用于梯度聚合与累积。最终,GPU_3 完成权重更新并保存更新后的参数。

·各 GPU 清理相应的临时权重、梯度和激活缓存。

(4)继续回传并更新前面的分块

·GPU_2 将其模型参数广播出去,其他 GPU 利用这些参数继续执行反向传播并计算梯度。
·重复该过程,直至每个 GPU 持有的分块都完成了梯度计算与参数更新。

(5)优化器更新与精度回写

·在所有 GPU 上并行启动优化器更新操作。
·优化器会先将模型权重转换为 FP32 精度执行权重更新,然后再转换回 FP16 精度,用于下一次迭代的前向传播。

至此,一个完整的 ZeRO3 分布式训练迭代完成。

最后,我们回答文章开头提出的问题

1.ZeRO 系列优化器的核心原理是什么?
通过将模型状态(参数、梯度、优化器状态)分片到不同 GPU,显存按需使用,显著降低每个 GPU 的显存占用,从而支持大模型训练。
2.ZeRO-1、ZeRO-2、ZeRO-3 有哪些区别?
·ZeRO-1:只分片优化器状态。
·ZeRO-2:分片优化器状态 + 梯度。
·ZeRO-3:分片优化器状态 + 梯度 + 参数。显存节省和通信开销随版本递增。
3.不同 ZeRO 版本适合的应用场景是什么?
·ZeRO-1:优化器状态占显存高的中大型模型训练。
·ZeRO-2:模型和梯度占显存高,多节点训练场景。
·ZeRO-3:超大模型(千亿参数及以上)、大 batch-size、多节点训练。

以上内容部分参考 DeepSpeed 官方文档和论文,非常感谢,如有侵权请联系删除!


作者:coting
分享是一种信仰,连接让成长更有温度。
我们下次不见不散!

【声明】内容源于网络
0
0
Lisa聊外贸
跨境分享吧 | 长期输出优质内容
内容 44193
粉丝 1
Lisa聊外贸 跨境分享吧 | 长期输出优质内容
总阅读228.0k
粉丝1
内容44.2k