Prhub

#44334 [10/n] Migrate cuda_view and silu_and_mul_per_block_quant kernels to torch stale ABI.

原始 PR 作者 cleonard530 合并时间 2026-06-05 11:14 文件变更 25 提交数 15 评论 26 代码增减 +187 / -164

执行摘要

迁移 cuda_view 和 silu_and_mul 内核到 stable ABI

继续 libtorch stable ABI 迁移,减少对 torch 私有 API 的依赖,实现 torch 跨版本兼容。PR body 指出目标是将不稳定 ABI 内核从 85 个逐步降至 0;同时消除重复编译,简化 CMake 配置。

值得阅读,特别是理解 stable ABI 迁移的增量策略和 torch 版本依赖管理。对于参与 CUDA 内核编译的开发者有参考价值。

讨论亮点
  • Torch 版本要求:janeyx99 提议将最低运行时版本提升至 2.11 以简化 deleter,Harry-Chen 回应团队计划逐步迁移到 2.12,但同意临时设 2.11 可接受。最终 PR 实现了此调整。
  • Use-after-free 风险:depthfirst-app[bot] 在 review 中指出 cuda_view.cu 的 torch 2.10 fallback 路径缺少 deleter 捕获 CPU tensor,导致其可能被提前释放。cleonard530 通过提升版本至 2.11 移除了 fallback 路径,该问题视为已解决。
  • is_pinned 判断:janeyx99 指出不应直接调用 tensor.is_pinned(),应使用 torch_call_dispatcher 以确保稳定 ABI 兼容。cleonard530 随后修改了代码。
  • ROCm 构建回归:tjtanaa 报告 PR 导致 ROCm 构建失败(因 ROCm 仍使用 torch 2.10),Harry-Chen 致歉并承诺另做修复。该问题在后续 PR #44648 中解决。

实现拆解

  1. 注册迁移:在 csrc/libtorch_stable/torch_bindings.cppSTABLE_TORCH_LIBRARY_FRAGMENT(_C, ops) 中新增 get_cuda_view_from_cpu_tensorsilu_and_mul_per_block_quant 的 op 定义,并在对应的 STABLE_TORCH_LIBRARY_IMPL 中绑定实现。同时新增 _C_cuda_utils 的 stable fragment。
  2. 旧注册清理:在 csrc/torch_bindings.cppTORCH_LIBRARY_EXPAND 中移除上述两个 op 的注册以及 cuda_utils 函数库,消除重复。
  3. 文件搬迁与头文件更新:将 fused_silu_mul_block_quant.cucuda_view.cucutlass_extensions/common.cppcommon.hppcsrc/ 移动到 csrc/libtorch_stable/ 目录;更新所有引用旧路径的 #include 为相对路径。
  4. CMake 配置变更:在 CMakeLists.txt 中将 cuda_utils_kernels.cucutlass_extensions/common.cppVLLM_EXT_SRC(即 _C 构建)中移除,确保它们仅在 _C_stable_libtorch 中编译一次。
  5. Torch 版本底线提升:将 TORCH_TARGET_VERSION2.10 提升至 2.11,从而简化 cuda_view.cufrom_blob 的 deleter 逻辑,避免 torch 2.10 fallback 路径,并消除 use-after-free 风险。
文件 模块 状态 重要度
csrc/libtorch_stable/torch_bindings.cpp 稳定 ABI modified 6.71
csrc/torch_bindings.cpp 旧 ABI 层 modified 6.4
csrc/libtorch_stable/ops.h 稳定 ABI modified 5.77
csrc/libtorch_stable/cuda_view.cu 稳定 ABI added 5.62
csrc/libtorch_stable/quantization/fused_kernels/fused_silu_mul_block_quant.cu 稳定 ABI renamed 5.65
CMakeLists.txt 构建脚本 modified 2.93

关键符号

get_cuda_view_from_cpu_tensor silu_and_mul_per_block_quant get_device_attribute get_max_shared_memory_per_block_device_attribute

关键源码片段

csrc/libtorch_stable/torch_bindings.cpp dependency-wiring

核心注册文件,新增两个 op 的 stable ABI 注册和 cuda_utils 的迁移

