虚拟流水并行

问题分析

流水线并行策略虽能有效分割模型,但在运行过程中仍存在较高的空泡率,影响了整体性能。

解决方案

为了解决这一问题,虚拟流水并行技术被提出,旨在通过进一步细分计算任务,降低空泡比率,提升训练效率。

解决思路

虚拟流水并行的核心在于,在不增加设备数量的前提下,将模型进一步细分为更多阶段,以增加通信量为代价,换取更低的空泡比率。在设备数量不变的情况下,分出更多的流水线阶段,以更多的通信量,换取空泡比率降低。
图1 虚拟流水并行示意图
例如,假设模型总层数为16,张量并行大小为1,流水线并行大小为4,虚拟流水线并行大小为2,则模型将被划分为4 * 2 = 8个阶段,每个阶段包含16 / 8 = 2个层。如下所示:
NPU 0: [1, 2] [9, 10]
NPU 1: [3, 4] [11, 12]
NPU 2: [5, 6] [13, 14]
NPU 3: [7, 8] [15, 16]

前向的顺序为NPU 0 -> NPU 1 -> NPU 2 -> NPU 3 -> NPU 0 -> NPU 1 -> NPU 2 -> NPU 3。

使用场景

虚拟流水并行技术适用于以下场景:

性能优化需求:旨在进一步降低空泡比率,提升模型训练的性能和效率。

使用方法

启用虚拟流水并行,需在训练脚本中加入以下参数配置:
--num-layers-per-virtual-pipeline-stage  N     # N表示每个虚拟流水线阶段的层数,要求模型总层数L % N == 0,且--pipeline-model-parallel-size > 2

使用效果

通过虚拟流水并行策略,成功降低了空泡比率,进一步提升了模型训练的性能和资源利用率

注意事项