Prhub

#56594 [Bugfix][CI] Update CuTeDSL indexer Q sentinel test for migrated wrappers

原始 PR 作者 LopezCastroRoberto 合并时间 2026-09-13 00:12 文件变更 2 提交数 2 评论 3 代码增减 +20 / -20

执行摘要

修复 CuTeDSL Q 迁移后测试入口与 FP8 ABI

PR body 明确指出:The CuTeDSL indexer Q migration in #53566 re-named the two function entry points used by the sentinel-row test. 也就是说,#53566 在把 CuTeDSL 注意力内核迁入共享 warmup 契约时,将 fused_indexer_q_rope_quant_mxfp4_cutedsl 与 fused_indexer_q_rope_quant_fp8_cutedsl 重命名为 _INDEXER_Q_MXFP4_KERNEL 与 _INDEXER_Q_FP8_KERNEL,而 sentinel 边界测试仍按旧名和位置参数调用;同时 FP8 分支的输出在迁移后从 uint8 字节 ABI 变为 float8_e4m3fn 视图,底层内核仍按 uint8 字节布局处理,需要一并修复,避免迁移后测试空转或误报。

值得快速浏览,无需精读。值得关注的决策点有两个:一是大迁移 PR 合并后如何第一时间捡起受影响测试(入口改名导致测试失效);二是 wrapper 对外暴露 float8_e4m3fn 视图、对内保持 uint8 字节 ABI 的接口设计,后续迁移其它 CuTeDSL 内核时可复用这套约定。

讨论亮点

本 PR 没有实质技术论战。claude[bot] 提示该 PR 来自 fork、自动代码审查被禁用;LucasWilkinson 与 mgoin 两位维护者均直接 approve,未留下代码评论。Issue 评论只有 CI 触发命令,无技术讨论。整体改动简单清晰,未解决疑虑。

实现拆解

  1. 适配测试入口:在 tests/kernels/test_fused_indexer_q_rope_quant.py 的 test_cutedsl_indexer_q_writes_stay_within_num_tokens 中,MXFP4 分支由 mod.fused_indexer_q_rope_quant_mxfp4_cutedsl(...) 改为 mod._INDEXER_Q_MXFP4_KERNEL(...),FP8 分支由 mod.fused_indexer_q_rope_quant_fp8_cutedsl(...) 改为 mod._INDEXER_Q_FP8_KERNEL(...),并统一改用关键字参数(positions、q、cos_sin_cache、weights、weights_softmax_scale、weights_head_scale、q_packed/q_fp8、weights_out),确保测试覆盖迁移后的真实入口。
  2. 修复字节 ABI:在 vllm/models/deepseek_v4/nvidia/ops/fused_indexer_q_cutedsl.py 的 __call__ 中,传给底层 CuTeDSL 内核的 FP8 输出由 q_fp8 改为 q_fp8.view(torch.uint8)。wrapper 对外接收 float8_e4m3fn 视图,但底层内核仍按 uint8 字节 ABI 读取,必须用 view 还原字节布局,否则 FP8 量化输出会被误读。
  3. 配套验证:无其它源码、配置或部署改动。两个 commit 分别对应测试适配与 ABI 修复;Buildkite CI #88517 通过,LucasWilkinson 与 mgoin 均 approve 后合并。
文件 模块 状态 重要度
tests/kernels/test_fused_indexer_q_rope_quant.py 内核测试 modified 4.71
vllm/models/deepseek_v4/nvidia/ops/fused_indexer_q_cutedsl.py 算子封装 modified 2.99

关键符号

test_cutedsl_indexer_q_writes_stay_within_num_tokens __call__ _INDEXER_Q_MXFP4_KERNEL _INDEXER_Q_FP8_KERNEL

关键源码片段

tests/kernels/test_fused_indexer_q_rope_quant.py test-coverage

唯一被修改的测试文件,负责把 sentinel 越界测试切换到迁移后的新 wrapper 入口,是本次修复的直接载体。

# 这是 test_cutedsl_indexer_q_writes_stay_within_num_tokens 中 FP8 分支的关键部分。
else:
    # FP8 分支:先用 sentinel 全量填充输出,第 num_tokens 行作为越界哨兵。
    outputs["q_fp8"] = torch.full(
        (num_tokens + 1, n_head, HEAD_DIM),
        sentinel_u8,
        dtype=torch.uint8,
        device=device,
    )
    # 迁移后入口改名为 _INDEXER_Q_FP8_KERNEL,并统一使用关键字参数风格;
    # wrapper 接收 float8_e4m3fn 视图,内部再转回 uint8 字节 ABI 后传给底层内核。
    mod._INDEXER_Q_FP8_KERNEL(
        positions=positions[:num_tokens],
        q=q[:num_tokens],
        cos_sin_cache=cos_sin_cache,
        weights=weights[:num_tokens],
        weights_softmax_scale=1.0,
        weights_head_scale=1.0,
        q_fp8=outputs["q_fp8"][:num_tokens].view(torch.float8_e4m3fn),
        weights_out=weights_out[:num_tokens],
    )
torch.accelerator.synchronize()
​
# 校验 sentinel 行:内核若写越界,哨兵值会被改动。
clobbered = {}
for name, tensor in outputs.items():
    sentinel = sentinel_f32 if tensor.dtype == torch.float32 else sentinel_u8
    n_changed = (tensor[num_tokens] != sentinel).sum().item()
    if n_changed:
        clobbered[name] = n_changed
assert not clobbered, (
    f"kernel wrote past token {num_tokens - 1} into the sentinel row: {clobbered}"
)

评论区精华

无实质 review 讨论,fork 自动审查被禁用 other

claude[bot] 提示该 PR 来自 fork,自动代码审查被禁用;LucasWilkinson 与 mgoin 直接 approve,均未留下代码评论。

结论:改动简单清晰,无未解决疑虑。 · 已解决

风险与影响

风险一:q_fp8.view(torch.uint8) 目前只修复了 fused_indexer_q_cutedsl.py 的 __call__ 这一处调用点;若仓库中还有其它路径直接传 float8 视图给底层内核,会存在相同 ABI 问题,建议全仓搜索 q_fp8 相关调用。风险二:旧函数名 fused_indexer_q_rope_quant_mxfp4_cutedsl / fused_indexer_q_rope_quant_fp8_cutedsl 若在别处仍被引用会直接触发 NameError,本次未做兼容 shim。风险三:sentinel 测试仅覆盖 num_tokens 边界与写越界场景,对其它错误路径(如空输入、超大 batch)覆盖有限。

对最终用户无直接行为变化;对系统而言,修复的是 kernel 测试与 wrapper 之间的字节 ABI 一致性,属于内部契约修复。对团队与工程的影响在于:恢复 DSv4 CuTeDSL 路径 sentinel 越界测试的有效性,防止 indexer Q 内核写越界回归被漏检;同时为 #53566 这类大规模内核迁移提供“测试同步适配 + 字节 ABI 保持”的收尾范例。影响面集中在 NVIDIA CuTeDSL 路径,不涉及 AMD/ROCm 或 CPU。

FP8 字节 ABI 修复 依赖 #53566 迁移契约 测试适配为主

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论