Prhub

#36905 [Diffusion] Honor explicit offload in resident requirements

原始 PR 作者 mickqian 合并时间 2026-08-29 22:48 文件变更 2 提交数 1 评论 0 代码增减 +31 / -2

执行摘要

驻留要求尊重显式卸载配置,修复冲突未报错

PR 描述明确指出,需要让仅驻留的组件功能尊重所有显式驻留面,包括兼容性卸载标志。原先逻辑仅检查 --component-residency,导致用户通过 --cpu-offload-components 或旧版 text_encoder_cpu_offload 等标志配置卸载时,require_component_resident 会静默忽略并强行将组件置于驻留,造成配置冲突但无提示。此变更旨在拒绝这些显式卸载配置,避免静默覆盖。

此 PR 值得精读,因为修复了一个配置静默覆盖的隐患,并引入了通用化校验逻辑。核心设计决策:使用 explicit_residency_mode 统一检查所有显式驻留面,可推广到其他组件要求。建议后续在文档中说明冲突报错行为。

讨论亮点

此 PR 无 review 评论和讨论线程。

实现拆解

  1. 入口变更:修改 python/sglang/multimodal_gen/runtime/server_args/server_args.pyrequire_component_resident 方法,将内部检查调用从 canonical_residency_mode 改为 explicit_residency_mode
  2. 核心逻辑explicit_residency_mode 会汇总所有显式驻留面(component_residencycpu_offload_componentstext_encoder_cpu_offloadimage_encoder_cpu_offloadvae_cpu_offloaddit_cpu_offloadlayerwise_offload_components),若任一返回非 RESIDENT 模式,则抛出 ValueError,提示“explicit residency option”。这样确保任何显式卸载配置都会被拒绝。
  3. 测试配套:在 python/sglang/multimodal_gen/test/unit/test_server_args.py 中新增两个测试用例:test_resident_requirement_rejects_every_explicit_offload_surface 覆盖五种显式卸载面,均断言抛出 ValueError;test_resident_requirement_can_override_automatic_placement 验证自动放置(如 memory 模式下 text_encoder 默认非驻留)会被正确提升为驻留。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/server_args/server_args.py 服务端参数 modified 5.07
python/sglang/multimodal_gen/test/unit/test_server_args.py 测试 modified 6.04

关键符号

require_component_resident

关键源码片段

python/sglang/multimodal_gen/runtime/server_args/server_args.py core-logic

核心逻辑变更,`require_component_resident` 改为检查 `explicit_residency_mode`,并更新错误消息。

# python/sglang/multimodal_gen/runtime/server_args/server_args.pydef require_component_resident(
    self, component_name: str, *, feature_name: str
) -> None:
    # 改为使用 explicit_residency_mode,覆盖所有显式驻留面(component_residency、
    # cpu_offload_components、各组件卸载标志、旧版逐层卸载选择)
    configured_mode = self.explicit_residency_mode(component_name)
    if configured_mode is not None and configured_mode != RESIDENT:
        # 任何显式卸载配置都与驻留要求冲突,直接报错,避免静默覆盖
        raise ValueError(
            f"{feature_name} requires {component_name!r} to be resident; "
            f"got {configured_mode!r} from an explicit residency option"
        )
    # 记录为必需驻留组件,供后续调度使用
    self._required_resident_components.add(component_name)
python/sglang/multimodal_gen/test/unit/test_server_args.py test-coverage

新增测试覆盖所有显式卸载面及自动放置提升场景,确保行为正确。

# python/sglang/multimodal_gen/test/unit/test_server_args.pydef test_resident_requirement_rejects_every_explicit_offload_surface(self):
    # 构造所有显式卸载面:component_residency、cpu_offload_components、
    # 组件卸载标志、旧版逐层卸载选择
    cases = (
        {"component_residency": ["text_encoder=component-offload"]},
        {"component_residency": ["text_encoder=layerwise-offload"]},
        {"cpu_offload_components": ["text_encoder"]},
        {"text_encoder_cpu_offload": True},
        {"layerwise_offload_components": ["text_encoder"]},
    )
    for kwargs in cases:
        with self.subTest(kwargs=kwargs):
            args = self._from_dict_with_task_type(
                ModelTaskType.T2V,
                kwargs={"performance_mode": "manual", **kwargs},
            )
            # 必须抛出 ValueError,错误消息包含 "explicit residency option"
            with self.assertRaisesRegex(ValueError, "explicit residency option"):
                args.require_component_resident(
                    "text_encoder", feature_name="test backend"
                )def test_resident_requirement_can_override_automatic_placement(self):
    # 默认 memory 模式下 text_encoder 非驻留
    args = self._from_dict_with_task_type(ModelTaskType.T2V, memory_gb=16)
    self.assertIsNone(args.explicit_residency_mode("text_encoder"))
    self.assertNotEqual(args.residency_mode("text_encoder"), RESIDENT)
​
    # 显式要求驻留后,应提升为 RESIDENT
    args.require_component_resident("text_encoder", feature_name="test backend")
    self.assertEqual(args.residency_mode("text_encoder"), RESIDENT)

评论区精华

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

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

风险与影响

此变更是对 require_component_resident 的严格化,可能导致之前静默覆盖的配置现在显式报错,从而中断服务启动。但这是预期行为,能提前暴露配置冲突。风险点:若某些旧配置依赖静默覆盖,升级后可能启动失败,需用户调整配置。影响文件仅两处,逻辑简单,回归风险低。

影响范围:sglang/multimodal_gen 扩散流水线服务端参数解析。对用户而言,显式配置了卸载但组件要求驻留时,会得到清晰错误提示,避免运行时异常;对系统而言,增强配置一致性,防止静默覆盖。对团队而言,该修复提升参数校验的严谨性,为后续仅驻留后端提供可靠基础,影响程度中等(配置报错但功能路径不变)。

配置冲突报错可能中断启动 未运行完整 GPU CI

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论