作者/机构: Yinmin Zhong1, Zili Zhang1, Bingyang Wu1, Shengyu Liu1, Yukun Chen2, Changyi Wan2, Hanpeng Hu2, Lei Xia2, Ranchen Ming2, Yibo Zhu2, Xin Jin1; 1北京大学 2阶跃星辰
本文旨在解决现有强化学习人类反馈(RLHF)训练系统在生产部署中GPU利用率低下的问题。核心问题源于RLHF训练的内在特性:生成阶段的数据倾斜(长尾效应)和训练阶段的流水线气泡。现有系统将RLHF流程中的每个任务视为最小执行单元,忽略了子任务级别的优化机会。
研究目标:提出一个名为RLHFuse的全新RLHF训练框架,通过将任务分解为更细粒度的子任务并进行阶段融合,来显著提升GPU利用率和训练吞吐量。
核心创新点:
1. 子任务级优化视角:首次提出将RLHF工作流从传统的任务级视角转变为更细粒度的子任务级视角,从而开辟了新的优化空间。
2. 数据感知的阶段间融合(Inter-Stage Fusion):
* 针对生成阶段由长尾样本导致的数据倾斜问题,RLHFuse将生成和推理任务拆分为样本级的子任务。
* 设计了一种轻量级迁移算法,在生成阶段进入低效的长尾处理阶段时,自动将剩余的长尾样本迁移到少数GPU上处理。
* 释放出的GPU资源被提前用于启动推理任务,实现了生成阶段和推理阶段的执行重叠,有效缓解了生成瓶颈。
3. 模型感知的阶段内融合(Intra-Stage Fusion):
* 针对训练阶段因流水线并行(PP)导致的大量气泡问题,RLHFuse将训练任务分解为微批次(micro-batch)级别的子任务。
* 利用RLHF训练阶段包含两个独立模型(Actor和Critic)的特性,设计了一种融合流水线调度策略,在同一组GPU上并发执行这两个模型的训练子任务,让它们相互填充对方的流水线气泡。
* 提出了一种轻量级的流水线调度生成算法,能够为任意规模和并行配置的Actor和Critic模型生成接近最优的调度方案。
4. 一系列系统优化:RLHFuse集成了针对RLHF各阶段的系统优化,使其成为一个高效且可扩展的生产级框架。
通过这些创新,RLHFuse与现有最先进系统相比,训练吞吐量最高可提升3.7倍。
RLHF模型构成:一个完整的RLHF过程通常涉及四个大语言模型(LLM):Actor、Ref、Critic和RW。
* Actor模型:是主要训练的模型,也是RLHF后的最终产品。在强化学习语义中充当代理(agent),其目标是生成符合奖励目标的动作(token)。
* Reference模型(Ref):由原始Actor模型初始化,但在训练期间被冻结(权重不更新)。它提供KL散度正则化,确保Actor模型在训练中不会与原始版本偏离过远。
* Reward模型(RW):在人类标记的偏好数据上训练,用于为Actor模型生成的每个样本打分,引导Actor生成符合人类偏好的响应。在RLHF训练期间也被冻结。
* Critic模型:由RW模型初始化,作为价值模型(value model)来评估Actor采取的动作。它提供更细粒度的动作级反馈,指导Actor做出更好的决策。
RLHF工作流:图1展示了RLHF单次训练迭代的工作流,包含三个主要阶段:生成、推理和训练。
* 生成阶段(Generation):Actor模型为当前批次的提示(prompts)生成响应。此过程包含一个处理提示的预填充(prefill)阶段和一个自回归地逐个生成token的解码(decoding)阶段。每个提示及其响应构成一个训练样本。
* 推理阶段(Inference):Ref、RW和Critic模型分别对生成的样本执行一次前向传播。这个过程类似于生成阶段的预填充,但不生成新token,其输出的logits用于在训练阶段计算损失。
* 训练阶段(Training):所有样本被划分为若干个小批量(mini-batches)。对于每个小批量,Actor和Critic模型首先执行前向传播,然后利用推理阶段的结果计算损失,并执行反向传播来更新参数。参数更新必须在下一个小批量前向传播之前完成。
LLM并行化:为了扩展训练,通常会结合使用三种正交的并行策略:
* 数据并行(Data Parallelism, DP):沿批次维度划分数据,每个模型副本处理一部分。每次迭代结束时,通过all-reduce通信同步梯度。
* 张量并行(Tensor Parallelism, TP):将计算密集型算子(主要是矩阵乘法)划分到多个GPU上加速计算。通信量大,通常在节点内使用。
* 流水线并行(Pipeline Parallelism, PP):将LLM的层划分为多个阶段(stage),每个阶段在不同设备上运行。通过将输入批次划分为多个微批次(micro-batch)形成流水线执行。通信开销远小于TP。
实践中,通常将这三种策略组合使用,记为(dp, pp, tp)。
生成阶段的数据倾斜:生成样本的响应长度呈现长尾分布,即每批中总有少数样本比其他样本长得多。由于数据依赖性,推理任务必须等待生成任务全部完成,导致即使只有少数长尾样本,也会迫使后续任务等待。这造成了严重的GPU资源浪费,因为LLM生成的解码阶段是内存密集型(memory-bound),需要大批量才能保持高GPU利用率。如图2(左)所示,在LMSYS-Chat-1M数据集中,不同模型的输出长度均呈现长尾分布,P99.9的长度是中位数的十倍以上。图2(右)展示了内部模型训练的迭代时间分解,生成长尾样本的时间(深蓝色条)占了总生成时间的一半以上,并且随着最大生成长度的增加,问题愈发严重。
训练阶段的流水线气泡:随着模型规模增大,需要更高的流水线并行度(PP)来扩展训练。然而,流水线气泡的比例随PP规模增加而增加,显著降低训练效率。在常用的1F1B流水线调度(如图3上)中,气泡比例为 (N-1)/(N-1+M),其中N是PP阶段数,M是微批次数。当N接近M时(这在训练数百亿参数模型时很常见),气泡比例接近50%,意味着一半的GPU处于空闲状态。尽管Interleaved 1F1B调度【索引16,Megatron-lm: Training multi-billion parameter language models using model parallelism,2020】能缓解此问题(如图3下),但它引入了额外的通信开销且加剧了PP阶段间的不平衡,因此实践中通常将交错因子K设为2,优化空间有限。其他旨在完全消除气泡的工作要么破坏了同步训练语义【索引25,Pipedream: Generalized pipeline parallelism for dnn training,2019,ACM SOSP】,要么依赖不切实际的假设【索引21,Zero bubble pipeline parallelism,2023,arXiv】。
1F1B:
Interleaved 1F1B:
总结:这些问题源于RLHF的固有特性,难以通过任务级优化解决。现有系统将任务视为最小执行单元,忽略了其内部结构,从而错失了巨大的优化机会。
RLHFuse通过将任务分解为更细粒度的子任务来解决上述问题,其架构如图4所示,主要包括两个核心组件:执行计划生成器和运行时执行器。
执行计划生成器:
G(V, E),其中节点 vi 代表任务,边 (v, v') 代表数据或权重依赖。vi 分配一个定制化的3D并行策略 Pi = (dp, pp, tp),以最大化GPU利用率。D = (N, M) 的概念,它是一个 N 个节点、每个节点 M 个设备的二维GPU网格,作为执行单个任务的单元。G*(V, E, P, D),该图包含了任务、依赖、并行策略和设备分配,可以直接部署到物理集群上。运行时执行器:
G*,在指定的设备网格上以相应的并行策略启动每个任务。4.1 机遇与挑战:
* 机遇:生成阶段和推理阶段之间的依赖关系是基于样本级别的。这意味着一旦一个样本完成了生成,它就可以立即进入推理阶段。这一关键观察促使我们将任务分解为样本级的子任务,从而在不违反原始同步训练语义的前提下,提前启动推理任务。
* 融合执行计划:基于此,我们设计了一个融合执行计划。该计划首先检测生成实例何时进入长尾解码阶段。此时,大多数样本已完成生成,但只有少数长尾样本在处理。我们将这些长尾样本迁移到少数指定的实例上,这样不仅整合了接收实例的GPU利用率,还释放了发送实例的资源。释放的资源可以立即用于提前启动推理任务,如图5所示,从而显著提高GPU利用率。
* 挑战:主要挑战在于生成一个高效的融合执行计划,该计划需要根据数据流图 G* 决定迁移的时机、目的地和机制,这三个因素都显著影响整体执行时间。此外,由于训练任务要求每个小批量数据保持相同的分布,需要从所有生成的样本中随机抽样,这引入了一个不可避免的同步边界,因此无法将这种融合扩展到推理和训练阶段之间。
4.2 融合执行计划:
该计划的目标是在不影响原始生成任务执行时间的前提下,最大化两个阶段的重叠,从而最小化总执行时间。
迁移触发:
Rt。当生成阶段的剩余样本数低于 Rt 时,触发迁移。Rt 的选择至关重要:太早触发会导致剩余的少数生成实例过载,延长生成时间;太晚则会失去大部分重叠机会。Rt 值,模拟每种情况下的执行时间,选择产生最小模拟执行时间的 Rt作为最优值。在运行时,我们还会结合新的生成样本来更新分布,并根据需要调整 Rt。迁移目的地:
n 个生成实例,我们需要选择 m 个实例来处理剩余样本。m 的确定基于两个约束:BSmax,每次解码迭代的延迟几乎不变【索引26,Distserve: Disaggregating prefill and decoding for goodput-optimized large language model serving,2024,arXiv】【索引27,Fast distributed inference serving for large language models,2023,arXiv】。因此,我们设置第一个约束 m >= Rt / BSmax,确保迁移后长尾样本的生成时间不变。m >= Rt * M / C,其中 M 是最大输出长度样本的KV缓存消耗,C 是目标实例为KV缓存分配的可用GPU内存。m 的最终值取这两个约束计算结果的最大值。m 个实例作为迁移目的地,这样需要迁移的样本总数最少。迁移机制:
n-m 个生成实例的GPU资源被释放,用于启动推理任务。一旦推理任务启动,完成生成的长尾样本可以流式传输到推理实例进行无缝处理。5.1 机遇与挑战:
* 机遇:在RLHF训练阶段,Actor和Critic模型是独立训练的。受Chimera的双向流水线调度【索引20,Chimera: efficiently training largescale neural networks with bidirectional pipelines,2021,SC】启发,我们可以将这两个训练任务分解为微批次的子任务,并将它们共同部署以相互填充流水线气泡。Chimera通过复制模型并以相反的流水线方向训练副本,来减少气泡并平衡激活内存(如图6(a))。RLHF训练阶段天然存在两个不同模型,使我们无需额外复制模型即可应用融合流水线调度。
* 挑战:Chimera中的双向流水线调度利用的是大小和并行策略完全相同的模型副本,导致执行流是对称的。而RLHF中的Actor和Critic模型是异构的,它们不仅大小不同,最优并行策略也不同。因此,Chimera的对称调度不再适用。我们需要一种能处理这种异构性的新算法。
5.2 融合流水线调度:
我们提出了一种轻量级高效的算法来自动生成异构模型下的融合流水线调度。
问题转化:假设模型A和B的并行策略分别为 (dp1, pp1, tp1) 和 (dp2, pp2, tp2)。当 tp1 != tp2 时,两个模型每个流水线阶段包含的GPU数量不同。我们假设 tp1 = s * tp2,我们将模型B每 s 个连续的流水线阶段合并为一个阶段,使其每个阶段的GPU数量与模型A相同。这要求 pp2 能被 s 整除,这在实践中很容易实现。之后,问题转化为融合 K1 个模型A的流水线组和 K2 个模型B的流水线组,其中 K1 和 K2 互质。图6(b)展示了 (K1, K2) = (1, 2) 的一个例子。
问题形式化:
S,其中 Sij 表示第 i 个阶段要调度的第 j 个子任务(微批次)。S 必须满足:C。S,使其总延迟最小。在延迟相同的调度中,优先选择峰值激活内存较低的。算法概述:
算法细节:
S0,其执行时间作为初始温度 T。ComputeNeighbor 子程序找到当前状态的一个邻近状态,并用 ComputeEnergy 计算其能量(延迟)。exp((ecurrent - eneighbor)/T) 的概率接受该状态。温度 T 在每次迭代后衰减。T 低于某个阈值时算法停止,返回搜索到的最优解 s*。
S 的执行时间。它使用带记忆的递归来计算每个阶段最后一个子任务的完成时间,并取其中的最大值。对于子任务 Sij,其开始时间取决于两个依赖:阶段间数据依赖(上游流水线阶段中同一微批次的任务完成)和阶段内数据依赖(同一阶段中前一个子任务完成)。其结束时间由这两者中的最大值加上自身的计算时间 lij 决定。
优化内存使用:在找到一个延迟优化的解 S* 后,我们以它为初始状态,再进行一轮模拟退火。这次,ComputeEnergy 函数被替换为计算峰值激活内存的函数。此外,我们只允许在邻近状态的延迟不恶化的情况下进行状态转移。通过这种方式,我们能得到一个在延迟和激活内存使用上都表现优异的解。
系统实现:
* 基础:RLHFuse基于Megatron-LM【索引16,Megatron-lm: Training multi-billion parameter language models using model parallelism,2020】实现,增加了约7000行Python、C++和CUDA代码。
* 扩展:扩展了Megatron-LM以支持多个设备网格,从而能以定制化的并行和部署策略异步启动不同任务。
执行计划生成器:
* 方法:采用“先建模后优化”的方法。我们构建了一个模拟器,能准确估计特定并行策略和工作负载下任务的运行时统计数据。然后,遵循Megatron-LM论文中的指导方针来修剪设计空间,并通过暴力搜索找到最优策略。
运行时执行器:
* 阶段间融合:使用上述模拟器选择最佳迁移阈值 Rt。
* 阶段内融合:使用MPI【索引35,Open mpi: Goals, concept, and design of a next generation mpi implementation,2004,Recent Advances in Parallel Virtual Machine and Message Passing Interface】并行化模拟退火搜索过程。找到最优解后,会为每个设备生成NCCL【索引36,Optimized primitives for collective multi-gpu communication,2024】操作序列,运行时按照此指令流执行。
系统优化:
* 生成阶段:
* 使用内部开发的、带有优化CUDA核的推理引擎。
* 支持连续批处理(continuous batching)【索引37,Orca: A distributed serving system for {Transformer-Based} generative models,2022,USENIX OSDI】,允许短样本提早离开批次。
* 支持前缀共享(prefix sharing)【索引38,Sglang: Efficient execution of structured language model programs,2024】,对共享相同提示的样本避免KV缓存的重复计算。
* 推理阶段:
* 优化了广义优势估计(Generalized Advantage Estimation, GAE)【索引39,High-dimensional continuous control using generalized advantage estimation,2018】的计算。原始的递归计算在输出序列长时会导致大量核函数启动。我们通过展开递归公式并预计算系数矩阵,将计算转化为单次矩阵乘法,将延迟从数十秒降至几十毫秒。
* 训练阶段:
* 为了解决不同DP组因数据倾斜导致负载不均的问题,我们根据样本的序列长度将每个小批量均匀地分配到各个DP组,以实现负载均衡。
* 任务切换:
* 主要开销在于模型权重的重新加载。对于Actor和Critic模型,我们采用类似all-to-all的方法【索引40,On optimizing the communication of model parallelism,2024】来最小化跨节点通信。
* 对于权重不变的Ref和RW模型,我们将其保存在CPU内存中,在需要时换入GPU内存,该交换过程可与前一个任务的计算重叠。
| 模型 | 参数量 | 层数 | 注意力头数 | 隐藏层维度 |
|---|---|---|---|---|
| LLaMA-13B | 13.0B | 40 | 40 | 5120 |
| LLaMA-33B | 32.5B | 60 | 52 | 6656 |
| LLaMA-65B | 65.2B | 80 | 64 | 8192 |
| 表2:LLM规格。 | ||||
我们将RLHFuse与以下RLHF训练框架进行比较:
* DeepSpeed-Chat (DSChat)【索引44,Deepspeed-chat: Easy, fast and affordable rlhf training of chatgpt-like models at all scales,2023】: 仅支持ZeRO-3数据并行。
* ReaLHF【索引13,Realhf: Optimized rlhf training for large language models through parameter reallocation,2024,arXiv】: 支持为每个任务定制3D并行策略,但未进行子任务级优化。
* RLHFuse-Base: 移除了阶段间和阶段内融合,但保留了所有其他系统优化的RLHFuse版本,用于公平比较融合技术带来的提升。
实验结论 (图7):
* vs. DSChat: RLHFuse的吞吐量高出2.5倍至3.7倍。这主要得益于RLHFuse灵活的执行计划生成器,能为每个任务选择最高效的3D并行策略。
* vs. ReaLHF: RLHFuse的吞吐量高出1.4倍至2.4倍。这归功于更细粒度的系统优化,特别是推理引擎中的定制化核函数和训练阶段的小批量负载均衡。
* vs. RLHFuse-Base: RLHFuse的吞吐量相对提升了1.2倍至1.4倍。这部分提升完全来自于阶段融合技术,它显著缓解了生成阶段的数据倾斜和训练阶段的流水线气泡问题。
实验结论 (图8):
* 生成+推理阶段 (Gen.+Inf.): 随着最大生成长度增加,长尾样本的处理时间足以让RLHFuse完全重叠推理阶段的执行,实现了1.2倍至1.6倍的加速。
* 训练阶段 (Train): 通过阶段内融合,RLHFuse极大地减少了流水线气泡,将训练阶段的执行时间缩短了1.2倍至1.3倍。
* 其他开销 (Others): 得益于任务切换的优化,这部分开销(包括数据传输、权重重分配和迁移开销)在总迭代时间中占比不到3%,可以忽略不计。
Rt 对融合性能的影响。如图9所示,当迁移比例(Rt/批大小)设置在20%左右时,融合后的生成和推理阶段总执行时间达到最优。这表明,在生成任务剩余约20%的样本时触发迁移,能最好地平衡迁移开销和重叠收益。
我们展示了一个由RLHFuse为65B/33B模型设置生成的融合流水线调度方案。
* GPU执行时间线 (图10上):RLHFuse策略性地将一个16个PP阶段的65B模型(蓝色)与两个各8个PP阶段的33B模型(粉色)融合,并以相反的流水线方向执行,从而相互填充气泡。最终,该融合调度的执行时间与单独使用1F1B调度执行65B模型的时间相同,这意味着33B模型的训练时间被完全重叠,达到了理论上的性能下界。
* 峰值激活内存 (图10下):该调度的峰值激活内存也达到了将两个模型用1F1B调度串行执行时的内存下界。
这个复杂的调度方案在时间和内存上都达到了最优,手动设计几乎是不可能的,进一步证明了我们提出的融合流水线调度生成算法的有效性。
本文提出了RLHFuse,一个用于LLM的高效RLHF训练框架。通过重新审视RLHF的内在特性和任务依赖,RLHFuse在保留原始同步训练语义的同时,从更细粒度的子任务级别视角来审视工作流。这为高效的阶段间和阶段内融合执行创造了机会,极大地缓解了现有系统中数据倾斜和流水线气泡的问题。评估结果表明,RLHFuse可以显著提高GPU利用率,与当前最先进的系统相比,训练吞吐量最高可提升3.7倍。
以下是在“方法细节”章节(§3, §4, §5, §6)中引用的参考文献及其在原文中的描述:
【13】Realhf: Optimized rlhf training for large language models through parameter reallocation (Z. Mei et al., 2024, arXiv)
【16】Megatron-lm: Training multi-billion parameter language models using model parallelism (M. Shoeybi et al., 2020)
【20】Chimera: efficiently training largescale neural networks with bidirectional pipelines (S. Li and T. Hoefler, 2021, SC)
【25】Pipedream: Generalized pipeline parallelism for dnn training (D. Narayanan et al., 2019, ACM SOSP)
【26】Distserve: Disaggregating prefill and decoding for goodput-optimized large language model serving (Y. Zhong et al., 2024, arXiv)
【27】Fast distributed inference serving for large language models (B. Wu et al., 2023, arXiv)
【28】Efficient memory management for large language model serving with pagedattention (W. Kwon et al., 2023, SOSP)
【29】Flow shop scheduling: theoretical results, algorithms, and applications (H. Emmons and G. Vairaktarakis, 2012)
【30】Optimization by simulated annealing (S. Kirkpatrick et al., 1983, science)
【33】Alpa: Automating inter- and Intra-Operator parallelism for distributed deep learning (L. Zheng et al., 2022, USENIX OSDI)
【34】Galvatron: Efficient transformer training over multiple gpus using automatic parallelism (X. Miao et al., 2022, VLDB Endowment)
【35】Open mpi: Goals, concept, and design of a next generation mpi implementation (E. Gabriel et al., 2004, Recent Advances in Parallel Virtual Machine and Message Passing Interface)
【36】Optimized primitives for collective multi-gpu communication (NVIDIA, 2024)
【37】Orca: A distributed serving system for {Transformer-Based} generative models (G.-I. Yu et al., 2022, USENIX OSDI)
【38】Sglang: Efficient execution of structured language model programs (L. Zheng et al., 2024)
【39】High-dimensional continuous control using generalized advantage estimation (J. Schulman et al., 2018)
【40】On optimizing the communication of model parallelism (Y. Zhuang et al., 2024)