文档 |
Nightly Wheels |
|---|---|
第三届 Triton 开发者大会已于 2025 年 10 月 21 日在美国加利福尼亚州山景城的微软硅谷园区举行。
会议录像和资料现已在线提供:
往届会议资料,请参阅:
- 2024 年会议资料
- 2023 年会议资料
这是 Triton 的开发仓库。Triton 是一种用于编写高效自定义深度学习原语的编程语言和编译器。其目标是提供一个开源环境,以比 CUDA 更高的开发效率和比现有其他领域特定语言(DSL)更高的灵活性来编写快速代码。
本项目的基础在以下 MAPL2019 论文中进行了描述:Triton: An Intermediate Language and Compiler for Tiled Neural Network Computations。如果您使用 Triton,请考虑引用此工作!
官方文档 包含安装说明和教程。另请参阅这些第三方 Triton 谜题,它们都可以使用 Triton 解释器运行——无需 GPU。
您可以通过 pip 安装 Triton 的最新稳定版本:
pip install triton
为 CPython 3.10-3.14 提供了预编译的二进制 wheel 包。
git clone https://github.com/triton-lang/triton.git
cd triton
pip install -r python/requirements.txt # 构建时依赖
pip install -e .
或者使用虚拟环境:
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 # 构建时依赖
pip install -e .
Triton 使用 LLVM 为 GPU 和 CPU 生成代码。通常,Triton 构建过程会下载预构建的 LLVM,但您也可以从源码构建并使用自定义的 LLVM。
LLVM 没有稳定的 API,因此 Triton 构建无法在任意的 LLVM 版本上工作。
为方便起见,使用以下命令构建 LLVM 并使用该自定义 LLVM 安装 Triton:
make dev-install-llvm
TRITON_BUILD_WITH_CLANG_LLD=true 以使用 clang 和 lld。特别是 lld 可以带来更快的构建速度。TRITON_BUILD_WITH_CCACHE=true 以使用 ccache 进行构建。TRITON_HOME=/some/path 来更改 .triton 目录的位置,该目录是 Triton 缓存和构建期间下载文件的存储位置。默认情况下,这是用户的主目录。可以随时更改。MAX_JOBS 环境变量(给 pip install -e . 命令)以限制并行作业数。pip install 传递 --no-build-isolation 参数可以使增量构建更快。没有此参数,每次调用 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++ 扩展,然后打开命令面板(Mac 上是 Shift + Command + P,Windows/Linux 上是 Shift + Ctrl + P)并打开 C/C++: Edit Configurations (UI)。
- 打开“高级设置”,并将 compile_commands.json 的完整路径粘贴到“编译命令”文本框中。
目前没有一键运行所有 Triton 测试的方法,但您可以遵循以下步骤:
# 一次性设置。注意这将重新安装本地 Triton,因为 torch 会覆盖它。
$ make dev-install
# 运行所有测试(需要 GPU)
$ make test
# 或者,在没有 GPU 的情况下运行测试
$ make test-nogpu
有关如何调试 Triton 前端的详细说明,请参阅此教程。以下包括针对 Triton 后端开发的额外技巧。
配置选项
完整配置选项列表请参见 python/triton/knobs.py。您可以直接在 Python 中设置这些选项,或使用环境变量来控制它们。以下是一些可以指定的环境变量(完整列表见 knobs.py):
MLIR_ENABLE_DUMP=1 在 Triton 运行的每个 MLIR pass 之前,为所有内核转储 IR。使用 MLIR_ENABLE_DUMP=kernelName 仅转储特定内核。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=<reproducer_path> 将在每个 MLIR 编译器阶段之前生成一个 MLIR 重现文件到 <reproducer_path>。如果任何阶段失败,<reproducer_path> 将是在失败 pass 之前捕获的本地 MLIR 重现文件。TRITON_INTERPRET=1 使用 Triton 解释器而不是在 GPU 上运行。您可以在内核代码中插入 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=<comma-separated> 相当于 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 地址消毒器以检测内存泄漏和越界访问。目前仅支持 AMD 后端。必须使用此处记录的 ASAN 库运行。USE_IR_LOC={ttir,ttgir} 重新解析 IR,使得位置信息将是具有特定扩展名的 IR 文件的行号,而不是 Python 文件的行号。这可以提供从 IR 到 llir/ptx 的直接映射。与性能工具一起使用时,可以提供 IR 指令的细分。TRITON_PRINT_AUTOTUNING=1 在自动调优完成后,打印出每个内核的最佳自动调优配置和总耗时。DISABLE_LLVM_OPT 如果其值在解析为 Bool 时为 true,将为 make_llir 和 make_ptx 禁用 llvm 优化。否则,它将被解析为要禁用的 llvm 优化标志列表。一个用例是 DISABLE_LLVM_OPT="disable-lsr"。已知循环强度缩减会导致某些具有寄存器压力的内核性能变化高达 10%。TRITON_ALWAYS_COMPILE=1 强制编译内核,无论缓存是否命中。MLIR_ENABLE_TIMING 转储每个 MLIR pass 的计时信息。LLVM_ENABLE_TIMING 转储每个 LLVM pass 的计时信息。TRITON_DEFAULT_FP_FUSION 覆盖允许浮点融合(mul+add->fma)的默认行为。MLIR_ENABLE_DIAGNOSTICS=<comma-separated> 控制 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 启用从每个编译阶段以及最终的 ptx/amdgcn 转储 IR。TRITON_DUMP_DIR 指定当 TRITON_KERNEL_DUMP 设置为 1 时,保存转储的 IR 和 ptx/amdgcn 的目录。TRITON_KERNEL_OVERRIDE 启用在每个编译阶段开始时,用用户指定的 IR/ptx/amdgcn 覆盖已编译的内核。TRITON_OVERRIDE_DIR 指定当 TRITON_KERNEL_OVERRIDE 设置为 1 时,从中加载 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=<backend> 可选地设置 Triton 在构造活动驱动(即 triton.runtime.driver.active)时使用的默认后端。[!NOTE]
其中一些环境变量在knobs.py中没有对应的选项——这些仅与 C++ 层相关,因此它们不存在于 Python 层。
内核覆盖步骤
export TRITON_ALWAYS_COMPILE=1
export TRITON_KERNEL_DUMP=1
export TRITON_DUMP_DIR=<dump_dir>
export TRITON_KERNEL_OVERRIDE=1
export TRITON_OVERRIDE_DIR=<override_dir>
# 步骤 1:运行内核一次,将内核的 IR 和 ptx/amdgcn 转储到 $TRITON_DUMP_DIR
# 步骤 2:将 $TRITON_DUMP_DIR/<kernel_hash> 复制到 $TRITON_OVERRIDE_DIR
# 步骤 3:删除您不想覆盖的阶段,并修改您想要覆盖的阶段
# 步骤 4:再次运行内核以查看覆盖后的结果
编译器流水线检查步骤
要检查 add_stages 流水线,在运行内核之前,只需像这样设置 add_stages_inspection_hook:
def inspect_stages(_self, stages, options, language, capability):
# 在此处检查或修改 add_stages
triton.knobs.runtime.add_stages_inspection_hook = inspect_stages
关于如何使用此功能进行树外插件 pass 的示例在这里。
版本 2.0 已发布!新功能包括:
非常欢迎社区贡献,无论是修复错误还是添加新功能,请访问 github。更详细的说明,请访问我们的贡献者指南。
支持平台:
支持硬件:
Triton 项目的开发容器可从 triton-dev-containers 仓库 获取。
有关如何使用开发容器的详细