Prhub

#33851 [diffusion] validate and document Spectrum controls

原始 PR 作者 mickqian 合并时间 2026-08-06 23:23 文件变更 10 提交数 1 评论 3 代码增减 +143 / -9

执行摘要

为 Spectrum 增加参数校验并补齐公共文档

PR body 明确说明:Spectrum settings previously lacked an explicit supported-model guard and the feature was difficult to discover from public documentation。也就是说,用户既不知道 Spectrum 支持哪些原生模型路径,也没有参数取值范围说明;无效控制(如非有限浮点或越界整数)不会被拦截,导致运行时行为不可预期。本 PR 将“守卫”提前到参数构造阶段,并让功能具备公开指南。

值得快速浏览。核心看点:

1) post_init 集中校验的写法,特别是拒绝 bool、使用 math.isfinite、按字段类型分组校验;
2) 文档导航注册(docs.json)与能力矩阵对齐的配套习惯。若后续要为其他采样参数加校验,本 PR 是可直接参考的样板。

讨论亮点

本 PR 没有 review 评论或讨论线程;issue 评论仅为作者三次 /tag-and-rerun-ci(含一次 extra)触发 CI。因此没有已解决/未解决的技术分歧。唯一值得注意的约束在 PR body:本地未跑测试,依赖 CI 验证。

实现拆解

  1. 变更入口:python/sglang/multimodal_gen/configs/sample/spectrum.py 的 SpectrumParams 新增 post_init,在 dataclass 实例化时立即执行校验。校验分三批:浮点字段需为有限数且拒绝 bool;窗口、混合权重等字段各自限定数值域;整数类字段区分非负与正数,taylor_order 限定 1/2/3。所有失败统一抛出带字段名的 ValueError。
  2. 测试配套:python/sglang/multimodal_gen/test/unit/test_sampling_params.py 新增 test_spectrum_params_reject_invalid_controls(覆盖 9 种无效组合)和 test_spectrum_dict_is_validated_when_sampling_params_constructs_it(验证 SamplingParams 内嵌 spectrum_params dict 转换路径同样触发校验),并新增 SpectrumParams 导入。
  3. 文档主变更:新增 docs/docs/sglang-diffusion/spectrum.mdx,包含快速开始、支持范围(仅 native FLUX.1/Wan/HunyuanVideo/SD3,不含 FLUX.2 与 diffusers 后端)、与 enable-teacache 互斥、高级控制参数表。docs/docs.json 将该页注册到 Caching Acceleration 导航组。
  4. 配套文档对齐:caching-acceleration.mdx 从两种策略扩展为三种并加入 Spectrum 对比行;index.mdx 入口更新;cli.mdx 修正 --tp-size 说明与 Cache-DiT 启用方式;compatibility_matrix.mdx 补充 MiniMax-H3 的 Sage 支持;attention_backends.mdx 补充 SM100/B200 cuDNN SDPA 回退;MiniMax-H3 cookbook 增加 SageAttention 说明。
  5. CI 触发:通过 issue 评论 /tag-and-rerun-ci 触发 lint 与额外 CI,未在本地运行测试。
文件 模块 状态 重要度
python/sglang/multimodal_gen/configs/sample/spectrum.py 采样参数 modified 6.76
python/sglang/multimodal_gen/test/unit/test_sampling_params.py 单元测试 modified 5.18
docs/docs/sglang-diffusion/spectrum.mdx 文档 added 4.36
docs/docs.json 文档导航 modified 3.0
docs/docs/sglang-diffusion/caching-acceleration.mdx 文档 modified 3.19
docs/docs/sglang-diffusion/compatibility_matrix.mdx 文档 modified 2.32

关键符号

__post_init__ test_spectrum_params_reject_invalid_controls test_spectrum_dict_is_validated_when_sampling_params_constructs_it

关键源码片段

python/sglang/multimodal_gen/configs/sample/spectrum.py core-logic

核心源码变更:新增 __post_init__ 集中校验所有 Spectrum 控制参数,是本次 PR 的行为修改入口。

@dataclass
class SpectrumParams(CacheParams):
    """Spectrum 谱特征预测的采样参数。    继承自 CacheParams,核心控制包括窗口大小、切比雪夫基数量、
    Taylor 融合权重等。所有字段默认值对齐论文与参考实现。
    """
​
    cache_type: str = "spectrum"
    window_size: float = 2.0
    flex_window: float = 0.75
    warmup_steps: int = 5
    w: float = 1.0
    lam: float = 0.1
    m: int = 4
    history_size: int = 100
    tau_num_steps: int = 50
    taylor_order: int = 1
