SuperAPI AI 工具集

sglang-runtime-context

部署与运维

查看项目

更新于 10-16 10:02

技能介绍

用途

本文档描述 SGLang 运行时上下文(RuntimeContext)的组织架构,即进程级静态运行状态如何被分层、如何被读取与变更。核心容器是 sglang.srt.runtime_context.RuntimeContext,一个通过 get_context() 访问的进程单例,其下每一层都是该单例的一个 tier。

分层结构

  • 原始配置种子:get_server_args(),持有已发布的 ServerArgs,即启动记录,用于调试、转储与溯源。业务代码不从其上读取字段,读取限制被钉为零。
  • 已解析配置:get_exec()、get_memory()、get_schedule()、get_model()、get_spec()、get_serving()、get_observability()、get_disagg()、get_lora()、get_mm()、get_device() 等命名空间配置包,是已解析配置的唯一事实来源,叶子为真实属性。
  • 运行时标志:get_flags(),持有并非配置纯函数的状态,如 capture(cuda-graph 生命周期)、moe(ACTIVE 后端,可切换)、dp(DP-attention 运行时标志)。
  • 资源:get_resources()、get_stream(name)、get_buffer(name, factory),进程级句柄,如 graph 池、EPLB 状态、EP dispatcher 状态、命名边流、工作区缓冲,惰性创建,由 reset_context() 清除。
  • per-forward:get_forward(),forward 作用域标志,基于 contextvar,scoped(**kw) 退出时恢复。
  • 并行:get_parallel(),rank 与 group 句柄为实时拓扑(@property 穿读),其余名称(含 sizes)为 parallel 配置包的叶子。

reset_context() 用于单元测试拆卸,丢弃已发布配置并安装新的 flags/resources/forward 层。

配置:publish 与命名空间包

ServerArgs 仅持有原始输入,解析过程不写入任何字段。每个发布型进程入口调用 publish(server_args, role=...);构造函数不发布,ModelRunner、TokenizerManager 与 MMEncoder 调用 assert_published,若入口遗漏则显式失败。角色枚举为 ROLE_NAMESPACE_SETS 的键,不存在 launcher 角色,启动路径以 tokenizer 身份发布。publish 依据声明将配置包从记录的原始字段投影出来;访问器在 publish 之前 fail closed。role 记录发布进程类型,并作为按角色命名空间强制的键:SGLANG_ROLE_NAMESPACES=record 审计各角色实际读取的命名空间(通过 SGLANG_ROLE_NAMESPACES_OUT 按对持久化;torch.compile 追踪代码内的读取不会被观察),=enforce 对角色集合之外的包读取 fail closed。

包成员取决于字段声明位置:arg_groups/fields/ 下每个命名空间一个类,各带其所代表的 _NS_PATH,ServerArgs 由它们组装。

读取配置的方式为 get_<ns>()[.sub].field,例如 get_exec().moe.moe_a2a_backend、get_schedule().max_running_requests。

发布后变更配置的唯一入口是 get_context().override(source, **fields),就地写入包叶子并在 overrides 日志记录来源;不会写穿到 ServerArgs 实例。读取叶子(当调用者持有字段名时)用 get_context().config_leaf(name)。

适用场景与边界

  • 进程级配置读取应走命名空间包叶子;实例上的读取仅适用于真正的 per-instance 边界或整对象传递场景。
  • 包不跨进程边界:子进程从收到的对象发布并重新投影自己的包,父端 override 会丢失。
  • 构建期早于任何包存在的值(如 group 初始化读取 server_args.tp_size)没有可 override 的包。
  • model_path 与 served_model_name 由 manager 回答,tokenizer 侧权重重载只记录 load_format,两个路径字段写为 TokenizerManager 属性。

限制与守卫

文中列举了配置清扫可能破坏未被测试覆盖之处的若干方式,并说明相应守卫测试:插件实现的接口(test_plugin_hook_signatures.py)、进程入口内的发布顺序(test_publish_precedes_bag_reads.py)、进程发布所用角色命名空间、以及回读的兄弟界面(test_effective_state_surfaces.py)。还指出访问器名称本身的不变量:该名称代表进程级包、不接受参数、每个模块只绑定一次;ruff --select F811 可捕获导入冲突。守卫应基于派生集合而非手工维护的列表。