跳到主要内容

Triton MUSA

Triton MUSA 是一套面向 MUSA 后端适配的 Triton 语言与编译器栈,用于使用 Python 编写并运行面向 MUSA 设备的高性能 GPU Kernel。

概述

什么是 Triton MUSA

Triton MUSA(MUSA 后端适配的 Triton 语言与编译器栈)是 Triton 语言和编译器栈的 MUSA 后端适配。triton_musa 允许用户使用 Triton DSL 以 Python 方式编写 GPU Kernel,并将其编译为能够在 MUSA 设备上运行的二进制产物。它是一个面向 MUSA 硬件的、以 Python 为中心的 Kernel 编程环境和编译工具链。现代工作负载经常需要自定义 Kernel 来实现算子融合、带宽优化、特殊布局支持或硬件特性利用。纯框架算子往往不够,而手写底层 Kernel 的开发和维护成本又很高。triton_musa 缩小了开发效率与运行性能之间的差距。用户可以用 Python 编写 Kernel,而不是直接编写底层设备代码,同时仍然能够获得优化后的后端代码生成结果。

关键特性

triton_musa 提供以下能力:

  • 基于 @triton.jit 的 Python Kernel 编程方式
  • MUSA / MTGPU 后端支持,并且在多个驱动同时可用时优先选择 MTGPU 驱动
  • 从 Triton Kernel 到后端二进制产物的 JIT 编译流程
  • tl.loadtl.storetl.arangetl.dot 以及 launch grid 等标准 Triton 语言构造的支持
  • 通过 triton.autotunetriton.Confignum_warpsnum_stages 进行性能调优
  • 通过 triton.musa_testing.do_bench 进行 MUSA 性能测试
  • 面向 MUSA 的 AOT 编译路径,可生成 C 启动代码和嵌入式 mubin
  • 面向 MUSA 架构特性的矩阵加速和数据搬运路径,包括 TME、WMMA、WGMMA 风格的 warp-group 矩阵计算模型以及 SQMMA
  • 通过 MLIR 和 LLVM IR dump 开关进行编译器调试

适用读者

本文档适用于:

  • 希望在 MUSA 设备上编写和运行 Triton Kernel 的用户
  • 需要调试、压测或集成 MUSA 定向 Kernel 的开发者

工作原理

工作流程

主要组成部分

  • 前端 用户使用 Triton 装饰器和语言 API 在 Python 中编写 Kernel。
  • 编译器 Triton 将 Kernel Lower 到多个中间表示,执行优化 Pass,最终为 MUSA 生成后端代码。
  • 运行时 Runtime 负责选择当前激活的后端驱动并启动已编译的 Kernel。
  • 后端 MUSA 后端提供目标相关的代码生成、启动桩代码以及 AOT 集成能力。

驱动选择

在当前版本中,如果运行时检测到多个驱动同时处于激活状态,会优先选择 MTGPU 驱动。用户通常不需要手动选择驱动,只需要确认 MUSA Runtime、Driver 和 torch_musa 环境可用。

架构

从用户视角看,整个栈可以理解为:

  1. 使用 Python 编写 Kernel
  2. 通过 JIT 或 AOT 完成编译
  3. device="musa" 上分配 Tensor 并发起运行
  4. 与 PyTorch 参考实现进行正确性校验
  5. 对性能进行测试和调优

环境与前置条件

在使用 triton_musa 之前,需要准备以下环境:

  • Linux 环境
  • Python 3.10
  • 正确安装并可用的 MUSA Runtime 和 Driver
  • torch_musa
  • 与当前 Python 版本、操作系统和硬件环境匹配的 Triton MUSA Wheel 包

推荐先执行以下检查:

python - <<'PY'
import torch
import torch_musa
import triton
print("triton version:", triton.__version__)
print("has torch.musa:", hasattr(torch, "musa"))
print("musa available:", hasattr(torch, "musa") and torch.musa.is_available())
PY

如果还想进一步查看当前 Triton 目标信息:

