Prhub

#1874 [docker] upgrade sglang to v0.5.10.post1

原始 PR 作者 zhuzilin 合并时间 2026-04-30 14:53 文件变更 35 提交数 10 评论 0 代码增减 +1624 / -1847

执行摘要

升级 sglang 至 v0.5.10.post1,新增 PD Mooncake 测试与 HF 配置修补

为支持 GLM-4.7 和 Qwen3.5 等新模型,需要升级 sglang 至最新版本并适配其 API 变更;同时,Megatron 桥接在加载 HF 模型时缺少 rope_theta 等配置项,需要自动修补以避免训练中断。

建议重点关注 megatron_bridge_utils.py 的新增函数,它们简化了模型加载配置;验证 PD Mooncake 测试的稳定性;升级后建议进行回归测试覆盖现有模型。

讨论亮点

无审核评论,但提交历史显示多次 bugfix 迭代(如修复网络 host 模式、Qwen3MoE 问题),表明升级过程中遇到了多个兼容性问题并逐一解决。

实现拆解

  1. 升级 sglang 依赖:更新 docker/patch/latest/sglang.patchdocker/version.txt,适配 sglang v0.5.10.post1 的 API 变化。
  2. 新增 HF 配置修补工具:在 slime/utils/megatron_bridge_utils.py 中添加 patch_hf_config_for_megatron_bridgepatch_auto_bridge_hf_config 函数,自动从 rope_parametersrope_scaling 中提取 rope_theta 并注入配置对象,同时处理嵌套 text_configPretrainedWrapper 结构。
  3. 添加 PD Mooncake 集成测试:新增 tests/test_glm4.7_30B_A3B_pd_mooncake.pytests/test_qwen3_30B_A3B_pd_mooncake.py,验证单节点 PD+Mooncake 模式下训练流程的正确性。
  4. 修复共享权重映射:在 slime_plugins/mbridge/qwen3_5.py 中修改 _adjust_mapping_for_shared_weights 方法,当 tie_word_embeddings 为真时重定向 output_layer.weight 到合适的嵌入层。
  5. 调整 CI 工作流:更新 .github/workflows/pr-test.yml.github/workflows/pr-test.yml.j2,增加 privileged 权限以支持 docker 操作,并调整测试矩阵。
文件 模块 状态 重要度
slime/utils/megatron_bridge_utils.py 桥接配置 modified 7.7
tests/utils/test_megatron_bridge_utils.py 单元测试 added 7.49
tests/test_glm4.7_30B_A3B_pd_mooncake.py 集成测试 added 7.62
tests/test_qwen3_30B_A3B_pd_mooncake.py 集成测试 added 7.23
slime_plugins/mbridge/qwen3_5.py 权重映射 modified 6.41
docker/patch/latest/sglang.patch 补丁文件 modified 5.98
.github/workflows/pr-test.yml CI 配置 modified 5.76

关键符号

patch_hf_config_for_megatron_bridge patch_auto_bridge_hf_config _adjust_mapping_for_shared_weights

关键源码片段

slime/utils/megatron_bridge_utils.py core-logic

新增核心配置修补逻辑,自动补充 HF 模型配置中的 rope_theta,确保与 Megatron 桥接兼容。

from contextlib import contextmanagertry:
    from megatron.core.utils import unwrap_model
except ImportError:
    unwrap_model = None# 核心函数:修补 HF 配置,确保 Megatron 桥接能读取 rope_theta 等字段
def patch_hf_config_for_megatron_bridge(hf_config):
    configs = []
    seen_config_ids = set()
​
    def add_config(config):
        # 去重并收集所有需修补的配置对象
        if config is None or id(config) in seen_config_ids:
            return
        seen_config_ids.add(id(config))
        configs.append(config)
​
    add_config(hf_config)
    add_config(getattr(hf_config, "config", None)) # 支持 PretrainedWrapper
​
    # 递归处理嵌套的 text_config(如视觉语言模型)
    for config in list(configs):
        add_config(getattr(config, "text_config", None))
​
    # 从 rope_parameters 或 rope_scaling 中提取 rope_theta
    for config in configs:
        rope_params = getattr(config, "rope_parameters", None) or getattr(config, "rope_scaling", None)
        if isinstance(rope_params, dict) and "rope_theta" in rope_params and not hasattr(config, "rope_theta"):
            config.rope_theta = rope_params["rope_theta"]
​
    return hf_config# 快捷函数:修补 bridge 对象中的 hf_pretrained 配置
def patch_auto_bridge_hf_config(bridge):
    hf_pretrained = getattr(bridge, "hf_pretrained", None)
    if hf_pretrained is not None:
        patch_hf_config_for_megatron_bridge(hf_pretrained)
    return bridge@contextmanager
def patch_megatron_model(model):
    # 原有上下文管理器,未变
    ...
tests/utils/test_megatron_bridge_utils.py test-coverage

对新增的配置修补函数进行完整单元测试,覆盖各种配置嵌套和回退场景。

import types
import pytest
from slime.utils.megatron_bridge_utils import patch_auto_bridge_hf_config, patch_hf_config_for_megatron_bridge@pytest.mark.unit
def test_patch_hf_config_adds_rope_theta_from_rope_parameters():
    # 验证能从 rope_parameters 中提取 rope_theta
    hf_config = types.SimpleNamespace(rope_parameters={"rope_theta": 1000000})
    patched_config = patch_hf_config_for_megatron_bridge(hf_config)
    assert patched_config is hf_config
    assert hf_config.rope_theta == 1000000@pytest.mark.unit
