深挖分布式训练

文摘   2024-09-13 18:17   新加坡  

我已经在github提交了一个repo深入介绍分布式训练的技术,里面有讲解和代码。

https://github.com/xinyuwei-david/david-share.git下的:Deep-Learning/Easy-way-to-Understand-Training,欢迎给repo点亮Star,您的点赞是作者持续创作的动力。

但为了方便读者理解,本文介绍一些相关技术的背景,作为该repo的导引。

一、分布式训练的两类切割(优化器和激活切割本文不详细展开讨论)

参数切割的方法

  1. Tensor Parallelism (TP)

  • 使用场景:适用于将大型模型的张量切分到多个设备上以减少单个设备的内存负担。

  • 特点:将模型的张量按维度切分。

  • 优点:有效利用多设备的计算能力。

  • 缺点:需要复杂的通信和同步机制。

  • 通信技术:主要使用allreduce来同步不同设备上的梯度。

  • Pipeline Parallelism (PP)

    • 使用场景:适用于深度模型,将模型按层或模块划分,适合长序列模型。

    • 特点:模型分成多个阶段,顺序执行。

    • 优点:减少内存占用,适合深度网络。

    • 缺点:存在流水线填充延迟,可能导致设备闲置。

    • 通信技术:使用send和recv进行阶段间的前向和后向通信。

  • Fully Sharded Data Parallel (FSDP)

    • 使用场景:适用于需要最大化内存效率的场景。

    • 特点:将模型参数(以及训练中的参数和优化器)在多个设备上分片。

    • 优点:显著减少内存占用。

    • 缺点:实现复杂,通信开销大。

    • 通信技术:使用allgather来收集完整的参数进行前向和后向传播,使用reduce-scatter来分散梯度。

  • Layer-wise Model Parallelism

    • 使用场景:适用于层次结构明显的模型。

    • 特点:将不同层分配到不同设备。

    • 优点:简单易实现。

    • 缺点:不适合所有模型架构。

    • 通信技术:根据具体实现,可能使用allreduce或send/recv。

  • Expert Parallelism

    • 使用场景:适用于Mixture of Experts模型。

    • 特点:不同专家模块分布在不同设备。

    • 优点:提高模型的灵活性和效率。

    • 缺点:需要复杂的路由机制。

    • 通信技术:可能使用alltoall来分配和收集专家模块的输出。

    数据的切割方法

    1. Data Parallelism (DP)

    • 使用场景:适用于大多数模型,尤其是数据量大时。

    • 特点:将数据集分成多个批次,分配到不同设备。

    • 优点:实现简单,易于扩展。

    • 缺点:每个设备需要完整的模型副本,内存占用大。

    • 通信技术:使用allreduce来同步每个设备上的梯度。

  • Distributed Data Parallel (DDP)

    • 使用场景:PyTorch中常用的数据并行实现。

    • 特点:利用多个GPU进行数据并行训练。

    • 优点:高效的梯度同步机制。

    • 缺点:需要良好的网络带宽支持。

    • 通信技术:高效的allreduce用于梯度同步。

  • Gradient Accumulation

    • 使用场景:适用于内存有限但需要大批次训练的场景。

    • 特点:累积多个小批次的梯度。

    • 优点:模拟大批次训练,减少内存需求。

    • 缺点:训练时间增加。

    • 通信技术:不涉及跨设备通信,但可能结合其他并行技术使用allreduce。

    4.Fully Sharded Data Parallel (FSDP)

      FSDP在数据切分方面和DDP没有明显的区别。FSDP实现全参数分片的关键在于,将DDP中的all-reduce操作分解为独立的reduce-scatter和all-gather操作。

      过优化通信操作来减少内存使用:

    • All-reduce操作:在标准DDP中,用于在所有设备之间同步梯度。这需要每个设备都持有完整的梯度副本,导致内存占用较高。

    • Reduce-scatter和All-gather操作

      • Reduce-scatter:将梯度分散到不同设备,每个设备只保留一部分梯度的和。

      • All-gather:在需要时收集完整的参数或梯度。

        通过将all-reduce分解为这两个操作,可以减少每个设备上同时需要存储的完整梯度和参数的数量,从而降低内存使用。这就是全参数分片的核心思想。


    切割参数主要用于训练阶段。通过将模型参数分布在多个设备上,可以有效减少单个设备的内存负担,支持更大规模的模型训练。在推理阶段,参数切割也可以用于优化推理速度和资源利用,但其主要目的是在训练过程中处理大规模模型。

    二、只切割参数是否可以做分布式训练?

    Tensor Parallelism (TP) 和 Pipeline Parallelism (PP) 通常可以与 Data Parallelism (DP) 结合使用,但这并不是必须的。让我们详细看看不同组合的区别:

    1. 只用 TP 和 PP

    特点

    • TP:将模型的张量切分到不同GPU上,减少单个设备的内存负担。

    • PP:将模型按层或模块划分,分配到不同主机上进行流水线式计算。

    优点

    • 内存优化:有效减少单个设备的内存占用。

    • 计算负载分配:更好地利用多设备的计算资源。

    缺点

    • 数据处理:每个设备需要访问完整的数据集,可能导致数据加载成为瓶颈。

    • 通信开销:需要处理设备间的通信和同步,增加复杂性。

    2. TP 和 PP 结合 DP

    特点

    • TP 和 PP:如上所述。

    • DP:将数据集分成多个批次,分配到不同设备上进行并行训练。

    优点

    • 内存优化:同样有效减少单个设备的内存占用。

    • 计算负载分配:更好地利用多设备的计算资源。

    • 数据处理:通过数据并行,减少数据加载瓶颈。

    缺点

    • 通信开销:增加了数据并行的通信开销,但通常可以通过高效的通信机制(如allreduce)来缓解。

    总结:

    不用 DP 的 PP 和 TP

    • 数据处理:每个设备需要完整的数据集,可能导致数据加载成为瓶颈。

    • 通信开销:主要集中在参数同步和梯度更新上。

    用 DP 的 PP 和 TP

    • 数据处理:通过数据并行,数据集被分成多个批次,减少了数据加载瓶颈。

    • 通信开销:增加了数据并行的通信开销,但整体训练效率更高。

    结合使用 TP、PP 和 DP 可以更好地优化分布式训练的效率和资源利用。虽然只用 TP 和 PP 也可以进行分布式训练,但结合 DP 可以进一步提高训练效率,减少数据加载瓶颈。


    三、FSDP=TP+DDP?

    Fully Sharded Data Parallel (FSDP) 确实可以看作是结合了 Tensor Parallelism (TP) 和 Data Parallelism (DP) 的一些特点,但它并不是简单的两者相加。让我们详细看看:

    FSDP 的特点

    1. 参数切割(类似于 TP)

    • FSDP 将模型的参数在多个设备上分片,以减少每个设备的内存负担。这与 TP 的做法类似,都是为了优化内存使用。

  • 数据并行(类似于 DP)

    • FSDP 也可以处理数据并行,通过将数据分配到不同的设备上进行训练。这与 DP 的做法类似,都是为了利用多设备的计算能力。

    主要区别

    • 通信机制:FSDP 使用了更复杂的通信机制,如 allgather 和 reduce-scatter,以确保参数和梯度的同步。这与传统的 TP 和 DP 有所不同。

    • 内存优化:FSDP 的设计目标是最大化内存效率,通过参数分片和数据并行的结合,显著减少内存占用。

    总结

    虽然 FSDP 结合了 TP 和 DP 的一些特点,但它有自己独特的实现方式和优化目标。因此,FSDP 不能简单地等同于 TP 和 DP 的组合,而是一个更复杂和高效的分布式训练方法。



    四、DP 和 FSDP 在切割上的根本区别

    Data Parallelism (DP)

    核心概念

    • 数据切割:将数据集分成多个小批次,每个批次分配到不同的设备上进行并行训练。

    • 模型副本:每个设备上都有完整的模型副本。

    • 梯度同步:每个设备独立计算梯度,然后使用 allreduce 等通信技术同步梯度,确保所有设备上的模型参数一致。

    优点

    • 实现简单:易于实现和扩展。

    • 计算效率:适用于大多数模型,尤其是数据量大时。

    缺点

    • 内存占用:每个设备需要完整的模型副本,内存占用较大。

    • 通信开销:梯度同步需要高效的通信机制。

    Fully Sharded Data Parallel (FSDP)

    核心概念

    • 参数切割:FSDP 的核心是将模型参数在多个设备上分片,以减少每个设备的内存负担。

    • 数据处理:虽然 FSDP 也可以处理数据并行,但它的主要目的是通过参数切割来优化内存使用。

    • 梯度同步:使用 allgather 和 reduce-scatter 等更复杂的通信机制来同步参数和梯度。

    关键区别

    1. 模型副本 vs. 参数分片

    • DP:每个设备上都有完整的模型副本,这意味着内存占用较大。

    • FSDP:每个设备只存储和计算一部分模型参数,通过参数分片显著减少内存占用。

  • 通信机制

    • DP:主要使用 allreduce 来同步梯度,通信相对简单。

    • FSDP:使用 allgather 和 reduce-scatter 等更复杂的通信机制来同步参数和梯度,通信开销较大但更高效。

  • 内存优化

    • DP:由于每个设备都有完整的模型副本,内存优化有限。

    • FSDP:通过参数分片,显著减少每个设备的内存负担,适合大规模模型训练。

    Data Parallelism (DP) 中的数据切割

    • 数据切割:在 DP 中,整个数据集被分成多个批次(batches),每个批次分配到不同的设备上进行并行训练。

    • 目的:通过将数据分配到多个设备上,利用多设备的计算能力来加速训练过程。

    Microbatch Size

    • microbatch size:指的是在每个设备上处理的更小的数据批次。通常在梯度累积(Gradient Accumulation)中使用。

    • 目的:通过累积多个小批次的梯度,模拟更大的批次训练,以减少内存需求。

    联系和区别

    • 联系:在 DP 中,每个设备处理的数据批次可以进一步分成多个 microbatches,以便进行梯度累积。这意味着 microbatch size 是在每个设备上的更小数据单位。

    • 区别

      • 数据切割(DP):将整个数据集分成多个批次,每个批次分配到不同的设备上。

      • microbatch size:在每个设备上处理的更小的数据批次,用于梯度累积

    总结

    虽然 FSDP 和 DP 在数据并行方面有相似之处,但 FSDP 通过参数分片和更复杂的通信机制,提供了更高效的内存使用和计算资源利用。这使得 FSDP 特别适合大规模模型的训练,而 DP 则更适合一般的并行训练任务。

    五、在分布式训练中,TP PP DP DDP FSDP 分别用什么通讯技术?

    在分布式训练中,各种并行技术使用不同的通信技术:

    1. Tensor Parallelism (TP)

    • All-Reduce:用于同步梯度。

    • All-Gather:用于收集分布在不同设备上的张量部分。

  • Pipeline Parallelism (PP)

    • Send/Receive:用于在设备之间传递中间激活值。

    • 同步机制:确保不同阶段的计算同步。

  • Data Parallelism (DP)

    • All-Reduce:用于在设备之间汇总和同步梯度。

  • Distributed Data Parallel (DDP)

    • All-Reduce:用于同步所有设备的梯度。

  • Fully Sharded Data Parallel (FSDP)

    • Reduce-Scatter:用于分散和同步梯度。

    • All-Gather:用于在需要时收集完整的参数。

      这些通信技术帮助在多设备环境中有效地共享和同步数据。


    六、allreduce与 allgather 和 reduce-scatter 有啥区别


    Allreduce

    • 功能:把每个设备上的数据加起来,然后把结果分发给所有设备。

    • 用途:常用于同步梯度,确保每个设备上的模型参数一致。

    • 例子:假设有四个设备,每个设备上有一个数值(比如 1, 2, 3, 4)。Allreduce 会把这些数值加起来(1+2+3+4=10),然后把结果 10 分发给每个设备。所以每个设备最后都会得到 10。

    Allgather

    • 功能:把每个设备上的数据收集起来,然后把所有数据分发给每个设备。

    • 用途:常用于需要每个设备都拥有完整数据的场景,比如在前向传播时收集完整的参数。

    • 例子:假设有四个设备,每个设备上有一个数值(比如 1, 2, 3, 4)。Allgather 会把这些数值收集起来,然后把 [1, 2, 3, 4] 这个列表分发给每个设备。所以每个设备最后都会得到 [1, 2, 3, 4]。

    Reduce-Scatter

    • 功能:先把每个设备上的数据加起来,然后把结果分散到各个设备上。

    • 用途:常用于分散计算任务,比如在反向传播时分散梯度。

    • 例子:假设有四个设备,每个设备上有一个数值(比如 1, 2, 3, 4)。Reduce-Scatter 会先把这些数值加起来(1+2+3+4=10),然后把结果分成四份(比如 2.5, 2.5, 2.5, 2.5),每个设备得到一份。所以每个设备最后都会得到 2.5。

    总结

    • Allreduce:加起来,然后分发给所有设备。

    • Allgather:收集起来,然后分发给所有设备。

    • Reduce-Scatter:加起来,然后分散给各个设备。


    七、Distributed Data Parallel (DDP) 和 Data Parallelism (DP) 的区别

    Distributed Data Parallel (DDP) 和 Data Parallelism (DP) 都是用于分布式训练的技术,但它们在实现细节和性能优化上有一些关键区别。以下是它们的主要区别:

    Data Parallelism (DP)

    核心概念

    • 数据切割:将数据集分成多个批次,每个批次分配到不同的设备上进行并行训练。

    • 模型副本:每个设备上都有完整的模型副本。

    • 梯度同步:每个设备独立计算梯度,然后使用 allreduce 等通信技术同步梯度,确保所有设备上的模型参数一致。

    优点

    • 实现简单:易于实现和扩展。

    • 计算效率:适用于大多数模型,尤其是数据量大时。

    缺点

    • 内存占用:每个设备需要完整的模型副本,内存占用较大。

    • 通信开销:梯度同步需要高效的通信机制。

    Distributed Data Parallel (DDP)

    核心概念

    • 数据切割:与 DP 类似,将数据集分成多个批次,每个批次分配到不同的设备上进行并行训练。

    • 模型副本:每个设备上都有完整的模型副本。

    • 梯度同步:使用更高效的梯度同步机制,通常通过 torch.distributed 包实现。

    关键优化

    • 通信效率:DDP 使用更高效的通信机制,如 bucket 梯度同步,减少通信开销。

    • 重叠计算和通信:DDP 可以在计算和通信之间进行重叠,进一步提高训练效率。

    • 故障恢复:DDP 提供了更好的容错机制,能够在节点故障时继续训练。

    优点

    • 高效通信:相比于传统的 DP,DDP 的通信效率更高。

    • 扩展性强:适用于大规模分布式训练,能够更好地利用多 GPU 和多节点环境。

    缺点

    • 实现复杂:需要配置和管理分布式环境,可能比传统的 DP 更复杂。

    Sentence Transformers实现了两种形式的分布式训练:数据并行(DP)和分布式数据并行(DDP)。有关这些策略的更多详细信息,请参阅Hugging Face上的数据并行文档。一些关键区别包括:

    • DDP通常比DP更快,因为它需要通信的数据更少。

    • 在DP中,GPU 0承担大部分工作,而在DDP中,工作更均匀地分布在所有GPU上。

    • DDP允许跨多台机器进行训练,而DP仅限于单台机器。

      简而言之,通常推荐使用DDP。你可以通过torchrun或accelerate运行正常的训练脚本来使用DDP。参考:https://sbert.net/docs/sentence_transformer/training/distributed.html


    总结

    • DP:适用于简单的多 GPU 训练,易于实现,但在大规模分布式训练中通信效率较低。

    • DDP:适用于大规模分布式训练,通信效率高,扩展性强,但实现和管理更复杂。


    新书已经上市,欢迎关注:


    大魏分享
    https://github.com/davidsajare/david-share.git
     最新文章