Prhub

#7369 [sglang] fix: make DeepSeek-V4 full weight sync work with SGLang + Megatron

原始 PR 作者 ChangyiYang 合并时间 2026-09-01 21:03 文件变更 3 提交数 2 评论 8 代码增减 +126 / -9

执行摘要

修复 SGLang 权重同步中 DeepSeek-V4 融合参数跨桶断裂问题。

根据 PR body 和评论,主要动机是解决两个阻塞点:

  1. SGLang 环境固定了旧版 Transformers(5.3.0),不识别 deepseek_v4 模型类型(注:该部分因即将升级 Transformers 而被回退)。
  2. SGLang 在加载 DeepSeek-V4 权重时,会在一个 load_weights 调用中拼接两个张量(如 wq_a.weight 和 wkv.weight),但原有的基于字节的分桶逻辑可能将这两个张量分开到不同的桶中,导致 SGLang 内部的加载器缓存未清空断言失败(assert len(cache_wqkv_a_weight) == 0)。

实现拆解

变更主要分为以下步骤:

  1. 定义融合组:在 verl/workers/rollout/sglang_rollout/utils.py 中,新增常量 _DEEPSEEK_V4_FUSION_MEMBERS 和 DEEPSEEK_V4_FUSION_GROUPS,明确列出了 DeepSeek-V4 模型中需要保持在同一桶内的所有参数对后缀,覆盖了注意力层(self_attn/attn)的权重、缩放因子以及相关压缩器的权重,同时包含 FP8 量化的 .scale 和 .weight_scale_inv 两种命名。
  2. 改造分桶逻辑:修改核心函数 get_named_tensor_buckets,为其新增可选参数 fusion_groups。函数内部引入一个 staged 字典来暂存已识别但未集齐的融合组成员。新增内部函数 _place 来处理不可分割的张量组(如完整的融合组)的放置逻辑。只有当融合组的所有成员都到达后,才会作为一个整体尝试放入当前桶。
  3. 条件调用入口:在 verl/workers/rollout/sglang_rollout/sglang_rollout.py 的 update_weights 方法中,根据 self.model_config.hf_config.model_type 是否为 `
文件 模块 状态 重要度
verl/workers/rollout/sglang_rollout/utils.py verl/workers modified 7.78
tests/checkpoint_engine/test_sglang_fusion_bucketing_on_cpu.py sglang/fusion/bucketing/on/cpu added 7.7
verl/workers/rollout/sglang_rollout/sglang_rollout.py verl/workers modified 5.85

关键符号

_fusion_key _place _tensor _buckets collect test_deepseek_v4_fusion_group_stays_in_one_bucket test_fusion_grouping_is_opt_in_for_non_deepseek_models test_deepseek_v4_incomplete_group_fails_loudly

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

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

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

风险与影响

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论