Lazy loaded image
记录-DeepSpeed框架分布式训练(一)
字数 3292阅读时长 9 分钟
2025-7-26
2025-10-15
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份完整的模型才能进行。如下图,数据并行时,每一份数据都会对应一份完整的模型。
      notion image
      所以,最终我们需要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并行学习记录,欢迎您在底部评论区留言,一起交流~
    上一篇
    记录-Pytorch框架分布式训练(三)
    下一篇
    记录-Ollama模型部署调用

    评论
    Loading...