Prhub

#47879 Update qutlass cmake for stable abi

原始 PR 作者 cleonard530 合并时间 2026-07-21 09:31 文件变更 2 提交数 4 评论 10 代码增减 +11 / -9

执行摘要

更新 QuTLASS CMake 集成以支持稳定 ABI

使 _qutlass_C 扩展库成为Torch ABI稳定版本,以兼容不同PyTorch版本,避免因ABI不兼容导致的链接问题。上游QuTLASS已合并稳定ABI更新,此PR同步这些变更。

建议合入。该PR使QuTLASS扩展成为ABI稳定版本,降低了维护成本。但需确认上游提交已稳定且无其他回归。

讨论亮点
  • 供应链风险: depthfirst-app[bot] 指出最初PR将上游仓库指向个人fork存在供应链风险。作者后将其改回组织仓库 IST-DASLab/qutlass,风险已解决。
  • 额外源文件: janeyx99 询问添加 fused_quantize_mx_mask.cu 是否必要。cleonard530 解释是因为QuTLASS的 bindings.cpp 引用了该文件中的函数,故必须包含。

实现拆解

  1. 更新上游依赖: 在 cmake/external_projects/qutlass.cmake 中将 _QUTLASS_UPSTREAM_REPO 保持为 IST-DASLab/qutlass,并将 _QUTLASS_UPSTREAM_TAG 更新为包含稳定ABI变更的提交 e74319e3405ce6d71965732880f5dc1f52371f64
  2. 调整CMake编译配置: 移除 QUTLASS_DISABLE_PYBIND=1,替换为 QUTLASS_MINIMAL_BUILD=1、添加 TORCH_TARGET_VERSION=0x020B000000000000ULLUSE_CUDA 编译定义,并添加 fused_quantize_mx_mask.cu 源文件(因QuTLASS的bindings.cpp已包含该函数)。
  3. 更新自定义操作绑定: 在 vllm/_custom_ops.py 中,将假操作注册从 fusedQuantizeNv 改为 fusedQuantizeNvAbsMax,并将实际调用从 fusedQuantizeNv 改为 fusedQuantizeNvAbsMax
文件 模块 状态 重要度
cmake/external_projects/qutlass.cmake 构建系统 modified 4.24
vllm/_custom_ops.py 自定义操作 modified 6.37

关键符号

_fake_fused_quantize_nv_absmax fusedQuantizeNv

关键源码片段

cmake/external_projects/qutlass.cmake core-logic

CMake 构建配置的核心变更,包括更新依赖标签、添加编译定义和源文件,直接影响 QuTLASS 扩展的编译和 ABI 稳定性。

# 设置上游仓库和标签
set(_QUTLASS_UPSTREAM_REPO "https://github.com/IST-DASLab/qutlass.git")
# 更新为包含稳定 ABI 变更的提交
set(_QUTLASS_UPSTREAM_TAG "e74319e3405ce6d71965732880f5dc1f52371f64")# 添加因 QuTLASS bindings.cpp 所需的额外源文件
${qutlass_SOURCE_DIR}/qutlass/csrc/fused_quantize_mx.cu
${qutlass_SOURCE_DIR}/qutlass/csrc/fused_quantize_mx_mask.cu # 新添加# 目标编译定义
# QUTLASS_MINIMAL_BUILD 替代了旧版 QUTLASS_DISABLE_PYBIND
# TORCH_TARGET_VERSION 显式指定 ABI 版本
# USE_CUDA 启用 CUDA 支持
target_compile_definitions(_qutlass_C PRIVATE
    QUTLASS_MINIMAL_BUILD=1
    TARGET_CUDA_ARCH=${QUTLASS_TARGET_CC}
    CUTLASS_ENABLE_DIRECT_CUDA_DRIVER_CALL=1
    TORCH_TARGET_VERSION=0x020B000000000000ULL # 对应 PyTorch 2.11
    USE_CUDA
)
vllm/_custom_ops.py core-logic

Python 自定义操作绑定文件,更新了假操作注册和实际调用接口,确保与上游新操作名一致。

# 检查扩展中是否存在 fusedQuantizeNvAbsMax 操作(原 fusedQuantizeNv 已被替换)
if hasattr(torch.ops._qutlass_C, "fusedQuantizeNvAbsMax"):
​
    @register_fake("_qutlass_C::fusedQuantizeNvAbsMax")
    def _fake_fused_quantize_nv_absmax(
        a: torch.Tensor,
        b: torch.Tensor,
        xh_e2m1: torch.Tensor,
        xh_e4m3: torch.Tensor,
        global_scale: torch.Tensor,
    ):
        # 假操作:仅返回占位张量,用于 Torch 编译或形状推导
        return xh_e2m1, xh_e4m3
​
​
def fusedQuantizeNv(
    a: torch.Tensor, b: torch.Tensor, global_scale: torch.Tensor
) -> tuple[torch.Tensor, torch.Tensor]:
    # ... 分配 xh_e2m1 和 xh_e4m3 ...
    # 调用更新后的操作名 fusedQuantizeNvAbsMax(而非之前 fusedQuantizeNv)
    return torch.ops._qutlass_C.fusedQuantizeNvAbsMax(
        a, b, xh_e2m1, xh_e4m3, global_scale
    )

评论区精华

上游仓库选择 other

初始版本将上游仓库指向个人 fork,depthfirst-app[bot] 指出供应链风险。作者后改回组织仓库 IST-DASLab/qutlass。

结论:最终使用上游组织仓库的提交,风险解决。 · 已解决

添加额外源文件必要性 question

janeyx99 询问为何添加 fused_quantize_mx_mask.cu。作者解释因 QuTLASS 的 bindings.cpp 已包含该文件中的函数,必须编译。

结论:确认为必要变更,因上游代码已引用。 · 已解决

风险与影响

  • 回归风险: 操作名从 fusedQuantizeNv 改为 fusedQuantizeNvAbsMax,若其他代码(如测试或下游模块)仍引用旧名,会导致运行时错误。但当前代码中 fusedQuantizeNv 函数已更改内部调用,外部接口名未变。
  • 构建兼容性: 新增的 TORCH_TARGET_VERSION 编译定义可能与其他PyTorch版本不兼容,但测试通过。
  • 功能影响: 功能逻辑保持不变(调用方法名变化),对用户透明。
  • 用户: 无直接影响,所有API保持向后兼容。
  • 系统: _qutlass_C 扩展成为ABI稳定,提升了跨PyTorch版本的兼容性。
  • 团队: 需确保新的上游提交稳定;未来更新QuTLASS时需关注ABI相关变更。
操作名变更可能引入回归 上游依赖版本锁定

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论