AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 DeepSpeed 框架中的 3D 并行技术。作者首先说明 3D 并行结合了流水线并行 (PP)、张量并行 (TP) 和数据并行 (DP) 三种方法,并解释了它们各自的作用。接着,文章通过一个例子详细说明了如何计算所需的 GPU 数量,强调在组合这些并行维度时不能随意指定。最后,作者提醒在使用流水线并行时,阶段拆分最好设为 2 的倍数,并注意各阶段的输入输出限制。
URL
type
status
date
slug
summary
tags
category
icon
password
此篇博客主要记录DeepSpeed框架分布式训练的理论思想和使用例子,不会涉及到DeepSpeed框架训练、推理、压缩和科学计算四个核心模块。这四个核心模块会在其他主题中记录。DeepSpeed实现了3D并行和ZeRO并行。本篇博客主要记录3D并行。DeepSpeed的ZeRO并行将在DeepSpeed框架分布式训练(二)中记录。如果内容有错误的地方,请大家及时在评论区留言,谢谢大家!
📝 3D并行
什么是3D并行?
3D并行中的3指的是3中并行方法,D指的是维度(以维度理解是为了便于大家计算GPU数量)。
名称 | 含义 |
PP | 流水线并行,用于将模型划分成多个阶段。 |
TP | 张量并行,用于将模型参数拆分。 |
DP | 数据并行,用于将数据拆分,可以理解为将一个batch_size拆分为多个mirco_batch_size。 |
上述的三种方法分别和Pytorch中的PP、TP和DP理论相似,这里博主不在详细记录。伙伴们可以查看Pytorch框架分布式训练系列的博客。
Tips
- 3D并行中的D指的是维度。因此,在计算需要多少张显卡时,不能随意指定。
eg:假设我们现在想要实现流水线并行。Deepspeed的流水线并行需要将模型分为不同阶段(简单理解为分层),将不同阶段分发到不同的GPU上(假设模型分为4个阶段,需要4张GPU)。在训练时,通过通信协议进行数据传播。
如果我们的GPU资源充足,想要在流水线并行的基础上增加数据并行。假设我们想要2份数据进行数据并行,那么数据并行将batch_size拆分为batch_size/2。数据并行的前提是模型的完整性,所以2份数据并行,需要2份完整的模型才能进行。如下图,数据并行时,每一份数据都会对应一份完整的模型。

所以,最终我们需要4*2=8张GPU进行。
- 在使用流水线并行时,拆分阶段,请尽量设置成2的倍数。
在处理流水线并行时,需要注意以下问题:
- 流水线并行拆分的各个阶段(Stage)的输入和输出只能是单个张量或者一个张量元组。
- 在实现流水线并行时,我们需要注意各个GPU负载均衡。不可以某个GPU负责很多层,某个GPU只负责一层等。
- 模型有些层是共享的,在构建流水线模型时,如何处理这些共享层。
- CPU内存优化问题:在使用pytorch的Sequential进行序列化后实现流水线并行时,每个GPU节点会在CPU备份一个完整的模型。这种情况会导致CPU内存占用暴增。
DeepSpeed针对上诉问题做了一些优化。接下来,我们一起了解DeepSpeed的优化方法。
流水线并行优化
这里博主使用DeepSpeed官方提供的案例进行记录。
- 输入和输出
模型经过序列化后,输入和输出只能是单个张量或者一个张量元组。以transformer的attention_block为例(简写):
- GPU负载均衡
DeepSpeed的流水线对象提供了设置负载均衡的partition_method参数-[parameters,uniform,type:[attention_block]]。其中,parameters按照参数量划分阶段,uniform按照层均匀划分阶段,type:[attention_block]按照层名划分阶段。
- CPU内存优化
博主将DeepSpeed优化的方法和普通方法进行对比,观察CPU内存占用率,发现对应的线程并没有太大的差距。以下是博主的代码,如有问题请及时指正!
- 模型层共享
PP、TP和DP如何结合起来一起使用?
PP和DP
因为博主只有两块GPU,在测试PP和DP时,博主将PP的num_stages设置为1(即每个GPU节点拷贝一个完整的模型,但是可以设置micro_batch_size)。
模型推理输出结果:
PP和TP
DeepSpeed中的TP和PP不能一起使用,会报错。AssertionError: mpu must be None with pipeline parallelism。mpu是设置张量并行的参数。所以,我们需要自己实现相应的张量并行(TP),以及GPU间的通信。同时,我们利用DeepSpeed的并行拓扑结构进行管理。代码如下(因为博主只有两个GPU,所以流水线并行阶段设置为1,张量并行设置为2,数据并行设置为1):
TP和DP
如果你的GPU资源充足,可以直接将data_parallel_size设置为2。
PP和TP和DP
如果你的GPU资源充足,可以直接将pipeline_stages、tensor_parallel_size和data_parallel_size都设置为2。
🤗 总结归纳
以上便是博主对DeepSpeed的3D并行进行的粗糙学习记录,有一些地方博主也是半知半解,就没有深入应用。博主想在一些地方进行函数重写,能够更好的展示deepspeed相关组件功能。奈何博主看deepspeed代码,看的有点头疼,有一些地方没有看懂。等看懂后,博主再对该篇论文补充。
📎 参考文章
以上便是DeepSpeed的3D并行学习记录,欢迎您在底部评论区留言,一起交流~
- 作者:不爱吃香菜的萌新
- 链接:https://hexo.levsongsw.com//deeplearn/DeepSpeed1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





