Prhub

#28426 [XPU] Guard tvm_ffi import in dsv4 compress modules under TYPE_CHECKING

原始 PR 作者 arathi-hlab 合并时间 2026-06-17 06:52 文件变更 1 提交数 4 评论 2 代码增减 +4 / -2

执行摘要

修复 XPU 上 dsv4 模块因缺失 tvm_ffi 导致的导入崩溃

XPU CI 镜像未安装 tvm_ffi,导致 python/sglang/jit_kernel/dsv4/compress.py 中的无条件导入引发 ModuleNotFoundError: No module named 'tvm_ffi',进而使 test/registered/xpu/test_xpu_basic.py 中产生的 run_bench_one_batch 进程在导入阶段失败,并抛出 RuntimeError: Failed to parse benchmark output...。该问题由 PR #26471 引入。

该 PR 是修复特定平台(XPU)导入错误的轻量级补丁,值得精读以了解跨平台兼容性问题的典型处理模式。对于非 XPU 开发者,快速浏览即可。

讨论亮点

审查期间没有实质性讨论,两个批准(polisettyvarma 和 Fridge003)均无评论,PR 作者清晰描述了问题根源和修复方案。

实现拆解

  1. python/sglang/jit_kernel/dsv4/compress.py 中:将 from typing import ... 改为包含 TYPE_CHECKING;移除顶层的 from tvm_ffi.module import Module,将其移至 if TYPE_CHECKING: 块内。
  2. python/sglang/jit_kernel/dsv4/online_c128_mtp.py 中:同样将 from tvm_ffi.module import Module 导入移至 if TYPE_CHECKING: 块内(该文件虽未在 diff 中列出,但 PR 描述提及)。
  3. 这两个文件均已使用 from __future__ import annotations,且 Module 仅出现在返回类型注释中,因此类型检查下的导入是安全的。
  4. 该修改与 PR #26118(原始 Intel GPU 修复)以及同级 jit_kernel 模块(如 nvfp4.pymoe_align.pyconcat_mla.py)的模式一致。
文件 模块 状态 重要度
python/sglang/jit_kernel/dsv4/compress.py JIT 内核 modified 5.35

关键源码片段

python/sglang/jit_kernel/dsv4/compress.py dependency-wiring

核心修复文件:将 `tvm_ffi` 导入移至 `TYPE_CHECKING` 块,消除 XPU 上的导入错误。

# python/sglang/jit_kernel/dsv4/compress.py
from __future__ import annotationsfrom typing import TYPE_CHECKING, Literal, NamedTuple, Optional, Unionimport torchfrom sglang.jit_kernel.utils import (
    cache_once,
    is_arch_support_pdl,
    load_jit,
    make_cpp_args,
)from .utils import make_name# 仅在类型检查时导入,避免运行时环境缺失 tvm_ffi 时崩溃。
# Module 仅用于返回类型注释,不需要运行时引用。
if TYPE_CHECKING:
    from tvm_ffi.module import Module
​
​
@cache_once
def _jit_compress_norm_rope_module(
    dtype: torch.dtype,
    head_dim: int,
    rope_dim: int,
    page_size: int,
    bf16_store: bool = False,
) -> Module: # 返回类型注解,仅在类型检查时评估
    args = make_cpp_args(
        dtype, head_dim, rope_dim, page_size, is_arch_support_pdl(), bf16_store
    )
    cuda_wrappers = [("forward", f"FusedNormRopeKernel<{args}>::forward")]
    if head_dim == 128:
        cuda_wrappers.append(
            ("forward_fp4", f"FusedNormRopeKernel<{args}>::forward_fp4")
        )
    return load_jit(
        make_name(f"fused_norm_rope_v2"),
        *args,
        cuda_files=[f"deepseek_v4/fused_norm_rope_v2.cuh"],
        cuda_wrappers=cuda_wrappers,
    )

评论区精华

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

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

风险与影响

风险极低。该更改仅在类型检查时导入 Module,不影响运行时行为。CUDA 环境不受影响,因为 tvm_ffi 仅在类型检查时被引用。回归风险主要在于如果未来有人误将 Module 用于运行时类型判断(如 isinstance),但当前代码无此用法。

直接影响:修复 XPU CI 上的 test_xpu_basic.py 失败,使 XPU 回归测试恢复绿色。间接影响:确保 XPU 用户能够导入 sglang.jit_kernel.dsv4 子模块。对 CUDA 用户无影响。代码库一致性提高,与其他 jit_kernel 模块模式对齐。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论