链载Ai

标题: 分布式训练:DeepSpeed 与 Zero 数据并行 [打印本页]

作者: 链载Ai    时间: 13 小时前
标题: 分布式训练:DeepSpeed 与 Zero 数据并行

前言

随着大模型时代的到来,数据规模,计算量,模型参数等各方面都有巨大的增长,这给训练大模型带来了一些挑战:
本文主要从大模型时代的分布式训练出发,主要讨论以数据并行为核心的 DeepSpeed Zero 优化。

三大并行策略

并行技术可以整体划分为两类:数据并行(DP)流水线并行(PP)以及张量并行(TP)

1 数据并行(DP)

数据并行是在小模型时代(BERT)最常用的并行方法,在模型不是非常大的情况下,优先使用数据并行。

2 流水线并行(PP)与张量并行(TP)

当模型过大时,一张卡无法容纳一个模型时,就会考虑使用流水线并行以及张量并行,二者的区别在于对模型参数切分方向不同。

2.1 流水线并行

模型并行此处也可以称为流水线并行,详细的流水线解释可以参见:https://zhuanlan.zhihu.com/p/613196255。

2.2 张量并行

 

DeepSpeed 与 Zero

什么是Deepspeed?

Deepspeed 现在已经是大模型标配了,其是微软发布的大规模分布式训练工具,专门用来训练大模型。
Deepspeed Zero 是 Deepspeed 的核心组件,本质上是一种显存优化的数据并行方案。

Deepspeed Zero 的核心思想

混合精度训练阶段,ZERO 将训练中占显存的参数分为两部分:


zero的优化思想为:针对模型状态部分,Zero 使用的方法是分片,即每张卡只存
的模型状态量,N是GPU个数 。但是本质上 ZERO 仍然属于一种数据并行方案。
一个常用的结论如下:

 

Deepspeed 的优化细节

  1. Deepspeed Zero Stage 1

针对 Adam 状态进行分片,此时每张卡模型状态所需显存变成了。我们以单机8卡,7B模型为例,此时模型状态部分所需显存 降低到 4 * 7 + (12*7)/8 = 38.5GB
  1. Deepspeed Zero Stage 2

在Zero-1 的基础上,针对模型梯度再次分片,此时每张卡模型状态所需显存变成了  同样以单机8卡,7B模型为例,此时模型状态部分所需显存降低到 2*7+(14*7)/8=26.25GB
  1. Deepspeed Zero Stage 3

在Zero-2的基础上,对模型参数也进行分片,此时每张卡模型状态所需显存变成了
同样以单机8卡,7B模型为例,此时模型状态部分所需显存降低到 16*7/8=14GB
  1. Zero-offload

核心思想:显存不足,内存来补,用时间来换空间。Zero-offload 核心是在 Zero-2的基础上将Adam状态,梯度转移到 CPU内存。一般情况下不推荐。

一点补充

注意,Deepspeed 优化的是模型参数,梯度,Adam状态所占的显存,而实际上,正如我在 大模型:训练时GPU显存不足怎么办中提到的,激活值同样占用着巨大的显存,此外还有一些其他的显存碎片。
以 qwen 1.5 为例,per_gpu_batch_size=1,seq_length=2048,精度bf16 时所需显存为 28.5G(粗略估计),此时即使用 Deepspeed zero 3(非常慢) ,都需要 28.5+14=42.5GB 显存。
这意味着在大模型时代中,如果不引入流水线并行和张量并行的情况下,V100-32G 和 A100-40G 对 7B 的模型训练都非常吃力。

最后

在大多数情况下,我们往往会使用 Deepspeed Zero 2 ,主要是考虑到训练效率的问题。
Deepspeed 是大模型时代必会的工具,推荐大家熟练使用。
最后给大家推荐一个常用的微调仓库,我本来想自己写一套,后来发现开源模型发展太快了,所以我现在也是无脑掉开源框架:https://github.com/hiyouga/LLaMA-Factory

参考

https://zhuanlan.zhihu.com/p/513571706






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5