python - <<'PY'
import torch_musa
from triton.runtime.driver import driver
target = driver.active.get_current_target()
print("backend:", target.backend)
print("arch:", target.arch)
print("warp_size:", target.warp_size)
PY

快速开始

准备安装包

请从产品发布渠道获取与当前环境匹配的 Triton MUSA Wheel 包。Wheel 文件名通常包含 Python ABI、平台和架构信息,例如 cp310linux_x86_64 等标签。安装前请确认:

  • Wheel 包对应当前 Python 3.10 环境
  • torch_musa、MUSA Runtime 和 Driver 版本互相匹配
  • 当前 Python 环境中没有会覆盖该包的上游 triton 安装

安装 Wheel 包

python -m pip install --upgrade pip
python -m pip install ./triton-<version>-<python>-<platform>.whl

如果当前环境中已经安装过其他 Triton 包,建议先确认来源:

python -m pip show triton

如需替换旧版本,可以先卸载后重新安装发布的 Wheel 包:

python -m pip uninstall -y triton
python -m pip install ./triton-<version>-<python>-<platform>.whl

首次功能验证

安装完成后,先验证 import 与 target 检测是否正常:

python - <<'PY'
import triton
import torch
import torch_musa
from triton.runtime.driver import driver

print("triton:", triton.__version__)
print("musa available:", torch.musa.is_available())
print("target:", driver.active.get_current_target())
PY

主要操作与 API

面向用户最常用的 API 包括:

  • @triton.jit 将 Python 函数标记为 Triton Kernel。
  • triton.cdiv 用于 launch grid 计算的向上取整除法辅助函数。
  • triton.autotunetriton.Config 用于配置搜索与运行时调优。
  • triton.testing.do_bench 通用性能测试辅助函数。
  • triton.musa_testing.do_bench MUSA 专用性能测试辅助函数。
  • triton.compile 编程方式调用的编译入口。
  • python -m triton.tools.compile 支持 musa 目标的 AOT 编译工具。
  • triton.tools.experimental_descriptor.create_1d_tma_descriptor 创建一维 TME/TMA descriptor。
  • triton.tools.experimental_descriptor.create_2d_tma_descriptor 创建二维 TME/TMA descriptor,常用于 GEMM 的矩阵 tile 搬运。
  • triton.tools.experimental_descriptor.create_3d_tma_descriptor 创建三维 TME/TMA descriptor。

常用 Triton 语言 API 包括:

  • tl.program_id
  • tl.arange
  • tl.load
  • tl.store
  • tl.dot
  • tl.zeros
  • tl.constexpr
  • tl._experimental_descriptor_load
  • tl._experimental_descriptor_store

示例代码

最小 Vector Add 示例

下面是一个可直接保存并运行的最小示例。请将示例保存为 .py 文件后执行,@triton.jit 需要读取 Kernel 函数源码,不建议从标准输入或临时交互片段中定义 Kernel。

import torch
import torch_musa
import triton
import triton.language as tl


