VERL Framewrok

97 阅读3分钟

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
    • 优势:实现了控制流与计算流间的解耦,使得策略的代码切换变简单

image.png

image.png

image.png

image.png

  • 设计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中参数进行训练

 image.png

 image.png



  • Auto Device Mapping

    • 目标:找到模型放置+设备分配方案+并行策略配置的最优组合,使得一次完整的RLHF迭代的总执行时间最小化。​
    • 步骤:
      1. ​枚举所有模型分组放置方案,放置在同一GPU组的模型为一个共址组
      2. 根据模型大小计算每个共址组最小GPU需求
      3. 枚举每个共址组所有可行的设备分配策略
      4. 对每个共址组搜索其在给定A块GPU下满足ptd=A下最小执行延迟的方案(最优并行策略)。
      5. 计算特定放置方案、设备分配方案及最优并行方案下的端到端时延
      6. 选择端到端时延最小的方案。





  • FSDP vs Megatron

    • Megatron:组合多种并行策略​(张量并行、流水线并行、数据并行、序列并行)解决单设备无法容纳的模型计算与显存问题,目标是最大化硬件利用率,适用于超大规模LLM
    • FSDP:核心思想是参数完全分片(Fully Sharded),通过将模型参数、梯度、优化器状态分片存储在不同设备上,显著降低单卡显存占用,使普通硬件也能训练大模型