Prhub

#17946 [MUSA][8/N] Port CUDA kernels that are compatible with MUSA

原始 PR 作者 yafengio 合并时间 2026-04-24 09:04 文件变更 15 提交数 2 评论 63 代码增减 +1905 / -66

执行摘要

移植 CUDA 内核到 MUSA,支持 Moore Threads GPU

为 Moore Threads GPU(MUSA 架构)提供完整的 LLM 推理加速支持,延续 #16565 的工作。PR body 明确指出目标是在 SGLang 中通过 MUSA 启用核心内核功能,同时保持 CUDA、ROCm 和 MUSA 后端的统一代码库。

建议精读:重点关注 common_extension_musa.ccsetup_musa.py 以理解 MUSA 算子注册机制;fused_add_rms_norm_kernel.mu 展示了 MUSA 内联汇编和 warp 同步模式;custom_all_reduce.cuh 中的多后端条件编译策略值得参考。开发者需注意 MUSA 专用代码的维护成本。

讨论亮点
  1. 关键缺陷:@gemini-code-assist[bot] 指出 fused_add_rms_norm_kernel.mu 中的 DISPATCH_KERNEL 宏缺少 float 类型分支,可能导致 float 张量无内核启动。
  2. 代码冗余:@gemini-code-assist[bot] 指出 custom_all_reduce.cuhkDefaultBlockLimitkMaxBlocks 值重复,建议直接使用 kMaxBlocks
  3. MUSA 实现讨论:@alexnails 对 moe_fused_gate_musa.cu 中的排序算法效率(O(N^2))和忙等待同步提出疑问,@yafengio 回应称这是当前最快的实现。
  4. AMD 兼容性:@alexnails 担心 torchada 版本升级影响 AMD 用户,@yafengio 和 @yeahdongcn 澄清该包仅用于 MUSA 环境检测,不影响 AMD。
  5. 内存访问优化:@alexnails 建议使用 __builtin_assume_aligned 优化对齐加载,@yafengio 认为 MUSA 编译器收益不明确,保持现状。

实现拆解

  1. 算子注册扩展sgl-kernel/csrc/common_extension_musa.cc):将算子注册从仅包含 sampling 扩展为涵盖 allreduce、attention、elementwise、gemm、moe、quantization、speculative 共约 30 个算子,每个算子通过 m.impl("op", torch::kMUSA, &func) 关联到 MUSA 设备。
  2. 构建系统适配sgl-kernel/setup_musa.py):将源文件列表从 3 个扩展至 33 个,新增了 allreduce、attention、elementwise、moe、gemm、speculative、kvcacheio、memory 等目录下的 .cu 和 .mu 文件;同时移除了 flashinfer 的 sampling.cu,因为该函数已被内部实现替代。
  3. MUSA 专用内核实现
    • sgl-kernel/csrc/elementwise/fused_add_rms_norm_kernel.mu(新增 529 行):使用 MUSA 内建函数和 warp 同步原语实现 fused RMSNorm + addition,支持 float16、bfloat16、float32,通过模板 rms_fused_add_rms_norm 分发。
    • sgl-kernel/csrc/moe/moe_fused_gate_musa.cu(新增 840 行):实现 MoE 门控融合内核,使用 mutlass 库和自定义 warp 级操作,支持动态参数与 TopK 选择。
    • sgl-kernel/csrc/allreduce/custom_all_reduce.cuh(修改):为 MUSA 定义不同的线程块限制(kMaxBlocks=60kDefaultThreads=1024),并实现基于 __shfl_xor_sync 和忙等待的 MUSA 特定 reduce 逻辑。
  4. 跨平台兼容性适配:通过预处理指令 #ifdef USE_MUSA 区分 MUSA 与 CUDA/ROCm 代码路径,确保非 MUSA 平台不受影响。修改涉及多个 .cuh 和 .cu 文件中的条件编译、同步原语替换(如 __syncthreads_lm vs __syncthreads)和类型转换判断。
  5. 依赖与配置更新pyproject_musa.tomltorchada 版本从 0.1.14 提升至 0.1.25,3rdparty/amd/wheel/sglang/pyproject.tomlpython/pyproject_other.toml 中的 MUSA 依赖也从 0.1.25 升级至 0.1.43。
文件 模块 状态 重要度
sgl-kernel/csrc/common_extension_musa.cc 算子注册 modified 7.33
sgl-kernel/setup_musa.py 构建脚本 modified 6.21
sgl-kernel/csrc/elementwise/fused_add_rms_norm_kernel.mu 元素运算 added 6.71
sgl-kernel/csrc/allreduce/custom_all_reduce.cuh 通信内核 modified 5.31
sgl-kernel/csrc/moe/moe_fused_gate_musa.cu MoE 内核 added 6.02

关键符号

musa_fused_add_rms_norm moe_fused_gate_impl_dynamic init_custom_ar all_reduce st_flag_release ld_flag_acquire

关键源码片段

sgl-kernel/csrc/common_extension_musa.cc core-logic

MUSA 算子注册中心,新增约 30 个算子注册,是 MUSA 后端的核心入口。

