Prhub

#2228 [docker] upgrade sglang to v0.5.15.post1

原始 PR 作者 zhuzilin 合并时间 2026-07-23 16:26 文件变更 12 提交数 6 评论 0 代码增减 +697 / -892

执行摘要

SGLang 升级至 v0.5.15.post1,同步更新 Docker 构建与 patch

升级 SGLang 以获取上游最新功能、性能优化和 bugfix。从新增测试 test_memory_saver_disables_default_breakable_prefill_cuda_graph 可以看出,新版本引入了 cuda_graph_backend_prefill 字段,在启用 memory saver 时自动禁用 breakable prefill CUDA graph 以节省显存,这是升级的主要收益之一。此外,大幅简化的 patch 表明 slime 团队在持续跟进上游,减少维护成本。

本 PR 适合所有使用 slime Docker 镜像的团队精读,尤其是 arguments.py 中的参数兼容模式和 sglang_engine.py 的默认值覆盖策略值得在设计迁移时借鉴。建议 merge 前运行完整 CI(包括 offload、disagg 测试组合),并确认无回归。

讨论亮点

本 PR 无公开 review 评论。设计决策可从变更内容中推断:patch 大幅删减表明 slime 的若干定制(如 release_memory_occupation 等)已被 SGLang 主线采纳,团队选择直接移除冗余补丁;参数兼容采用双向设置(新旧属性同时写入),平衡了平滑迁移与代码清晰。

实现拆解

  1. Dockerfile 依赖更新:调整 docker/Dockerfiledocker/version.txt,将 SGLang 版本锁定为 v0.5.15.post1,并同步更新关键 Python 依赖版本(如 torch、transformers 等),确保构建一致性。

  2. SGLang 补丁重生成与裁剪:重新生成四个核心 patch 文件(sglang.patchsglang-release_hicache.patchsglang-top_p.patchsglang-pull_weights.patch)。由于上游已合入部分定制功能(如 release_memory_occupationresume_memory_occupation 的树缓存管理),patch 内容大幅减少:sglang.patch 从 638 行减至 148 行,sglang-release_hicache.patch 从 430 行减至 247 行,精简了重复适配。

  3. 参数兼容性处理:在 slime/backends/sglang_utils/arguments.pyvalidate_args 中,为新旧参数名(sglang_dp_size vs sglang_data_parallel_size 等)建立双向映射,确保用户以任何方式传入的参数都能正确读取,避免因 SGLang 升级丢失参数。

  4. SGLang 引擎运行时适配:在 slime/backends/sglang_utils/sglang_engine.py 中,当启用 memory saver(enable_memory_saver)且用户未显式指定 sglang_cuda_graph_backend_prefill 时,自动将其设为 "disabled",防止 CUDA graph 在 offload 场景下导致显存压力。

  5. 测试配套:新增 test_memory_saver_disables_default_breakable_prefill_cuda_graph 验证上述默认行为,同时调整 test_qwen3_0.6B_parallel_check.pytest_qwen3_4B_external_pd.py 中的参数,适配新版本字段名变化。

文件 模块 状态 重要度
docker/patch/latest/sglang.patch SGLang 补丁 modified 7.24
slime/backends/sglang_utils/arguments.py 参数解析 modified 6.04
tests/utils/test_sglang_config.py 测试覆盖 modified 6.03
docker/patch/latest/sglang-release_hicache.patch HiCache 补丁 modified 7.2
slime/backends/sglang_utils/sglang_engine.py 引擎适配 modified 5.48
docker/Dockerfile Docker 构建 modified 4.1

关键符号

validate_args _compute_server_args test_memory_saver_disables_default_breakable_prefill_cuda_graph release_memory_occupation resume_memory_occupation

关键源码片段

slime/backends/sglang_utils/arguments.py core-logic

参数兼容核心逻辑,确保新老版本参数名正确映射,直接影响运行时行为。

# slime/backends/sglang_utils/arguments.pydef validate_args(args):
    # Older SGLang versions stored these CLI aliases under their long names,
    # while newer versions use the short ServerArgs field names as argparse dests.
    # Keep both attributes available for user code, preferring the newer names
    # when a namespace happens to contain both.
    for current_name, legacy_name in (
        ("sglang_dp_size", "sglang_data_parallel_size"),
        ("sglang_pp_size", "sglang_pipeline_parallel_size"),
        ("sglang_ep_size", "sglang_expert_parallel_size"),
    ):
        value = getattr(args, current_name) if hasattr(args, current_name) else getattr(args, legacy_name)
        setattr(args, current_name, value)
        setattr(args, legacy_name, value)
