Prhub

#7397 [veomni, vllm] feat: Allow gptoss ep with veomni

原始 PR 作者 wyettzeng 合并时间 2026-09-03 06:18 文件变更 4 提交数 5 评论 0 代码增减 +186 / -11

执行摘要

为 VeOmni 后端启用 GPT-OSS 模型的专家并行 (EP) 训练支持。

本 PR 的动机是启用 GPT-OSS 模型在 VeOmni 后端下的专家并行 (EP) 训练能力。正如 PR body 中所述,目标是 "Enable gpt-oss RL training with veomni EP for gpt-oss family model",并需与 vLLM 的相应 PR (https://github.com/vllm-project/vllm/pull/52209) 配合。此前,VeOmni 对 GPT-OSS 模型的 EP 模式存在硬性限制(抛出 NotImplementedError),无法进行权重同步。本 PR 通过实现专用的参数处理函数解决了这一限制。

本 PR 值得精读,尤其是 verl/workers/engine/veomni/utils.py 中的新处理函数和调度逻辑变更。它清晰地展示了如何通过策略模式扩展参数导出框架以支持新模型。核心设计决策(如强制使用流式处理器进行 delta 导出)及其背后的理由(与 vLLM 加载器集成)是关注重点。建议重点审查:

  1. 新处理函数与 enumerate_hf_slots 的集成是否健壮;
  2. veomni_shard_export 中对 GPT-OSS 模型的特殊处理是否会意外影响其他模型;
  3. 示例脚本中的配置(如 EP/TP 大小)是否合理且有良好文档。
讨论亮点

本 PR 的 Review 评论为空,仅包含一个无评论的 APPROVED 状态。主要的技术决策和讨论点体现在代码的演进和实现细节中:

  • 核心设计决策:从抛出 NotImplementedError 改为提供新的参数处理函数 streamed_gpt_oss_moe_param_handler,是支持 GPT-OSS EP 的关键。这解决了 vLLM 加载器对参数格式的特定要求。
  • delta 导出路径的考量:veomni_shard_export 函数中对于 GPT-OSS 模型,无论 ep_enabled 状态如何,均强制使用 streamed_gpt_oss_moe_param_handler。注释明确指出,delta 导出必须按专家行可分离,而旧的打包处理器无法满足此要求。这是一个重要的技术权衡。
  • 与 vLLM 的协同:PR body 中明确提及了依赖的 vLLM PR,强调了这是一个跨项目的协作功能,其正确性依赖于上游 vLLM 的变更。

实现拆解

  1. 引入新的参数处理函数:在 verl/workers/engine/veomni/utils.py 中新增 streamed_gpt_oss_moe_param_handler 函数。该函数按逐行(专家)的方式导出 GPT-OSS 模型的融合 MoE 参数,并将全局专家 ID 插入键名中。这是因为 vLLM 的 GPT-OSS 加载器需要这种流式格式,且融合的键名不包含尾部的 .weight 后缀。
  2. 修改参数处理调度逻辑:更新 get_moe_param_handler 函数。当模型类型为 gpt_oss 且 EP 启用时,不再抛出 NotImplementedError,而是返回新定义的 streamed_gpt_oss_moe_param_handler。同时,修改 veomni_shard_export 函数,确保即使在 EP 禁用的情况下,对于 GPT-OSS 模型也使用新的流式处理函数,因为 delta 导出路径需要能按专家行分离参数。
  3. 添加单元测试:在 tests/utils/veomni/test_moe_param_export_on_cpu.py 中新增测试用例 test_gpt_oss_ep_streams_global_experts_in_checkpoint_layout。该测试验证了新处理函数在 EP 启用时,能正确地将本地专家分片映射到全局专家 ID,并生成符合预期的参数名和形状,同时也验证了与 enumerate_hf_slots 函数的集成。
  4. 补充使用示例与文档:新增了完整的端到端训练脚本 examples/grpo_trainer/run_gpt_oss_20b_veomni.sh,展示了如何配置 VeOmni EP 与 vLLM EP 的参数。同时更新了 examples/grpo_trainer/README.md 的模型支持矩阵,标记 GPT-OSS-20B 在 VeOmni 后端下已获得支持。
文件 模块 状态 重要度
verl/workers/engine/veomni/utils.py VeOmni 引擎 modified 7.49
tests/utils/veomni/test_moe_param_export_on_cpu.py MoE 测试 modified 5.87
examples/grpo_trainer/run_gpt_oss_20b_veomni.sh 训练脚本 added 5.42
examples/grpo_trainer/README.md 训练示例文档 modified 1.72

关键符号

streamed_gpt_oss_moe_param_handler get_moe_param_handler veomni_shard_export

关键源码片段

verl/workers/engine/veomni/utils.py core-logic

核心变更文件,实现了新的参数处理函数并修改了调度逻辑,是功能启用的关键。

# 新增函数,用于在 EP 模式下导出 GPT-OSS 融合 MoE 参数
# 按行(专家)导出,并将全局专家 ID 插入键名,适配 vLLM 加载器格式
def streamed_gpt_oss_moe_param_handler(name, tensor, expert_id_base):
    """Export GPT-OSS fused projections one global expert at a time.
​
    The vLLM GPT-OSS loader consumes the original checkpoint orientation and
    interleaved gate/up layout, so this handler only inserts the global expert
    id into the key and selects the corresponding row. In particular, these
    fused checkpoint keys do not have a trailing ``.weight`` component.
    """
    for local_expert_id in range(tensor.size(0)):
        expert_id = expert_id_base + local_expert_id
        # 仅替换一次 "mlp.experts." 以插入全局专家 ID,保持原键名结构(无 .weight)
        expert_name = name.replace("mlp.experts.", f"mlp.experts.{expert_id}.", 1)
        yield expert_name, tensor[local_expert_id].to(get_device_id(), non_blocking=True)
​
# 修改后的调度函数:GPT-OSS + EP 启用时返回新的流式处理器
def get_moe_param_handler(model_type, ep_enabled):
    """Resolve the checkpoint export handler for the current MoE layout."""
    if model_type == "gpt_oss" and ep_enabled:
        return streamed_gpt_oss_moe_param_handler
    return MOE_PARAM_HANDERS.get(model_type, default_moe_param_handler)
​
# veomni_shard_export 函数中,对于 GPT-OSS 模型,无论 EP 状态如何,均使用流式处理器
# 这是为了确保 delta 导出路径也能按专家行分离参数
process_func = (
    streamed_gpt_oss_moe_param_handler
    if model_type == "gpt_oss"
    else get_moe_param_handler(model_type, ps.ep_enabled)
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 依赖兼容性风险:本功能强依赖特定版本的 vLLM(脚本注释提及 vLLM 0.28.0 或更高版本)。用户若使用不兼容的 vLLM 版本进行 EP 训练,可能导致权重加载失败或运行时错误。
  2. 参数格式变更风险:streamed_gpt_oss_moe_param_handler 输出的参数名格式(无 .weight 后缀)与 default_moe_param_handler 不同。这改变了 GPT-OSS 模型在 EP 模式下的检查点导出格式。虽然这是为了适配 vLLM,但可能影响依赖旧格式的下游工具或工作流。
  3. Delta 权重同步路径变更:veomni_shard_export 函数的逻辑变更影响了所有 VeOmni 用户在 delta-sharded 权重同步时的行为。虽然注释解释了这是为了支持 GPT-OSS,但需确保该变更不影响其他模型(如使用 default_moe_param_handler 的模型)的正确性。
  1. 用户影响:直接惠及使用 GPT-OSS 模型和 VeOmni 后端的用户。他们现在可以利用专家并行(EP)来提升大 MoE 模型的训练吞吐量和内存效率。提供了一个完整的、可直接使用的端到端训练脚本。
  2. 系统影响:扩展了 VeOmni 引擎的能力范围,使其能更好地支持 GPT-OSS 这一类具有特定 MoE 参数布局的模型。增强了框架在分布式训练场景下的灵活性和兼容性。
  3. 团队影响:该贡献展示了如何通过扩展参数处理框架来适配新模型架构。其测试和示例为未来类似模型的集成提供了参考。但同时,也引入了对特定 vLLM 版本的依赖,可能增加跨项目协调的维护成本。
依赖特定 vLLM 版本 检查点导出格式变更 核心导出路径逻辑修改

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论