triton-lang/triton
GitHub: triton-lang/triton
Triton 是一种用于编写高效深度学习自定义算子的开源编程语言和编译器,旨在以比 CUDA 更高的生产力和更好的灵活性生成高性能 GPU 代码。
Stars: 19746 | Forks: 3031
| **`文档`** | **`每日构建的 Wheels`** |
|-------------------- | -------------------- |
| [](https://triton-lang.org/) | [](https://github.com/triton-lang/triton/actions/workflows/wheels.yml) |
# Triton 大会 2025

第三届 Triton 开发者大会于 2025 年 10 月 21 日在加利福尼亚州山景城的 Microsoft 硅谷园区举行。
### 大会资料
大会录像和相关资料现已上线:
- **大会视频:** [YouTube 播放列表](https://www.youtube.com/playlist?list=PLc_vA1r0qoiQqCdWFDUDqI90oY5EjfGuO)
- **大会幻灯片:** [Google Drive 文件夹](https://drive.google.com/drive/folders/1KB6tD3UM1J0_eUp-F-JSlGrargLBawIr)
如需查看往届大会资料,请访问:
- [2024 年大会资料](docs/meetups/dev_conference_2024.md)
- [2023 年大会资料](docs/meetups/dev-meetup-2023.md)
# Triton
这是 Triton 的开发仓库。Triton 是一种用于编写高效自定义 Deep-Learning 算子的语言和编译器。Triton 的目标是提供一个开源环境,使其编写快速代码的生产力高于 CUDA,同时比其他现有的 DSL 具有更高的灵活性。
该项目的基础在以下 MAPL2019 论文中有所描述:[Triton: An Intermediate Language and Compiler for Tiled Neural Network Computations](http://www.eecs.harvard.edu/~htk/publication/2019-mapl-tillet-kung-cox.pdf)。如果您使用了 Triton,请考虑引用这项工作!
[官方文档](https://triton-lang.org) 包含了安装说明和教程。另请参阅这些第三方的 [Triton puzzles](https://github.com/srush/Triton-Puzzles),它们都可以使用 Triton 解释器运行——无需 GPU。
# 快速安装
你可以通过 pip 安装最新稳定版的 Triton:
```
pip install triton
```
提供适用于 CPython 3.10-3.14 的二进制 wheels。
# 从源码安装
```
git clone https://github.com/triton-lang/triton.git
cd triton
pip install -r python/requirements.txt # build-time dependencies
pip install -e .
```
或者使用 virtualenv:
```
git clone https://github.com/triton-lang/triton.git
cd triton
python -m venv .venv --prompt triton
source .venv/bin/activate
pip install -r python/requirements.txt # build-time dependencies
pip install -e .
```
# 使用自定义的 LLVM 进行构建
Triton 使用 LLVM 来生成 GPU 和 CPU 的代码。通常,Triton 构建过程会下载预编译的 LLVM,但您也可以从源码编译并使用 LLVM。
LLVM 没有稳定的 API,因此 Triton 的构建无法在任意的 LLVM 版本上运行。
为方便起见,请使用以下命令构建 LLVM 并使用该自定义 LLVM 安装 Triton:
```
make dev-install-llvm
```
$ LLVM_INCLUDE_DIRS=$LLVM_BUILD_DIR/include \
LLVM_LIBRARY_DIR=$LLVM_BUILD_DIR/lib \
LLVM_SYSPATH=$LLVM_BUILD_DIR \
pip install -e .
# 构建提示
- 将 `TRITON_BUILD_WITH_CLANG_LLD=true` 设置为环境变量以使用 clang
和 lld。特别是 lld 可以显著加快构建速度。
- 设置 `TRITON_BUILD_WITH_CCACHE=true` 以使用 ccache 进行构建。
- 设置 `TRITON_HOME=/some/path` 以更改 `.triton`
目录的位置,该目录用于存放 Triton 的缓存并在构建期间存储下载内容。默认情况下,这是用户的主目录。您可以随时更改它。
- 如果在构建 Triton 时内存不足,请指定 `MAX_JOBS`
环境变量(在 `pip install -e .` 命令中)以限制作业数量。
- 向 `pip install` 传递 `--no-build-isolation` 可以使 nop 构建更快。
如果不这样做,每次调用 `pip install` 都会使用不同的指向
cmake 的符号链接,这会强制 ninja 重新构建大部分 `.a` 文件。
- 构建系统会在 Triton 仓库目录下创建一个 `compile_commands.json` 文件。此文件被 VSCode IntelliSense 和 clangd 用于为 C++ 代码提供代码补全和其他功能。
如果 IntelliSense 不起作用,您可以尝试以下步骤:
- 进行本地构建。运行命令 `pip install -e .`。
- 获取构建生成的 `compile_commands.json` 文件的完整路径:
`find ./build -name 'compile_commands.json' | xargs readlink -f`。
您可能会得到类似于 `/Users/{username}/triton/build/cmake.macosx-11.1-arm64-cpython-3.12/compile_commands.json` 的完整路径。
- 在 VSCode 中,安装
[C/C++
扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools),
然后打开命令面板(Mac 上按 `Shift + Command + P`,Windows/Linux 上按 `Shift +
Ctrl + P`)并打开 `C/C++: Edit Configurations (UI)`。
- 打开“Advanced Settings”并将 `compile_commands.json` 的完整路径粘贴到 “Compile Commands” 文本框中。
# 运行测试
目前还没有一种直接现成的方法来运行所有的 Triton 测试,但您可以遵循以下方法:
```
# 一次性设置。请注意,这将会重新安装本地 Triton,因为 torch
# 会用公共版本覆盖它。
$ make dev-install
# 要运行所有测试(需要 GPU)
$ make test
# 或者,要在没有 gpu 的情况下运行测试
$ make test-nogpu
```
# 开发技巧
有关如何调试 Triton 前端的详细说明,请参阅此[教程](https://triton-lang.org/main/programming-guide/chapter-3/debugging.html)。以下包含了关于开发 Triton 后端的一些额外技巧。
**配置旋钮**
完整的配置旋钮列表请参见 [`python/triton/knobs.py`](python/triton/knobs.py)。您可以直接在 Python 中设置这些旋钮,或者使用环境变量来控制它们。以下是一些您可以指定的环境变量(完整列表请参见 `knobs.py`):
- `MLIR_ENABLE_DUMP=1` 会在 Triton 运行每个 MLIR pass 之前转储所有 kernel 的 IR。使用 `MLIR_ENABLE_DUMP=kernelName` 可以仅针对特定的 kernel 进行转储。
- Triton 缓存可能会干扰转储。如果 `MLIR_ENABLE_DUMP=1` 不起作用,请尝试清理您的 triton 缓存:`rm -r ~/.triton/cache/*`。
- `MLIR_DUMP_PATH` 指定 `MLIR_ENABLE_DUMP` 转储的位置。如果未设置,将转储到 stderr。
- `LLVM_IR_ENABLE_DUMP=1` 会在每次针对 LLVM IR 运行 pass 之前转储 IR。
- `TRITON_REPRODUCER_PATH=` 会在每个 MLIR 编译阶段之前生成一个 MLIR 复现文件,位于 ``。如果任何阶段失败,`` 将会是捕获失败 pass 之前的本地 MLIR 复现内容。
- `TRITON_INTERPRET=1` 使用 Triton 解释器,而不是在 GPU 上运行。您可以在 kernel 代码中插入 Python 断点!
- `TRITON_ENABLE_LLVM_DEBUG=1` 会向 LLVM 传递 `-debug` 参数,向 stdout 打印大量调试信息。如果这太嘈杂,可以只使用 `TRITON_LLVM_DEBUG_ONLY` 来限制输出。
- 减少输出噪音的另一种方法是使用 `LLVM_IR_ENABLE_DUMP=1` 运行,提取感兴趣的 LLVM pass 之前的 IR,然后独立运行 LLVM 的 `opt`,也许可以在命令行中传递 `-debug-only=foo`。
- `TRITON_LLVM_DEBUG_ONLY=` 等同于 LLVM 的 `-debug-only` 命令行选项。这会将 LLVM 调试输出限制为特定的 pass 或组件名称(这些名称在整个 LLVM 和 Triton 中通过 `#define DEBUG_TYPE` 指定),以使调试输出不那么嘈杂。`TRITON_LLVM_DEBUG_ONLY` 允许指定一个或多个以逗号分隔的值(例如 `TRITON_LLVM_DEBUG_ONLY="tritongpu-remove-layout-conversions"` 或 `TRITON_LLVM_DEBUG_ONLY="tritongpu-remove-layout-conversions,regalloc"`)。
- `TRITON_ENABLE_ASAN=1` 调用 LLVM 的 Address Sanitizer 来检测内存泄漏和越界访问。目前仅在 AMD 后端受支持。必须使用[此处](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/using-gpu-sanitizer.html)记录的 ASAN 库来运行。
- 启用 Address Sanitizer 时,建议禁用 ROCm 栈和 PyTorch 中的各种内存缓存策略。这将给 Address Sanitizer 提供最好的机会去寻根溯源发现内存错误。有关更多详细信息,请参阅此[测试](https://github.com/triton-lang/triton/blob/main/third_party/amd/python/test/test_address_sanitizer.py)。
- `USE_IR_LOC={ttir,ttgir}` 会重新解析 IR,使得位置信息变为具有该特定扩展名的 IR 文件的行号,而不是 Python 文件的行号。这可以提供从 IR 到 llir/ptx 的直接映射。与性能分析工具一起使用时,它可以提供有关 IR 指令的细分分析。
- `TRITON_PRINT_AUTOTUNING=1` 会在自动调优完成后打印出最佳的自动调优配置以及每个 kernel 花费的总时间。
- `DISABLE_LLVM_OPT` 在被解析为 Bool 类型的真值时,将禁用 make_llir 和 make_ptx 的 LLVM 优化。否则,它将被解析为一个标志列表,用于禁用 LLVM 优化。一个用例是 `DISABLE_LLVM_OPT="disable-lsr"`
已知 Loop strength reduction 会导致某些具有寄存器压力的 kernel 产生高达 10% 的性能变化。
- `TRITON_ALWAYS_COMPILE=1` 强制编译 kernel,无论是否命中缓存。
- `MLIR_ENABLE_TIMING` 转储每个 MLIR pass 的计时信息。
- `LLVM_ENABLE_TIMING` 转储每个 LLVM pass 的计时信息。
- `TRITON_DEFAULT_FP_FUSION` 覆盖允许 fp 融合(mul+add->fma)的默认行为。
- `MLIR_ENABLE_DIAGNOSTICS=` 控制 MLIR 中的诊断信息输出。
选项包括:`warnings`、`remarks`、`stacktraces`、`operations`。
使用逗号分隔的值来自定义输出。例如,
`MLIR_ENABLE_DIAGNOSTICS=remarks,operations` 会启用备注和 IR 操作,
而 `MLIR_ENABLE_DIAGNOSTICS=warnings,stacktraces` 会启用警告以及堆栈跟踪。默认情况下,仅显示错误。设置 `warnings` 包含
错误和警告;`remarks` 包含错误、警告和备注。
- `MLIR_ENABLE_REMARK` 已弃用。请使用 `MLIR_ENABLE_DIAGNOSTICS=remarks`。
- `TRITON_KERNEL_DUMP` 允许转储每个编译阶段的 IR 以及最终的 ptx/amdgcn。
- 当 `TRITON_KERNEL_DUMP` 设置为 1 时,`TRITON_DUMP_DIR` 指定保存转储的 IR 和 ptx/amdgcn 的目录。
- `TRITON_KERNEL_OVERRIDE` 允许在每个编译阶段开始时,使用用户指定的 IR/ptx/amdgcn 覆盖已编译的 kernel。
- 当 `TRITON_KERNEL_OVERRIDE` 设置为 1 时,`TRITON_OVERRIDE_DIR` 指定从中加载 IR/ptx/amdgcn 文件的目录。
- `TRITON_F32_DEFAULT` 设置使用 32 位浮点数时 `tl.dot` 的默认输入精度,可以是 `ieee`、`tf32` 或 `tf32x3`。
- `TRITON_FRONT_END_DEBUGGING=1` 会在编译器前端发生错误时禁用异常包装,从而允许查看完整的堆栈跟踪。
- `TRITON_DISABLE_LINE_INFO=1` 移除模块中的所有行信息。
- `PTXAS_OPTIONS` 向 PTX 汇编器 `ptxas` 传递额外的命令行选项(仅在 NVIDIA 上有效)。
- `LLVM_EXTRACT_DI_LOCAL_VARIABLES` 发出完整的调试信息,允许在 GPU 调试器(如 cuda-gdb、rocm-gdb 等)中评估变量的值。
- `TRITON_DEFAULT_BACKEND=` 可以选择性地设置 Triton 在构建活动驱动程序(即 `triton.runtime.driver.active`)时使用的默认后端。
**Kernel 覆盖步骤
```
export TRITON_ALWAYS_COMPILE=1
export TRITON_KERNEL_DUMP=1
export TRITON_DUMP_DIR=
export TRITON_KERNEL_OVERRIDE=1
export TRITON_OVERRIDE_DIR=
# 步骤 1:运行 kernel 一次,以将 kernel 的 IRs 和 ptx/amdgcn 转储到 $TRITON_DUMP_DIR 中
# 步骤 2:将 $TRITON_DUMP_DIR/ 复制到 $TRITON_OVERRIDE_DIR
# 步骤 3:删除你不想 override 的 stages,并修改你确实想 override 的 stage
# 步骤 4:再次运行 kernel 以查看 override 后的结果
```
**编译流水线检查步骤**
要内省流水线 `add_stages`,请在运行您的 kernel 之前,像这样简单地设置 add_stages_inspection_hook:
```
def inspect_stages(_self, stages, options, language, capability):
# inspect or modify add_stages here
triton.knobs.runtime.add_stages_inspection_hook = inspect_stages
```
有关如何将其用于外部插件 pass 的示例,请参见[这里](lib/Plugins/README.md)
# 更新日志
2.0 版本现已发布!新功能包括:
- 许多、许多的 Bug 修复
- 性能改进
- 重写后端以使用 MLIR
- 支持包含连续矩阵乘法的 kernel(例如 flash attention)
# 兼容性
支持的平台:
- Linux
支持的硬件:
- NVIDIA GPUs (Compute Capability 8.0+)
- AMD GPUs (ROCm 6.2+)
- 开发中:CPUs
# 开发容器 (Dev Container)
Triton 项目的 **Dev Containers** 可以在
[triton-dev-containers repository](https://github.com/redhat-et/triton-dev-containers) 中找到。
### 主要优势:
- **一致性**:所有开发者都可以在相同的开发环境中工作,确保不同系统上的行为一致。
- **隔离性**:该容器防止了与您本地机器上已安装软件产生的潜在冲突。
- **可移植性**:轻松与团队成员共享开发环境,最大限度地减少入职时间和设置问题。
### 如何使用 Dev Container:
有关如何使用 dev containers 的详细说明,请参阅
[dev container user guide](https://github.com/redhat-et/triton-dev-containers/blob/main/.devcontainer/devcontainer.md)。
或者,按照以下步骤手动从源码构建 LLVM。
1. 找到 Triton 所依赖的 LLVM 版本。检查 `cmake/llvm-info.json` 中的 `llvm_hash` 字段以查看当前版本。例如,如果它显示为: "llvm_hash": "49af6502c6dcb4a7f7520178bd14df396f78240c" 这意味着您拥有的 Triton 版本是基于 [LLVM](https://github.com/llvm/llvm-project) 49af6502 构建的。 2. 在此修订版处 `git checkout` LLVM。您可以选择对 LLVM 进行额外的修改。 3. [构建 LLVM](https://llvm.org/docs/CMake.html)。例如,您可以运行: $ cd $HOME/llvm-project # 您的 LLVM 克隆仓库。 $ mkdir build $ cd build $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON ../llvm -DLLVM_ENABLE_PROJECTS="mlir;llvm;lld;clang" -DLLVM_TARGETS_TO_BUILD="host;NVPTX;AMDGPU" $ ninja 4. 准备点零食吧,这会花一段时间。 5. 像上面那样构建 Triton,但设置以下环境变量: # 根据实际情况修改,以指向您的 LLVM 构建目录。 $ export LLVM_BUILD_DIR=$HOME/llvm-project/build $ cd标签:Bash脚本, CUDA替代方案, GPU编程, 人工智能, 深度学习, 用户模式Hook绕过, 编译器, 逆向工具, 高性能计算