3. 功能支持
3.1. 基本功能
mcTriton以兼容Triton的原生使用方式为设计目标。大部分情况下,用户可以参考官方文档 获得mcTriton的使用方式。
3.1.1. tl.dot的数据类型支持
tl.dot 是Triton中用于矩阵乘的核心算子。C50X系列与C60X系列产品对 tl.dot 的数据类型支持情况对比如下:
数据类型 |
C50X系列 |
C60X系列 |
|---|---|---|
|
支持(mma) |
支持(fma) |
|
支持(mma) |
支持(mma) |
|
支持(mma) |
支持(mma) |
|
支持(mma) |
支持(mma) |
|
支持(mma) |
支持(mma) |
|
不支持 |
支持(mma) |
3.2. 扩展功能
本章介绍mcTriton相较官方Triton提供的额外功能。
3.2.1. triton.Config
出于性能调优的目的,mcTriton扩展了 triton.Config 中的配置选项,提供给用户做不同场景下的性能调优。
3.2.1.1. pipeline
pipeline 选项用于指定在for循环中 triton.language.dot 场景下使用的不同优化方式。具体使用方法:
triton.Config({...,'pipeline': "basic",...},...)
支持参数:
basic:基础N-buffer优化。其中num-stages大于2的buffer数据会暂存在寄存器当中。basic是pipeline的默认配置。cpasync:使用cp.async功能在pipeline中将数据直接从全局内存拷贝到共享内存进行N-buffer优化,该配置下num-stages增大的同时,共享内存用量也会同步变大。当
pipeline设置为空时,关闭所有N-buffer优化。
对于不同的Triton kernel,可能获得最优性能的 pipeline 参数是不同的,可以配合 triton.autotune 搜索得到当前kernel的最佳pipeline。
3.2.1.2. scenario
scenario 选项用于指定在 for 循环中 triton.language.dot 场景下一些特定的编译选项和指令重排方式。具体使用方法:
triton.Config({...,'scenario': "flashattn-fwd",...},...)
支持参数:
scenario 可以搭配 pipeline 使用,当前版本沐曦通用GPU支持以下参数设置:
flashattn-fwd:针对flashattn前向类型的Triton算子进行编译层面的重排和优化。flashattn-bwd:针对flashattn反向类型的Triton算子进行编译层面的重排和优化。mla:针对mla或者extendattn前向类型的Triton算子进行编译层面的重排和优化。unroll:pipeline为cpasync时,对Triton算子中的循环进行展开(默认为不展开);pipeline为basic时,Triton算子中的循环默认是展开的;pipeline为空时无效。roll:pipeline为basic时,对Triton算子中的循环进行不展开(默认为展开);pipeline为cpasync时,Triton算子中的循环默认是不展开的;pipeline为空时无效。unprefetch:当pipeline为basic时,不会进行prefetch操作。fullstage: 使用更激进的策略对更多的 Op 进行 N-buffer pipeline 来掩盖访存带来的延迟,同时会占用更多的设备资源。当pipeline为basic时,开启会占用更多的寄存器;当pipeline为cpasync时,开启会占用更多的共享内存。storeCoalesce:优先开启全局内存写入时的大位宽优化。
备注
Triton3.6分支不再支持flash-attn以及相关的 scenario 参数(包括 flashattn-fwd、flashattn-bwd、mla)。Triton3.0与Triton3.6对 scenario 参数的支持情况对比如下:
scenario参数 |
Triton3.0 |
Triton3.6 |
|---|---|---|
|
支持 |
支持 |
|
支持 |
支持 |
|
支持 |
支持 |
|
支持 |
支持 |
|
支持 |
支持 |
|
支持 |
不支持 |
|
支持 |
不支持 |
|
支持 |
不支持 |
多个scenario的参数设置可以进行叠加成为scenario组合,组合中每个参数之间使用 “;” 进行间隔,例如:
triton.Config({...,'scenario': "unprefetch;roll;fullstage",...},...)
以下scenario之间存在冲突,避开组合当中同时出现:
flashattn-fwd;flashattn-bwd;mlaunroll;roll
对于不同的Triton kernel,可能获得最优性能的scenario组合是不同的,可以配合 triton.autotune 搜索得到当前kernel的最佳scenario组合。
小技巧
对于类似矩阵乘的单 dot 计算,使用大tile(如 128*128*128)时,建议设置 pipeline="cpasync",优化效果更好。
autotune用例
triton.autotune 配合 triton.Config 的使用示例如下:
@triton.autotune(
configs=[
triton.Config({...,'pipeline': "basic",'scenario': "unprefetch",...}, num_warps=4, num_stages=2),
triton.Config({...,'pipeline': "cpasync",...}, num_warps=8, num_stages=3),
],
key=['M', 'N', 'K'],
)
@triton.jit
def matmul_kernel(...):
...
3.2.2. MCTRITON_LOG_LEVEL
Triton3.6支持通过 MCTRITON_LOG_LEVEL 环境变量开启Triton代码中的日志打印功能,日志级别由高到低依次为 TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL,级别越高,打印的日志内容越多。
日志级别 |
说明 |
|---|---|
|
打印全部跟踪信息,如layout、Tensor的shape等。 |
|
打印用于确认优化和函数执行的调试信息及关键数值。 |
|
打印基础信息,如config设置、Kernel的寄存器/共享内存使用情况等。 |
|
打印编译器行为可能导致性能不达预期的消息。 |
|
打印编译器行为将导致错误的消息。 |
|
仅打印用户自定义的消息。 |
使用示例
设置 MCTRITON_LOG_LEVEL 环境变量后运行Kernel:
export MCTRITON_LOG_LEVEL=INFO
每条打印信息包含时间、打印位置、进程号、logger名称、日志级别和消息内容。