// sgl-kernel/csrc/common_extension_musa.cc
// 注册 allreduce 相关算子(MUSA 特定实现)
m.def("get_graph_buffer_ipc_meta", &get_graph_buffer_ipc_meta);
m.def("register_graph_buffers", &register_graph_buffers);
m.def("dispose", &dispose);
m.def("meta_size", &meta_size);
m.def("register_buffer", &register_buffer);
// 初始化自定义 allreduce,绑定到 MUSA 设备
m.def("init_custom_ar(int[] ipc_tensors, Tensor rank_data, int rank, bool full_nvlink) -> int");
m.impl("init_custom_ar", torch::kMUSA, &init_custom_ar);
// all_reduce 操作
m.def("all_reduce(int fa, Tensor inp, Tensor! out, int reg_buffer, int reg_buffer_sz_bytes) -> ()");
m.impl("all_reduce", torch::kMUSA, &all_reduce);// 注册 elementwise 内核
m.def("fused_add_rmsnorm(Tensor! input, Tensor! residual, Tensor weight, float eps, bool enable_pdl) -> ()");
m.impl("fused_add_rmsnorm", torch::kMUSA, &musa_fused_add_rms_norm); // 注意:使用 MUSA 专用实现
// ... 其他类似注册
sgl-kernel/setup_musa.py core-logic

MUSA 构建脚本,新增大量源文件编译,决定了 MUSA 后端的构建正确性。

# sgl-kernel/setup_musa.py
# 源文件列表(部分)
sources = [
    "csrc/allreduce/custom_all_reduce.cu", # 新增:MUSA 专用 allreduce
    "csrc/attention/merge_attn_states.cu", # 新增:注意力合并
    "csrc/common_extension_musa.cc", # 原有:算子注册
    "csrc/elementwise/activation.cu", # 新增:激活函数
    "csrc/elementwise/concat_mla.cu", # 新增:MLA 拼接
    "csrc/elementwise/fused_add_rms_norm_kernel.mu", # 新增:融合 RMSNorm
    "csrc/moe/moe_fused_gate_musa.cu", # 新增:MoE 门控
    "csrc/gemm/awq_kernel.cu", # 新增:AWQ 反量化
    # ... 共 33 个源文件
]
# 移除了 flashinfer 的 sampling.cu,因为已被内部实现替代
sgl-kernel/csrc/elementwise/fused_add_rms_norm_kernel.mu core-logic

MUSA 专用 fused add RMSNorm 内核,529 行,展示了 MUSA 内联汇编和 warp 级同步。

// sgl-kernel/csrc/elementwise/fused_add_rms_norm_kernel.mu(部分)
// 使用 MUSA 内建函数实现 warp 级 reduce,然后计算 RMSNorm
// 注意:DISPATCH_KERNEL 宏缺少 float 分支(根据 review 评论)
template <typename T, int BLOCK_X, int BLOCK_Y>
__global__ void rms_fused_add_rms_norm_kernel(...) {
    // ... 共享内存声明
    // 使用 __shfl_down_sync 进行 warp 内求和
    // 最终写入输出
}// 入口函数,分发到不同模板实例
void musa_fused_add_rms_norm(
    torch::Tensor& input, torch::Tensor& residual,
    torch::Tensor& weight, double epsilon, bool enable_pdl) {
    // 根据数据类型和形状选择 BLOCK_X/BLOCK_Y
    // 调用 DISPATCH_KERNEL 宏启动内核
}

评论区精华

float 类型缺失导致内核不启动 正确性

gemini-code-assist[bot] 指出 DISPATCH_KERNEL 宏缺少 float 分支,导致 float 张量无内核启动。

结论:未修复(可能已在下游 PR 修复),需开发者在后续版本补充。 · unresolved

kDefaultBlockLimit 冗余 style

gemini-code-assist[bot] 建议移除 kDefaultBlockLimit,直接使用 kMaxBlocks。

结论:未采纳(保持现状)。 · unresolved

torchada 升级对 AMD 的影响 question

alexnails 担心 torchada>=0.1.43 影响 AMD 用户;yafengio 和 yeahdongcn 澄清该包仅用于 MUSA 环境检测。

结论:确认无影响,因为仅用于 srt_musa 配置组。 · 已解决

忙等待同步的性能优化 性能

alexnails 质疑 MUSA 实现中忙等待的性能;yafengio 回应称这是当前最快的方式。

结论:保持忙等待实现。 · 已解决

MoE 门控 kernel 中的排序优化 性能

alexnails 指出 O(N^2) 排序可以优化;未看到显式回应。

结论:无结论。 · unresolved

风险与影响

回归风险:新增 MUSA 专用代码通过 #ifdef USE_MUSA 隔离,但修改了多个共享头文件(如 ggml-common.hcustom_all_reduce.cuh),若条件编译有误可能影响 CUDA/ROCm 后端。例如 custom_all_reduce.cuhst_flag_releaseld_flag_acquire 的分支可能导致非 MUSA 构建错误。性能风险:MUSA 内核采用与 CUDA 不同的参数(如更大的块限制),可能不适合某些工作负载。缺少测试覆盖:本 PR 未包含 MUSA 测试用例,无法验证新移植内核的正确性。

用户影响:为 Moore Threads GPU 用户提供 LLM 推理加速能力,需安装 torch_musa 和对应依赖。系统影响:扩展了 sgl-kernel 的构建配置,增加了约 2MB 二进制体积。团队影响:为后续 MUSA 支持 PR 奠定基础,预计仍需 2-3 个 PR 完成全部移植。

缺少测试覆盖 共享头文件条件编译风险 float 类型缺失

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论