HybridFlow
-
解决问题:
- 传统DRL模型较小,单进程可容纳计算流,但现在随着模型增大,计算流变成了一个多进程方式(分布式训练)
- 单控制器调度开销大:需管理节点内分布式计算,仅支持参数量较小的模型
- 多控制器嵌套耦合问题:计算层与通信层深度绑定、修改单节点需重构全流程。
-
采用单控制流+多计算流的分层混合架构Hybrid Programming Model
-
核心范式:将训练流程抽象为数据流图
-
控制流:
- 位于high_level,描述多个模型之间的交互逻辑(e.g. actor generation -> critic&reward model evaluation -> models update)
- 实现:采用ray架构,通过远程过程调用 (RPC) 协调不同模型的执行顺序,并沿数据流传输数据(中间数据存储在 TensorDict [57] 中)
-
计算流
- 位于low_level,描述单个模型角色内部计算流程(e.g. forward/backward propagation、optimizer update)
- 实现:每个模型函数在独立进程上运行,控制消息从各控制器的 CPU 进程传递至对应 GPU,支持FSDP、Megatron-LM
-
优势:实现了控制流与计算流间的解耦,使得策略的代码切换变简单
-
-
设计3D-HybridEngine
-
挑战:RLHF要求Actor模型在训练阶段(数据并行)和生成阶段(流水线并行) 间动态切换,传统方法需存储多份参数副本会导致内存爆炸
-
解决方案:
-
张量3D视图:将模型参数划分为 (PP×TP×DP)三维分片p-t-d(training)及pg-tg-dg-d(generation)
- dg:生成时模型副本数量与训练时模型副本数量之比。
- 同一micro dp组内容所有gpu持有完全相同的模型权重。
-
动态重组:训练→生成切换时,仅重构分片索引而非移动数据(通信量下降10-100×)
-
零冗余****分片方式:** **所有设备仅存储当前分片权重,无需副本(节省30%-60%显存)
-
-
实现:双缓冲区机制
-
buffer_gen:存储生成阶段的权重
-
buffer_train:存储训练阶段的权重
-
流程:
- step1:训练结束后,通过NCCL拼接buffer_train中的模型参数形成micro DP中的buffer_gen参数
- step2:生成阶段,模型使用buffer_gen中的参数,但gpu中仍存储着buffer_train参数
- step3:生成结束,将buffer_gen参数以及KV-cache卸载到CPU(对于multi-turn情况,可能需要将kv-cache从CPU重新加载到GPU)
- step4:训练阶段,直接使用buffer_train中参数进行训练
-
-
-
Auto Device Mapping
- 目标:找到模型放置+设备分配方案+并行策略配置的最优组合,使得一次完整的RLHF迭代的总执行时间最小化。
- 步骤:
-
-
- 枚举所有模型分组放置方案,放置在同一GPU组的模型为一个共址组
- 根据模型大小计算每个共址组最小GPU需求
- 枚举每个共址组所有可行的设备分配策略
- 对每个共址组搜索其在给定A块GPU下满足ptd=A下最小执行延迟的方案(最优并行策略)。
- 计算特定放置方案、设备分配方案及最优并行方案下的端到端时延
- 选择端到端时延最小的方案。
-
-
FSDP vs Megatron
- Megatron:组合多种并行策略(张量并行、流水线并行、数据并行、序列并行)解决单设备无法容纳的模型计算与显存问题,目标是最大化硬件利用率,适用于超大规模LLM
- FSDP:核心思想是参数完全分片(Fully Sharded),通过将模型参数、梯度、优化器状态分片存储在不同设备上,显著降低单卡显存占用,使普通硬件也能训练大模型