@triton.jit
def add_kernel(x_ptr, y_ptr, output_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
pid = tl.program_id(axis=0)
block_start = pid * BLOCK_SIZE
offsets = block_start + tl.arange(0, BLOCK_SIZE)
mask = offsets < n_elements
x = tl.load(x_ptr + offsets, mask=mask)
y = tl.load(y_ptr + offsets, mask=mask)
tl.store(output_ptr + offsets, x + y, mask=mask)


def add(x: torch.Tensor, y: torch.Tensor):
output = torch.empty_like(x)
n_elements = output.numel()
grid = lambda meta: (triton.cdiv(n_elements, meta["BLOCK_SIZE"]),)
add_kernel[grid](x, y, output, n_elements, BLOCK_SIZE=1024)
return output


x = torch.rand(98432, device="musa", dtype=torch.float32)
y = torch.rand(98432, device="musa", dtype=torch.float32)
out = add(x, y)
ref = x + y
torch.testing.assert_close(out, ref)
print("vector add passed")

Benchmark 示例

ms = triton.musa_testing.do_bench(lambda: add(x, y))
print(f"triton add latency: {ms:.4f} ms")

面向 MUSA 的高级示例入口

如果发布包或配套材料中随附高级示例,可以优先参考其中的 descriptor-based load/store、GEMM benchmark、WMMA、SQMMA 和 AOT 代码生成示例。未随包提供示例时,可先基于本文档的最小 Vector Add 示例确认安装和运行环境。

关键性能数据

Matmul (4096*4096) 性能达到手写汇编的 72%。

备注

该数值仅做参考。Triton MUSA 的实际性能取决于算子形状、数据类型、目标架构、Wheel 包版本以及调优参数。建议按照本文档中的验证和 benchmark 方法在目标环境中实测。

测试与验证

用户侧推荐以安装验证、最小 Kernel 正确性验证和性能基准验证为主。

安装验证

python - <<'PY'
import triton
import torch
import torch_musa
from triton.runtime.driver import driver

print("triton:", triton.__version__)
print("musa available:", torch.musa.is_available())
print("target:", driver.active.get_current_target())
PY

Kernel 正确性验证

运行本文档中的最小 Vector Add 示例,并确认输出包含:

vector add passed

性能验证

在正确性验证通过后,再运行 Benchmark 示例,确认 triton.musa_testing.do_bench 能返回稳定的耗时数据。

验证检查项:

  • Import 成功
  • torch.musa.is_available() 返回 True
  • 当前激活目标后端为 musa
  • Kernel 输出与 PyTorch 参考实现一致
  • Benchmark 可以正常运行
  • 开启编译器 dump 选项时,能够生成预期的中间结果

调试与故障排查

常用环境变量

这些开关只在需要时启用:

# 始终强制重新编译 Kernel
TRITON_ALWAYS_COMPILE=1

# Dump Triton 中所有 MLIR 中间结果
MLIR_ENABLE_DUMP=1

# Dump Triton 中所有 LLVM IR 中间结果
LLVM_IR_ENABLE_DUMP=1

# Dump MUSA 流程最终 LLVM IR
MUSA_ENABLE_DUMP_LLVM=1

# 用自定义文件替换最终 LLVM IR
cp replace.llir /usr/local/musa/mtgpu/bitcode/replace.llir
MUSA_REPLACE_IR=1

另外一些 Triton 已支持的常用调试开关:

TRITON_INTERPRET=1
TRITON_PRINT_AUTOTUNING=1
MLIR_ENABLE_TIMING=1
LLVM_ENABLE_TIMING=1

常见问题

现象可能原因建议处理方式
torch.musa.is_available()FalseRuntime 或 Driver 未准备好检查 MUSA 安装和 torch_musa 环境
当前后端不是 musaRuntime 选择了其他后端检查环境并打印 driver.active.get_current_target()
安装 Wheel 失败Wheel 标签与 Python 版本或系统平台不匹配更换与当前环境匹配的 Wheel 包
import triton 后版本不符合预期环境中已有其他 triton使用 python -m pip show triton 确认安装位置,必要时卸载后重装发布包
IR dump 没变化命中了缓存,复用了已有编译产物开启 TRITON_ALWAYS_COMPILE=1,必要时清理 Triton cache
上游 Triton 示例里仍然使用 cuda上游示例面向 CUDA 后端将示例中的 device 字符串和环境依赖改成 MUSA 对应写法

建议的调试流程

推荐顺序:

  1. 先验证设备是否可用
  2. 再运行一个最小 Kernel
  3. 与 PyTorch 参考结果做对比
  4. 在正确版本上进行性能测试
  5. 只有在需要看编译器行为时才开启 MLIR / LLVM dump
  6. 如问题仍然存在,记录 Wheel 版本、MUSA Driver/Runtime 版本、torch_musa 版本和最小复现代码后反馈给支持人员

高级主题

AOT 编译

如果安装包包含 triton.tools.compile 模块,可以通过 python -m triton.tools.compile 使用面向 musa 的 AOT 编译能力。它可以读取用户自己的 Triton Kernel Python 文件,并生成自包含的 C 启动代码以及嵌入式后端二进制数据。

用于 AOT 编译的 Python 文件建议只包含 Kernel 定义和必要的 import,避免在文件顶层执行设备分配或 Kernel launch。--signature 需要按照 Kernel 参数顺序填写;如果 Kernel 中包含 tl.constexpr meta 参数,也需要在对应位置提供常量值。

典型流程:

  1. 查询当前激活目标:
python - <<'PY'
import torch_musa
from triton.runtime.driver import driver
t = driver.active.get_current_target()
print(t.backend, t.arch, t.warp_size)
PY
  1. 使用显式目标参数编译 Kernel:
python -m triton.tools.compile \
--kernel-name add_kernel \
--signature "*fp32,*fp32,*fp32,i32,1024" \
--grid 1,1,1 \
--target-backend musa \
--target-arch <arch> \
--target-warp-size <warp_size> \
path/to/kernel.py

MUSA 架构特性概览

Triton MUSA 的用户层编程模型尽量保持 Triton 风格:普通访存使用 tl.load / tl.store,矩阵计算使用 tl.dot,性能调优通过 block size、num_warpsnum_stages 和 autotune 配置完成。面向具体 MUSA 架构的 TME、WMMA、WGMMA 风格矩阵计算模型和 SQMMA 由后端在编译阶段选择和降级,用户通常不需要直接写底层指令。

这些能力是否生效取决于当前硬件架构、数据类型、矩阵 tile shape、访存布局以及 Wheel 包版本。建议先通过下面的方式确认当前目标架构:

python - <<'PY'
import torch_musa
from triton.runtime.driver import driver
t = driver.active.get_current_target()
print("backend:", t.backend)
print("arch:", t.arch)
print("warp_size:", t.warp_size)
PY

TME 与 Descriptor Load/Store

TME(Tensor Memory Engine)用于以 descriptor 描述张量 tile 的形状、跨度、元素大小和基地址,再由硬件执行更适合矩阵 tile 的数据搬运。Triton MUSA 中,descriptor-based 工作流通常由两部分组成:

  • Host 侧创建 descriptor:create_1d_tma_descriptorcreate_2d_tma_descriptorcreate_3d_tma_descriptor
  • Kernel 侧通过 tl._experimental_descriptor_load / tl._experimental_descriptor_store 读写 descriptor 描述的 tile

这种方式常用于 GEMM、batched GEMM、带特殊布局的矩阵读写,尤其适合与 tl.dot 组成高性能矩阵 Kernel。descriptor 接口属于高级接口,函数名中带有 _experimental 的部分以后可能随版本演进调整;生产代码建议以当前 Wheel 包的发布说明和随包示例为准。

WMMA、WGMMA 与 SQMMA

WMMA、WGMMA 和 SQMMA 都属于矩阵乘加相关的硬件加速路径,但关注层级不同:

  • WMMA 通常表示 warp 级矩阵计算路径,适合较传统的矩阵 tile 计算。
  • WGMMA 表示 warp-group 级矩阵计算模型,常见于上游 Triton/Hopper 相关材料。对 Triton MUSA 用户来说,它更适合作为理解“多 warp 协作完成矩阵乘加”的概念;实际 MUSA 后端会根据目标架构选择对应的矩阵加速 lowering。
  • SQMMA 是 MUSA/MTGPU 后端面向特定架构的矩阵加速路径。对满足条件的 tl.dot,后端可以在编译阶段将其降级到 SQMMA 相关实现,从而利用硬件矩阵乘加能力。

实际开发时,推荐从标准 tl.dot 写法开始,再结合 TME descriptor、合适的 block size 和 autotune 搜索优化性能。不是所有 dtype、tile shape 和 num_warps 组合都会触发同一种矩阵加速路径;如果需要对比或定位矩阵 lowering,可以临时使用 DISABLE_SQMMA=1DISABLE_WMMA=1 关闭对应路径进行 A/B 验证。


相关文档