tests/utils/test_sglang_config.py test-coverage

新增测试验证新版 `cuda_graph_backend_prefill` 默认行为,是升级正确性的重要保障。

# tests/utils/test_sglang_config.pydef test_memory_saver_disables_default_breakable_prefill_cuda_graph(self, monkeypatch):
    from slime.backends.sglang_utils import sglang_engine
​
    @dataclass
    class CurrentServerArgs:
        enable_memory_saver: bool = False
        cuda_graph_backend_prefill: str | None = None
​
    @dataclass
    class LegacyServerArgs:
        enable_memory_saver: bool = False
​
    args = Namespace(
        hf_checkpoint="/tmp/hf",
        seed=1,
        offload_rollout=True,
        rollout_num_gpus_per_engine=1,
        num_gpus_per_node=8,
        sglang_pp_size=1, sglang_dp_size=1, sglang_ep_size=1,
        use_rollout_routing_replay=False, fp16=False,
    )
    compute_kwargs = {
        "rank": 0,
        "dist_init_addr": "127.0.0.1:12345",
        "nccl_port": 12346,
        "host": "127.0.0.1",
        "port": 30000,
        "base_gpu_id": 0,
    }
​
    # When ServerArgs has enable_memory_saver and no explicit setting,
    # cuda_graph_backend_prefill should default to "disabled".
    monkeypatch.setattr(sglang_engine, "ServerArgs", CurrentServerArgs)
    kwargs, _ = sglang_engine._compute_server_args(args, **compute_kwargs)
    assert kwargs["cuda_graph_backend_prefill"] == "disabled"
​
    # User explicit setting overrides default.
    args.sglang_cuda_graph_backend_prefill = "full"
    kwargs, _ = sglang_engine._compute_server_args(args, **compute_kwargs)
    assert kwargs["cuda_graph_backend_prefill"] == "full"
​
    # LegacyServerArgs lacks cuda_graph_backend_prefill field, key should not appear.
    monkeypatch.setattr(sglang_engine, "ServerArgs", LegacyServerArgs)
    kwargs, _ = sglang_engine._compute_server_args(args, **compute_kwargs)
    assert "cuda_graph_backend_prefill" not in kwargs

评论区精华

无公开讨论 other

该 PR 没有产生任何 review 评论或线程。所有设计决策均通过提交内容体现。

结论:无需额外变更,PR 已被合并。 · 已解决

风险与影响

  • 依赖版本兼容风险:新版本 SGLang 可能改变了某些内部接口(如 ServerArgs 字段),patch 的删除若遗漏关键适配可能导致运行时错误。需关注 sglang-engine_compute_server_args 是否全面覆盖新版本差异。
  • 参数兼容逻辑缺陷validate_args 中的兼容循环假设新旧名至少存在一个;若二者都不存在则会触发 AttributeError。此外,若用户同时设置新旧名但值不同,最终以 current_name 为准,可能违反用户预期。
  • 定制功能回归风险:被删除的 patch(如 release_memory_occupation 的树缓存释放)如果未完全集成到上游,可能在某些配置下导致内存泄漏或训练 hang。建议在完整 CI 套件中重点覆盖 offload 场景。
  • 测试覆盖有限:仅新增一项关于 cuda_graph_backend_prefill 的单元测试,其他行为变化(如 update_weight_version 接口)缺少回归验证。

用户:使用官方 Docker 镜像的开发者将自动获得升级后的 SGLang,需确保配置文件中使用新版参数短名(如 sglang_dp_size 而非 sglang_data_parallel_size),否则旧名仍能工作(兼容层提供)。
系统:Docker 镜像体积可能变化;构建时间因依赖更新而有所延长。CI 流水线需同步更新基础镜像。
团队:后续维护 patch 的难度降低(补丁更小),但需要持续跟踪上游变动。本次升级为后续引入 SGLang 新功能(如 PD disaggregation 优化)铺平道路。

依赖升级版本兼容风险 补丁重构可能导致定制遗漏 参数兼容逻辑未全覆盖 新版本行为变化缺少回归测试

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论