​
    def __post_init__(self) -> None:
        # 第一批:必须是有穷数。bool 是 int 子类,显式拒绝,避免 True/False 混入数值字段。
        finite_numbers = {
            "window_size": self.window_size,
            "flex_window": self.flex_window,
            "w": self.w,
            "lam": self.lam,
        }
        for name, value in finite_numbers.items():
            if (
                isinstance(value, bool)
                or not isinstance(value, (int, float))
                or not math.isfinite(value)
            ):
                raise ValueError(f"Spectrum {name} must be a finite number.")
​
        # 第二批:浮点字段的数值域约束。
        if self.window_size <= 0:
            raise ValueError("Spectrum window_size must be greater than zero.")
        if self.flex_window < 0:
            raise ValueError("Spectrum flex_window must be non-negative.")
        if not 0 <= self.w <= 1:
            raise ValueError("Spectrum w must be between zero and one.")
        if self.lam < 0:
            raise ValueError("Spectrum lam must be non-negative.")
​
        # 第三批:整数域约束,同样拒绝 bool。
        non_negative_ints = {"warmup_steps": self.warmup_steps}
        positive_ints = {
            "m": self.m,
            "history_size": self.history_size,
            "tau_num_steps": self.tau_num_steps,
        }
        for name, value in non_negative_ints.items():
            if isinstance(value, bool) or not isinstance(value, int) or value < 0:
                raise ValueError(f"Spectrum {name} must be a non-negative integer.")
        for name, value in positive_ints.items():
            if isinstance(value, bool) or not isinstance(value, int) or value <= 0:
                raise ValueError(f"Spectrum {name} must be a positive integer.")
​
        # taylor_order 只允许 1、2、3 三个取值。
        if self.taylor_order not in (1, 2, 3):
            raise ValueError("Spectrum taylor_order must be one of 1, 2, or 3.")
python/sglang/multimodal_gen/test/unit/test_sampling_params.py test-coverage

新增两个测试覆盖无效控制拒绝与 SamplingParams 内嵌 dict 的校验路径,是校验逻辑的正确性保障。

class TestSamplingParamsValidate(unittest.TestCase):
    def test_spectrum_params_reject_invalid_controls(self):
        # 覆盖文档中列出的每一个可调控制:越界、非法类型、非法取值。
        invalid_controls = (
            {"window_size": 0},
            {"flex_window": -0.1},
            {"w": 1.1},
            {"lam": -0.1},
            {"warmup_steps": -1},
            {"m": 0},
            {"history_size": 0},
            {"tau_num_steps": 0},
            {"taylor_order": 4},
        )
        for kwargs in invalid_controls:
            with self.assertRaises(ValueError):
                SpectrumParams(**kwargs)
​
    def test_spectrum_dict_is_validated_when_sampling_params_constructs_it(self):
        # 通过 SamplingParams 内嵌 dict 传入时,也必须触发底层校验。
        with self.assertRaisesRegex(ValueError, "history_size"):
            SamplingParams(
                enable_spectrum=True,
                spectrum_params={"history_size": 0},
            )

评论区精华

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

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

风险与影响

  • 行为变更:所有 SpectrumParams 构造现在都会执行硬校验,此前可接受但语义非法的值(如 NaN、Inf、越界值、bool 冒充数值)会在请求构造期直接失败;若有关键路径依赖旧行为需回归确认。
  • 构造路径覆盖:校验只在 dataclass post_init 生效,测试覆盖了 SamplingParams 内嵌 dict 路径;CLI 参数解析等其他入口是否必然走该构造点,PR 未明确说明(不确定性)。
  • 文档一致性:spectrum.mdx 声称的支持范围(原生 FLUX.1/Wan/HunyuanVideo/SD3,不含 FLUX.2、非 serve/OpenAI 选项)需要与实现保持同步,否则会误导用户。
  • 兼容性:改动集中在构造期校验与文档,不触及调度、去噪内核路径,回归面很小。
  • 用户:无效或越界的 Spectrum 控制会立即得到带字段名的 ValueError,不再静默埋雷。
  • 支持用户:获得从快速开始到参数表的完整文档路径,可从导航直接发现。
  • 团队:为后续 TeaCache 等其他 cache 参数的校验与文档化提供了可复用的模式(dataclass post_init + 单测 + 导航注册)。
输入校验行为变更 文档与实现需保持同步 构造路径覆盖待确认

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论