Prhub

#44478 [CPU][RISC-V] Enable oneDNN W8A8 INT8 to run on RISC-V

原始 PR 作者 velonica0 合并时间 2026-06-11 12:09 文件变更 4 提交数 5 评论 0 代码增减 +42 / -5

执行摘要

使 RISC-V 平台支持 oneDNN W8A8 INT8 量化

在 RISC-V 上加载压缩感知 W8A8 模型会立即崩溃。vLLM 的 CPU W8A8 调度器中 oneDNN 路径仅在 x86 SGL 和部分 ARM/POWER 架构上编译,而 RISC-V 被意外排除。该 PR 解决了从 CMake 编译门到算子注册再到向量类型的全链路阻断。

建议对 RISC-V 部署有兴趣的团队密切测试,并关注 future PR 中的性能改进。设计上值得注意:采用最小化改动原则,仅打开编译门和补充必要的向量类型,而不动调度逻辑。

讨论亮点

该 PR 没有引发讨论,由维护者直接批准合并。

实现拆解

  1. 新增 int8 向量类型:在 csrc/cpu/cpu_types_riscv_defs.hpp 中添加 fixed_i8x16_t typedef,表示 16 个 int8 元素的固定向量。
  2. 实现 INT8Vec16 类:在 csrc/cpu/cpu_types_riscv_impl.hpp 中新增 INT8Vec16,提供从 FP32Vec16 到 INT8 的转换(通过 VFCVT 和两次 VNCLIP)以及存储操作;同时为 FP32Vec16 增加了带元素数参数的 max/min 重载,支持可变长度操作。
  3. 扩展算子注册条件:在 csrc/cpu/torch_bindings.cpp 中将 oneDNN 相关算子的条件编译宏扩展为包含 defined(__riscv_v),使 RISC-V 能注册 release_dnnl_matmul_handlercreate_onednn_mm_handleronednn_mmcreate_onednn_scaled_mm_handleronednn_scaled_mm 等算子。
  4. 调整 CMake 构建配置:在 cmake/cpu_extension.cmake 中,当 VLLM_RVV_VLEN 被定义但非法时报错,并移除了 VLLM_RVV_VLEN=0 的降级选项;将 oneDNN 的构建条件从仅 x86/ARM/POWER 扩展到检测到 RVV_FP16RVV_BF16 时也启用。
文件 模块 状态 重要度
csrc/cpu/cpu_types_riscv_impl.hpp RVV 向量库 modified 6.67
csrc/cpu/torch_bindings.cpp 算子注册 modified 5.82
csrc/cpu/cpu_types_riscv_defs.hpp 类型定义 modified 5.3
cmake/cpu_extension.cmake 构建配置 modified 3.93

关键符号

INT8Vec16::INT8Vec16(const FP32Vec16&) INT8Vec16::save(int8_t*) INT8Vec16::save(int8_t*, int) FP32Vec16::max(const FP32Vec16&, int) FP32Vec16::min(const FP32Vec16&, int)

关键源码片段

csrc/cpu/cpu_types_riscv_impl.hpp core-logic

新增 INT8Vec16 类和 FP32Vec16 的 elem_num 参数重载,是量化路径的核心向量类型。

// INT8Vec16: 将 FP32 向量量化为 INT8 并存储
struct INT8Vec16 : public Vec<INT8Vec16> {
  constexpr static int VEC_ELEM_NUM = 16;
  fixed_i8x16_t reg;  // 从 FP32Vec16 转换 : VFCVT→VNCLIP(w, 0, RN)→VNCLIP(w, 0, RN)
  explicit INT8Vec16(const FP32Vec16& vec) {
    auto i32_vec =
        RVVI(__riscv_vfcvt_x_f_v_i32, LMUL_512)(vec.reg, VEC_ELEM_NUM);
    auto i16_vec = RVVI(__riscv_vnclip_wx_i16, LMUL_256)(
        i32_vec, 0, __RISCV_VXRM_RNU, VEC_ELEM_NUM);
    reg = RVVI(__riscv_vnclip_wx_i8, LMUL_128)(i16_vec, 0, __RISCV_VXRM_RNU,
                                               VEC_ELEM_NUM);
  }  // 存储全部 16 个元素
  void save(int8_t* ptr) const {
    RVVI(__riscv_vse8_v_i8, LMUL_128)(ptr, reg, VEC_ELEM_NUM);
  }
  // 存储前 elem_num 个元素
  void save(int8_t* ptr, int elem_num) const {
    RVVI(__riscv_vse8_v_i8, LMUL_128)(ptr, reg, elem_num);
  }
};// FP32Vec16 增加可变元素数重载,与固定 VEC_ELEM_NUM 互备
FP32Vec16 max(const FP32Vec16& b, const int elem_num) const {
  return FP32Vec16(
      RVVI(__riscv_vfmax_vv_f32, LMUL_512)(reg, b.reg, elem_num));
}
FP32Vec16 min(const FP32Vec16& b, const int elem_num) const {
  return FP32Vec16(
      RVVI(__riscv_vfmin_vv_f32, LMUL_512)(reg, b.reg, elem_num));
}
csrc/cpu/torch_bindings.cpp core-logic

修改条件编译宏,使 oneDNN 算子在 RISC-V 上注册。

// 之前 : 仅 x86、AArch64 或 POWER 编译 oneDNN 算子
// 之后 : 增加 RISC-V RVV 条件
#if defined(__AVX512F__) || defined(__AVX2__) || \
    (defined(__aarch64__) && !defined(__APPLE__)) || defined(__powerpc64__) || \
    defined(__riscv_v) /* <-- 新增 RISC-V 分支 */
  // 以下 oneDNN 相关算子在满足条件时注册
  ops.def("release_dnnl_matmul_handler(int handler) -> ()", &release_dnnl_matmul_handler);
  ops.def("create_onednn_mm_handler(...) -> int", &create_onednn_mm_handler);
  ops.impl("onednn_mm", torch::kCPU, &onednn_mm);
  ops.def("is_onednn_acl_supported() -> bool", &is_onednn_acl_supported);
  ops.def("create_onednn_scaled_mm_handler(...) -> int", &create_onednn_scaled_mm_handler);
  ops.def("onednn_scaled_mm(...) -> ()");
  ops.impl("onednn_scaled_mm", torch::kCPU, &onednn_scaled_mm);
#endif

评论区精华

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

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

风险与影响

主要风险在于 oneDNN 在 RISC-V 上的性能未经验证(PR body 中给出了初步延迟数据:生成仅 0.245 token/s),但功能正确性得到了验证。RVV 向量长度(VLEN)的编译时配置(VLLM_RVV_VLEN)如果不匹配实际硬件可能导致崩溃或性能下降。新引入的 INT8Vec16 类使用窄化(vnclip)进行转换,可能存在精度损失风险(但符合标准 INT8 量化)。CMake 条件中要求同时检测 RVV_FP16 和 RVV_BF16 才启用 oneDNN,部分 RISC-V 硬件可能支持 RVV 但不支持 BF16,导致意外禁用。此外,改动波及了 cmake/ 和 csrc/cpu/ 下的共享逻辑,但只是增加 || 条件,对其他架构影响很小。

对用户:RISC-V 用户现在可以加载 W8A8 量化的模型,但性能较低(约 0.245 token/s)。对其他架构无影响。对系统:为 CPU 后端新增了一个平台支持,扩展了 vLLM 的硬件兼容性。对团队:维护者需要关注 RISC-V 的后续性能优化和 CI 覆盖。

新平台支持 编译条件可能遗漏 性能未经充分验证

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论