Prhub

#35450 Cutlass W4A16 (Machete) Tests

原始 PR 作者 ojhaanshika 合并时间 2026-04-27 13:15 文件变更 2 提交数 6 评论 7 代码增减 +187 / -0

执行摘要

新增 Cutlass W4A16 内核端到端集成测试

现有的 test_machete_mm.py 仅测试原始 CUDA 内核,缺少对 vLLM 完整管线的验证。为确保 Machete 内核在模型加载、内核选择、权重重打包和推理输出等环节的正确性,需要补充集成测试。参考 PR body 中提到的覆盖提升 29% → 43%。

建议所有涉及量化内核的开发者阅读此 PR,尤其是测试结构:使用参数化分离单元测试与端到端测试,通过 fixture 统一设置环境变量。CI 集成方式也值得推广。

讨论亮点

在 Review 中,LucasWilkinson 指出 test_w4a16_machete_bfloat16test_w4a16_machete_deterministic 覆盖内容相似,建议合并以减少 CI 时间(每次测试需要重启服务器)。作者采纳并合并为参数化测试,由提交 Fuse rejection tests and merge bf16+deterministic 实现。

实现拆解

  1. 创建测试文件:新建 tests/quantization/test_cutlass_w4a16.py,导入必要模块,并使用 pytest.skip 在非 sm_90 硬件上跳过整个模块。
  2. 编写内核选择测试:通过 test_machete_kernel_selected 参数化测试覆盖 GPTQ (fp16/bf16)、AWQ 和 channelwise 配置,验证 choose_mp_linear_kernel 返回 MacheteLinearKernel
  3. 编写无效配置拒绝测试test_machete_rejects_invalid_config 验证 Machete 正确拒绝 partitioned g_idx、不支持量化类型和组大小。
  4. 编写禁用回退测试test_kernel_selection_with_disabled_machete 设置 VLLM_DISABLED_KERNELS 环境变量,验证内核选择降级。
  5. 编写端到端测试test_w4a16_machete_e2e 加载真实压缩张量模型 (TinyLlama),通过内部 check_model 检查是否选用 Machete 内核,并验证推理输出。
  6. 添加 CI 配置:在 .buildkite/test_areas/kernels.yaml 的 Kernels DeepGEMM Test 步骤中添加测试文件依赖和 pytest -v -s quantization/test_cutlass_w4a16.py 命令。
文件 模块 状态 重要度
tests/quantization/test_cutlass_w4a16.py 量化测试 added 7.37
.buildkite/test_areas/kernels.yaml CI 配置 modified 2.5

关键符号

enable_pickle test_machete_kernel_selected test_machete_rejects_invalid_config test_kernel_selection_with_disabled_machete test_w4a16_machete_e2e check_model check_kernel_type

关键源码片段

tests/quantization/test_cutlass_w4a16.py test-coverage

新增测试文件,包含所有 Machete 内核的集成测试,覆盖选择、拒绝、禁用回退和端到端推理。

import pytest
import torch
from vllm.model_executor.kernels.linear import (
    MPLinearLayerConfig,
    choose_mp_linear_kernel,
)
from vllm.model_executor.kernels.linear.mixed_precision import (
    MacheteLinearKernel,
)
from vllm.scalar_type import scalar_types
​
​
# 自动化 fixture:启用 pickling 以支持 LLM.apply_model
@pytest.fixture(scope="function", autouse=True)
def enable_pickle(monkeypatch):
    """`LLM.apply_model` 需要序列化函数,故设置环境变量。"""
    monkeypatch.setenv("VLLM_ALLOW_INSECURE_SERIALIZATION", "1")
​
​
# 参数化测试:验证内核选择器在多种 W4A16 配置下返回 MacheteLinearKernel
@pytest.mark.parametrize(
    "act_type, weight_type, group_size, zero_points",
    [
        (torch.float16, scalar_types.uint4b8, 128, False), # GPTQ fp16, G128
        (torch.bfloat16, scalar_types.uint4b8, 128, False), # GPTQ bf16, G128
        (torch.float16, scalar_types.uint4, 128, True), # AWQ, G128, 零点
        (torch.float16, scalar_types.uint4b8, -1, False), # Channelwise, 无分组
    ],
    ids=["fp16-gptq-g128", "bf16-gptq-g128", "fp16-awq-g128", "fp16-channelwise"],
)
def test_machete_kernel_selected(act_type, weight_type, group_size, zero_points):
    """验证 choose_mp_linear_kernel 返回 MacheteLinearKernel。"""
    config = MPLinearLayerConfig(
        full_weight_shape=(4096, 4096),
        partition_weight_shape=(4096, 4096),
        act_type=act_type,
        weight_type=weight_type,
        group_size=group_size,
        zero_points=zero_points,
        has_g_idx=False,
    )
    kernel = choose_mp_linear_kernel(config)
    assert kernel is MacheteLinearKernel, \
        f"期望 MacheteLinearKernel,实际得到 {kernel.__name__}"

评论区精华

合并测试以减少 CI 时间 测试

LucasWilkinson 指出 test_w4a16_machete_bfloat16 和 test_w4a16_machete_deterministic 覆盖相似内容,每次测试需要重启服务器,建议合并为参数化测试以减少 CI 开销。

结论:作者采纳建议,在提交 'Fuse rejection tests and merge bf16+deterministic' 中合并了这两个测试。 · 已解决

风险与影响

新测试仅在 Hopper (sm_90) GPU 上运行,非 Hopper 环境自动跳过,无风险。CI 中 DeepGEMM 步骤新增命令可能略微增加执行时间,但影响可控。测试覆盖主流 W4A16 配置,但模型仅使用 TinyLlama 尺寸,扩展性需进一步验证。

对用户无行为变化。对内核开发者提供更全面的测试保障,减少手动验证开销。CI 流水线增加约 90 秒测试时间(本地估算),属于可选增量。

仅 Hopper GPU 可运行 新增 CI 步骤可能增加流水线时间

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论