OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  OpenAI Triton Tutorials — 深入学习 AI 内核优化与 GPU 编程

OpenAI Triton Tutorials — 深入学习 AI 内核优化与 GPU 编程

 
  humble ·  2026-03-30 11:00:27 · 3 次点击  · 0 条评论  
文档 Nightly Wheels
Documentation Wheels

Triton 开发者大会 2025

Triton Banner

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

会议资料

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

往届会议资料请见:
- 2024 年会议资料
- 2023 年会议资料

Triton

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

二进制 wheel 包适用于 CPython 3.10-3.14。

从源码安装

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 提交 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 $ 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 通道之前,为所有内核转储 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 的通道之前转储 IR。
  • TRITON_REPRODUCER_PATH=<reproducer_path> 将在每个 MLIR 编译器阶段之前生成一个 MLIR 重现文件到 <reproducer_path>。如果任何阶段失败,<reproducer_path> 将是在失败通道之前捕获的本地 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 通道之前的 IR,然后独立运行 LLVM 的 opt,或许在命令行上传递 -debug-only=foo
  • TRITON_LLVM_DEBUG_ONLY=<comma-separated> 相当于 LLVM 的 -debug-only 命令行选项。这限制了 LLVM 调试输出到特定的通道或组件名称(这些名称在 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 通道的计时信息。
  • LLVM_ENABLE_TIMING 转储每个 LLVM 通道的计时信息。
  • TRITON_DEFAULT_FP_FUSION 覆盖允许浮点融合(mul+add->fma)的默认行为。
  • MLIR_ENABLE_DIAGNOSTICS=<comma-separated> 控制 MLIR 中的诊断信息输出。选项有:warningsremarksstacktracesoperations。使用逗号分隔的值来自定义输出。例如,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

关于如何使用此功能进行树外插件通道的示例在这里

更新日志

版本 2.0 已发布!新功能包括:

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

贡献

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

兼容性

支持的平台:

  • Linux

支持的硬件:

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

开发容器 (Dev Container)

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

主要优势:

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

如何使用开发容器:

有关如何使用开发容器的详细说明,请参阅 [开发容器用户指南](https://github

3 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 30 ms
Developed with Cursor