Prhub

#31814 config: read resolved config via namespace accessors

原始 PR 作者 ch-wan 合并时间 2026-07-22 16:18 文件变更 162 提交数 1 评论 20 代码增减 +1103 / -1209

执行摘要

配置读取迁移至领域命名空间访问器

PR body 指出这是 stacked series 的一部分,目标是引入结构化 RuntimeContext 配置 API,使 resolved config 通过领域命名空间读取,ServerArgs 变为只读记录。从扁平 server_args 迁移到命名空间访问器可以提高代码可维护性和类型安全。

值得精读了解配置重构的设计模式,但合并前必须解决 codex 提出的 P1 问题:

  1. declare_load_time_override 改为同时更新 runtime-context bag。
  2. 为多 Engine 场景提供隔离机制或将 context 与 Engine 绑定。
  3. 更新受影响的测试夹具,使其发布 context 或提供 fallback 读取。
    建议在合并后立即进行功能回归测试,特别是 MoE 融合、PD 分离、多 Engine 共存等场景。
讨论亮点

codex 自动化 review 标记了多个 P1/P2 问题,主要集中在:

  • load-time overrides 未同步:例如 MoE 模型在加载时通过 declare_load_time_override 禁用融合,该操作仅写入 ServerArgs,而新配置读取走 runtime-context bag,导致融合实际未被禁用(如 deepseek_v2.pyglm4_moe.pyminimax_m3.py)。
  • 多 Engine 进程上下文污染:当两个 Engine 实例共存时,全局 context 被后构建的 Engine 重写,导致前一个 Engine 的配置读取错误(如 tokenizer_manager.py 中的 weight_update 读取 load_format)。
  • 测试路径未覆盖:某些测试直接构造 Scheduler 或 GrammarManager 而不经过 context publish,调用 get_serving() 等会抛出异常。

所有问题均未在 PR 中标记为已解决,需要作者逐项修复。

实现拆解

  1. 新增领域访问器函数:在 sglang/srt/runtime_context.py 中新增 get_model()get_serving()get_exec()get_schedule()get_memory() 等访问器,每个返回对应的配置域对象。

  2. 大规模替换配置读取:遍历 162 个源文件,将 self.server_args.xxxget_server_args().xxx 替换为对应的域访问器调用。例如 self.server_args.enable_metrics 变为 get_observability().enable_metricsself.server_args.speculative_use_rejection_sampling 变为 get_spec().speculative_use_rejection_sampling

  3. 修复 strip_thinking_cache 读取:在 _release_overallocated_kv_indices 中,将之前的 get_server_args() 别名调用改为通过新 API 读取。

  4. 调整 override 调用点:将 server_args.override(...) 改为 get_context().override(...),确保运行时重写写入 RuntimeContext 而非 ServerArgs。

  5. 保留未改动路径:部分直接从构造函数参数接收 server_args 且未经过 publish 的代码(如测试夹具和某些 stub)保持原样,但讨论中指出这些路径可能因上下文未发布而失败。

文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 7.61
python/sglang/srt/mem_cache/kv_cache_configurator.py KV 缓存配置 modified 7.6
python/sglang/srt/model_executor/model_runner.py 模型执行器 modified 7.3
python/sglang/srt/speculative/eagle_worker_v2.py 推测解码 modified 7.26
python/sglang/srt/managers/tokenizer_manager.py 分词器管理 modified 6.89
python/sglang/srt/managers/scheduler_components/batch_result_processor.py 批结果处理 modified 6.9

关键符号

_apply_adaptive_config

关键源码片段

python/sglang/srt/managers/scheduler.py dependency-wiring

核心调度器,配置读取迁移涉及初始化、IPC 通道、异常处理等多个关键路径,改动量最大(+73/-67)。

# python/sglang/srt/managers/scheduler.py (head 版本 )
# 在 __init__ 中构建 KV cache 时通过领域访问器获取观测配置
result = kv_cache_builder.build_kv_cache(
    server_args=self.server_args,
    model_config=self.model_config,
    tp_worker=self.tp_worker,
    page_size=self.page_size,
    spec_algorithm=self.spec_algorithm,
    attn_tp_cpu_group=self.attn_tp_cpu_group,
    tp_cpu_group=self.tp_cpu_group,
    attn_cp_cpu_group=self.attn_cp_cpu_group,
    enable_metrics=get_observability().enable_metrics, # 原 self.server_args.enable_metrics
    enable_kv_cache_events=bool(
        get_observability().kv_events_config # 原 self.server_args.kv_events_config
        and self.ps.pp_rank == 0
        and self.ps.attn_tp_rank == 0
        and self.ps.attn_cp_rank == 0
    ),
)
python/sglang/srt/speculative/eagle_worker_v2.py core-logic

