OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  代码  ›  Triton — OpenAI GPU 编程语言

Triton — OpenAI GPU 编程语言

 
  session ·  2026-02-28 01:06:37 · 3 次点击  · 0 条评论  
文档 Nightly Wheels
Documentation Wheels

Triton 开发者大会 2025

Triton Banner

第三届 Triton 开发者大会已于 2025 年 10 月 21 日在美国加利福尼亚州山景城的微软硅谷园区举行。

会议资料

会议录像和资料现已在线提供:

往届会议资料,请参阅:
- 2024 年会议资料
- 2023 年会议资料

Triton

这是 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 .

使用自定义 LLVM 构建

Triton 使用 LLVM 为 GPU 和 CPU 生成代码。通常,Triton 构建过程会下载预构建的 LLVM,但您也可以从源码构建并使用自定义的 LLVM。

LLVM 没有稳定的 API,因此 Triton 构建无法在任意的 LLVM 版本上工作。

为方便起见,使用以下命令构建 LLVM 并使用该自定义 LLVM 安装 Triton:

make dev-install-llvm
或者,按照以下步骤手动从源码构建 LLVM。 1. 查找 Triton 构建所依赖的 LLVM 版本。检查 `cmake/llvm-hash.txt` 查看当前版本。例如,如果显示: 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" -DLLVM_TARGETS_TO_BUILD="host;NVPTX;AMDGPU" $ ninja 4. 稍作休息,这需要一段时间。 5. 按照上述方法构建 Triton,但设置以下环境变量: # 根据您的 LLVM 构建路径进行相应修改。 $ export LLVM_BUILD_DIR=$HOME/llvm-project/build $ cd $ 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 参数可以使增量构建更快。没有此参数,每次调用 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 仅转储特定内核。
    • 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=<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 库运行。
    • 启用地址消毒器时,建议禁用 ROCm 堆栈和 PyTorch 内的各种内存缓存策略。这将使地址消毒器有最大机会在内存错误起源处找到它。更多详情请参阅此测试
  • 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 的默认输入精度,可以是 ieeetf32tf32x3
  • 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 已发布!新功能包括:

  • 大量错误修复
  • 性能改进
  • 后端重写以使用 MLIR
  • 支持包含背靠背矩阵乘法(例如,Flash Attention)的内核

贡献

非常欢迎社区贡献,无论是修复错误还是添加新功能,请访问 github。更详细的说明,请访问我们的贡献者指南

兼容性

支持平台:

  • Linux

支持硬件:

  • NVIDIA GPU(计算能力 8.0+)
  • AMD GPU(ROCm 6.2+)
  • 开发中:CPU

开发容器 (Dev Container)

Triton 项目的开发容器可从 triton-dev-containers 仓库 获取。

主要优势:

  • 一致性:所有开发者可以在相同的开发环境中工作,确保不同系统间的行为一致。
  • 隔离性:容器可以防止与本地机器上安装的软件发生潜在冲突。
  • 可移植性:轻松与团队成员共享开发环境,最大限度地减少入职时间和设置问题。

如何使用开发容器:

有关如何使用开发容器的详细

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor