
今天我们围绕这一个问题来讲讲为什么同样是 7B 模型普通 Data Parallel 放不下而 ZeRO / FSDP 却能把它拆开7B参数也就是七亿个参数如果使用adamFP16训练参数parameters大约14GB梯度gradients占14GBFP32 master weights占28GB,adam m占28GB,adam v占28GB这些数据都是估计的总共大约112GB还没有算activationcuda工作空间临时Buffer。注意这里为什么有FP32参数可以理解成FP32 精度更高可以减少低精度更新带来的数值误差。我们看看普通的DP7B模型8张GPU每张GPU大约80GB,每张GPU大概需要承担112GB所以根本放不下因为普通DP把同样的训练状态复制了8份。我们再看看ZeRO它将模型进行分片zero-1只切optimizer statesParameters → 复制Gradients → 复制Optimizer → 分片。刚才我们算的optimizer相关的大约占84GB8张GPU分片大约10.5GB,现在每张GPU大概只占141410.538.5GB下降十分明显zero它将模型参数和梯度仍然每张GPU一份但优化器状态不在重复保存。zero-2的Optimizer States Gradients 都切大约占26.25GB,zero-3全部切直接112/8直接降到原来的八分之一。我们都知道不可能只有好处没有坏处zero-3能实现显存的压缩是靠通信来换的。不分片 ↓ 显存占用高 ↓ 通信少 高度分片 ↓ 显存占用低 ↓ 需要更多通信现在我们再看看FSDPfully shared data parallel,完全分片的数据并行它的思想和zero-3非常接近那么它怎么计算呢假设有四张GPU一个layer参数P被拆成P0,P1,P2,P3,分配到四张GPU当某个layer需要forwardall gather获得完整的Pforward。大致流程Shard ↓ All-Gather ↓ Compute ↓ Reshard ↓ Shard举个实际例子比如说有一套书一共有四本你先要看全部的书都是你只有买一本书的钱所以你可以再找三个想要买书的人一人买一本然后换着看唯一的缺点就是需要和别人换这就是通信换显存。大型模型训练通常不会只依赖一种并行技术而是多种组合。LLM │ ┌────────┼────────┐ ↓ ↓ ↓ TP PP ZeRO │ │ │ 拆矩阵 拆Layer 拆状态