def test_patch_hf_config_does_not_override_existing_rope_theta():
    # 验证不覆盖已存在的 rope_theta
    hf_config = types.SimpleNamespace(rope_theta=500000, rope_parameters={"rope_theta": 1000000})
    patch_hf_config_for_megatron_bridge(hf_config)
    assert hf_config.rope_theta == 500000@pytest.mark.unit
def test_patch_hf_config_handles_nested_text_config():
    # 处理嵌套的 text_config(如多模态模型)
    text_config = types.SimpleNamespace(rope_parameters={"rope_theta": 10000})
    hf_config = types.SimpleNamespace(text_config=text_config)
    patch_hf_config_for_megatron_bridge(hf_config)
    assert text_config.rope_theta == 10000@pytest.mark.unit
def test_patch_hf_config_handles_pretrained_wrapper_config():
    # 处理 PretrainedWrapper 结构(config 字段内层包裹)
    wrapped_config = types.SimpleNamespace(rope_parameters={"rope_theta": 10000})
    hf_pretrained = types.SimpleNamespace(config=wrapped_config)
    patch_hf_config_for_megatron_bridge(hf_pretrained)
    assert wrapped_config.rope_theta == 10000@pytest.mark.unit
def test_patch_hf_config_uses_rope_scaling_fallback():
    # 回退到 rope_scaling 字段
    hf_config = types.SimpleNamespace(rope_scaling={"rope_theta": 10000})
    patch_hf_config_for_megatron_bridge(hf_config)
    assert hf_config.rope_theta == 10000@pytest.mark.unit
def test_patch_auto_bridge_hf_config_patches_hf_pretrained():
    # 验证 patch_auto_bridge_hf_config 能正确修补 bridge 中的 hf_pretrained
    hf_config = types.SimpleNamespace(rope_parameters={"rope_theta": 12345})
    bridge = types.SimpleNamespace(hf_pretrained=hf_config)
    patched_bridge = patch_auto_bridge_hf_config(bridge)
    assert patched_bridge is bridge
    assert bridge.hf_pretrained.rope_theta == 12345
tests/test_glm4.7_30B_A3B_pd_mooncake.py test-coverage

新增 GLM-4.7 模型在 PD+Mooncake 模式下的端到端训练测试,验证新版本 sglang 和配置修补的集成。

"""GLM-4.7-Flash colocated training test with single-node PD + Mooncake."""
import os
import tempfile
import yaml
import slime.utils.external_utils.command_utils as UMODEL_REPO = "zai-org/GLM-4.7-Flash"
MODEL_NAME = "GLM-4.7-Flash"
MODEL_TYPE = "glm4.7-30B-A3B"
NUM_GPUS = 8def prepare():
    # 下载模型、数据集并转换为 Megatron 格式
    U.exec_command("mkdir -p /root/models /root/datasets")
    U.exec_command(f"hf download {MODEL_REPO} --local-dir /root/models/{MODEL_NAME}")
    U.hf_download_dataset("zhuzilin/dapo-math-17k")
    U.convert_checkpoint(
        model_name=MODEL_NAME,
        megatron_model_type=MODEL_TYPE,
        num_gpus_per_node=NUM_GPUS,
        dir_dst="/root/models",
        hf_checkpoint=f"/root/models/{MODEL_NAME}",
    )def write_sglang_config() -> str:
    # 生成 sglang 的 PD Mooncake 配置文件(prefill 和 decode 各 4 GPU)
    config = {
        "sglang": [
            {
                "name": "default",
                "server_groups": [
                    {
                        "worker_type": "prefill",
                        "num_gpus": 4,
                        "num_gpus_per_engine": 4,
                        "overrides": {"disaggregation_transfer_backend": "mooncake"},
                    },
                    {
                        "worker_type": "decode",
                        "num_gpus": 4,
                        "num_gpus_per_engine": 4,
                        "overrides": {"disaggregation_transfer_backend": "mooncake"},
                    },
                ],
            }
        ]
    }
    f = tempfile.NamedTemporaryFile("w", suffix=".yaml", prefix="sglang_pd_mooncake_", delete=False)
    with f:
        yaml.safe_dump(config, f, sort_keys=False)
    return f.namedef execute():
    # 组装训练命令并执行
    sglang_config = write_sglang_config()
    # ... 后接各种参数拼接和 U.execute_train 调用

评论区精华

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

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

风险与影响

  1. 升级兼容性:sglang v0.5.10.post1 可能引入不兼容的 API 变更,需要验证现有 rollout 功能正常。
  2. 新配置路径patch_hf_config_for_megatron_bridge 可能漏掉某些自定义模型配置,导致桥接加载失败。
  3. PD Mooncake 测试:新测试依赖 distributed 环境,若单机多卡配置不当可能不稳定。
  4. CI 权限提升privileged 模式可能带来安全风险,但限于 CI 环境。

影响范围:所有使用 sglang rollout 的用户(需重建 Docker 镜像);使用 Megatron 桥接加载 HF 模型的用户(自动获得配置修补);新增的 GLM-4.7 和 Qwen3 30B A3B PD Mooncake 用户;CI 流程。影响程度:中等,主要影响训练流程的兼容性和新模型支持。

升级依赖兼容性 新配置路径测试覆盖 CI 权限提升

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论