// 在 libtorch_stable 的 op 注册中,新增了两个关键操作:STABLE_TORCH_LIBRARY_FRAGMENT(_C, ops) {
  // ... 其他已有注册 ...  // [ 新增 ] 将 CPU tensor 转换为 CUDA 统一虚拟地址 (UVA) 视图
  ops.def("get_cuda_view_from_cpu_tensor(Tensor cpu_tensor) -> Tensor");  // [ 新增 ] 融合 SiLU + 逐元素乘法 + 逐块量化 (FP8/INT8)
  ops.def(
      "silu_and_mul_per_block_quant("
      "Tensor! out, "
      "Tensor input, "
      "Tensor! scales, "
      "int group_size, "
      "Tensor? scale_ub=None, "
      "bool is_scale_transposed=False) -> ()");
}STABLE_TORCH_LIBRARY_IMPL(_C, CUDA, ops) {
  // ... 其他已有 impl ...  // [ 新增 ] silu_and_mul_per_block_quant 的 CUDA 实现绑定
  ops.impl("silu_and_mul_per_block_quant",
           TORCH_BOX(&silu_and_mul_per_block_quant));
}STABLE_TORCH_LIBRARY_IMPL(_C, CPU, ops) {
  // [ 新增 ] get_cuda_view_from_cpu_tensor 的 CPU 实现绑定
  ops.impl("get_cuda_view_from_cpu_tensor",
           TORCH_BOX(&get_cuda_view_from_cpu_tensor));
}// [ 新增 ] cuda_utils 操作也迁移到 stable ABI
STABLE_TORCH_LIBRARY_FRAGMENT(_C_cuda_utils, cuda_utils) {
  cuda_utils.def("get_device_attribute(int attribute, int device_id) -> int");
  cuda_utils.def(
      "get_max_shared_memory_per_block_device_attribute(int device_id) -> int");
}
csrc/libtorch_stable/ops.h core-logic

声明迁移后的函数接口,使用 torch::stable::Tensor

// 在 ops.h 中新增了以下函数声明,采用 torch::stable::Tensor 代替 torch::Tensor// CPU tensor -> CUDA UVA view (shared CUDA/ROCm)
torch::stable::Tensor get_cuda_view_from_cpu_tensor(
    torch::stable::Tensor& cpu_tensor);// 融合 SiLU+Mul + per-block 量化 (FP8/INT8) (shared CUDA/ROCm)
void silu_and_mul_per_block_quant(torch::stable::Tensor& out,
                                   torch::stable::Tensor const& input,
                                   torch::stable::Tensor& scales,
                                   int64_t group_size,
                                   std::optional<torch::stable::Tensor> scale_ub,
                                   bool is_scale_transposed);

评论区精华

最低 torch 版本要求 设计

janeyx99 提议将最低运行时版本提升至 2.11 以简化 deleter;Harry-Chen 回应计划迁移至 2.12,可暂时接受 2.11

结论:最终 PR 将 TORCH_TARGET_VERSION 设为 2.11,简化了 cuda_view.cu · 已解决

torch 2.10 fallback 缺失 deleter 导致 use-after-free 正确性

depthfirst-app[bot] 指出 cuda_view.cu 的 2.10 fallback 路径缺少 deleter 捕获 cpu_tensor,可能导致 use-after-free

结论:通过提升版本至 2.11,移除了 2.10 fallback 路径,风险消除 · 已解决

is_pinned 的稳定 ABI 正确用法 设计

janeyx99 指出不应直接调用 tensor.is_pinned(),应使用 torch_call_dispatcher;cleonard530 随后修改

结论:使用 torch_call_dispatcher 替代直接 is_pinned 调用 · 已解决

ROCm 构建回归 other

tjtanaa 报告 PR 导致 ROCm 构建失败(ROCm 仍使用 torch 2.10);Harry-Chen 致歉并承诺后续修复

结论:需后续 PR 修复(#44648) · unresolved

风险与影响

  • ROCm 兼容性:提升 TORCH_TARGET_VERSION 至 2.11 使得 ROCm(依赖 2.10)构建失败,需紧急修复。
  • use-after-free 遗留:如果某些环境下仍使用 torch 2.10 运行时,旧代码中的 fallback 路径可能已被移除但未被彻底覆盖,存在内存安全风险。
  • 头文件路径冲突:移动 common.hpp 后,部分未同步更新的源文件仍引用旧路径,可能导致编译错误。
  • 用户影响:CUDA 用户无感知;ROCm 用户暂时无法构建 vLLM,需等待后续修复(PR #44648)。
  • 系统影响:减少了对 torch 私有/不稳定 ABI 的依赖,为后续 torch 版本升级扫清障碍;消除了 _C_C_stable_libtorch 中的重复编译链路,构建产物减小。
  • 团队影响:加速了 stable ABI 迁移进度,但需协调 ROCm 平台的回归修复。
ROCm 回归 Torch 版本兼容 头文件路径冲突

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论