ZeRO-3 和模型并行(Model Parallelism)虽然在形式上都将模型参数分散到多个设备上,但它们的设计哲学、通信机制和对模型代码的侵入性有本质区别。
两者最根本的差异在于 “通信的内容” 和 “计算的方式”:
ZeRO-3 通信的是“参数” :每个设备在计算某一层时,会临时从其他设备拉取(All-Gather) 该层完整的参数。拿到完整参数后,每个设备都会独立地、完整地处理自己那一批数据。计算完该层后,又会释放掉不属于自己的参数以节省显存。
模型并行通信的是“激活值” :模型的不同部分被永久地放置在不同设备上(比如张量并行是把一层切开,流水线并行是把不同层分开)。计算时,设备之间传递的是中间计算结果(激活值),而不是参数本身。每个设备只负责计算模型的一小部分。
尽管名字里有“分片”,但 ZeRO-3 本质上属于数据并行(Data Parallelism)的范畴,是一种内存优化技术。
它解决的是传统数据并行中模型状态(参数、梯度、优化器状态)在每个 GPU 上冗余存储的问题。传统数据并行下,每个 GPU 都有一份完整的模型副本。ZeRO-3 则把这些模型状态切碎,分给各个数据并行进程,从而大幅降低单卡显存占用,但计算逻辑和流程依然是数据并行的(即每个进程处理不同的数据)。
而模型并行(如张量并行、流水线并行)则是为了突破单层或单个设备无法容纳模型的物理限制,需要重构模型的计算图。
为了方便大家理解,我把它们的核心差异整理成了表格:
| 对比维度 | ZeRO-3 | 模型并行 (Model Parallelism) |
|---|---|---|
| 本质归属 | 改进的数据并行 | 模型并行(张量/流水线) |
| 分片对象 | 优化器状态、梯度、参数 | 模型结构(层或张量维度) |
| 通信内容 | 参数(临时拉取完整层) | 激活值(中间计算结果) |
| 代码侵入性 | 极低,通常无需修改模型代码 | 高,需要重写模型计算逻辑 |
| 主要目标 | 消除数据并行中的显存冗余 | 突破单设备显存限制,让超大模型能跑起来 |
| 计算特点 | 每个设备用完整层处理不同的数据 | 多个设备协作处理同一批数据的不同部分 |
ZeRO-3 和模型并行并不是竞争关系,而是互补的。在训练超大模型时,常见的做法是结合使用:用张量并行解决单层参数过大的问题,用流水线并行把不同层放到不同节点,再用 ZeRO-3 来消除数据并行组内的显存冗余。
评论专区
评论加载中...登录后即可发表评论