推测解码 Eagle Draft Worker,包含符号 _apply_adaptive_config 的配置读取迁移,并涉及自适应状态同步。

# python/sglang/srt/speculative/eagle_worker_v2.py (head 版本 )
class EagleDraftWorker(EagleDraftWorkerBase):
    def __init__(
        self,
        server_args: ServerArgs,
        gpu_id: int,
        ps: ParallelState,
        nccl_port: int,
        target_worker: TpModelWorker,
    ):
        # copy args
        self.server_args = server_args
        self.gpu_id = gpu_id
        self.ps = ps
        self.nccl_port = nccl_port
        self.target_worker = target_worker
​
        # Args for easy access
        self.device = server_args.device
        self.topk = server_args.speculative_eagle_topk
        if get_spec().speculative_use_rejection_sampling: # 原 self.server_args.speculative_use_rejection_sampling
            assert self.topk == 1, "Chain speculative sampling supports only topk=1"
        # ... 后续初始化逻辑

评论区精华

speculative_draft_load_format override 未应用到 DraftWorkerClass 正确性

当 speculative_draft_load_format 与目标模型格式不同时,此更改仅更新 runtime-context bag,而 DraftWorkerClass 仍收到 self.server_args,draft runner 的 build_load_config() 继续从 server_args.load_format 设置 LoadConfig,导致请求的 draft 格式被忽略,加载可能失败。

结论:未解决,标记为 P1。 · 待处理

weight_version 更新未反映到 server_info 正确性

/update_weight_version 成功后,此更改仅修改 runtime-context bag,但 /model_info 仍从 tokenizer_manager.server_args.weight_version 读取,客户端收到旧版本。

结论:未解决,标记为 P2。 · 待处理

adaptive-spec metrics draft_per_round 仍读 server_args 正确性

当 --speculative-adaptive 切换 draft token 计数时,此更改仅更新 runtime-context bag,而 SchedulerMetricsReporter.log_decode_stats() 仍从 self.scheduler.server_args.speculative_num_draft_tokens 计算 draft_per_round,导致 acceptance-rate 分母保持启动状态值,实验指标不正确。

结论:未解决,标记为 P2。 · 待处理

自适应 NPU 捕获使用未更新 draft token 数 正确性

在 Ascend/DSv4 上自适应推测解码预构建 CUDA graph 状态时,_override_worker_state() 将临时 speculative_num_draft_tokens 仅放在 self.server_args 上,而此读取使用未更改的 runtime-context bag,导致 build_adaptive_runtime_state() 捕获候选图时使用启动时的 n_draft,产生不匹配的查询长度元数据。

结论:未解决,标记为 P1。 · 待处理

weight-update load_format 使用其他 engine 的配置 正确性

当两个 Engine 实例共存时,构建第二个 tokenizer manager 会重写全局 runtime context,第一个 engine 的 update_weights_from_disk 中 obj.load_format 默认使用 get_model().load_format,可能读到第二个 engine 的格式,导致权重加载失败或选择错误格式。

结论:未解决,标记为 P1。 · 待处理

风险与影响

  1. load-time overrides 断连:多个模型(DeepSeek、GLM4、MiniMax)在 init 中通过 declare_load_time_override 动态调整 fusion 配置,该函数只写入 ServerArgs,而新代码从 get_exec().moe 读取,导致禁用不生效,可能引发内核选择错误或权重加载失败。
  2. 多 Engine 上下文污染:全局 RuntimeContext 被多个 Engine 共享,后构建的 Engine 会覆盖前者的配置,导致配置错乱(如 tokenizer_control_mixin.py 中的 LoRA gates 读取 get_lora().enable_lora 可能读到错误的 Engine 值)。
  3. 测试套件兼容性:单元测试直接构造 Scheduler、GrammarManager、MlxModelRunnerStub 等对象而不发布 context,调用域访问器会抛出 ValueError 或读取到错误配置。
  4. metrics 报告延迟:自适应推测解码中 MetricsReporter 仍从 server_args 读取 draft 数量,导致统计失准(P2)。

对用户:行为理论上保持不变,但上述风险可能导致特定配置下的启动失败或统计错误。
对系统:配置读取更结构化,减少对全局 server_args 的硬编码依赖,有利于后续扩展。
对团队:需要确保所有配置访问点正确迁移,并修复后向兼容性问题。合并前建议添加集成测试覆盖关键配置路径。

load-time override 未同步 多 Engine 上下文污染 测试未覆盖新路径 自适应推测 metrics 偏差

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论