GroupedMatmul算子性能调优案例

案例介绍

本案例对分组Matmul即GroupedMatmul算子的per-token量化场景进行性能分析和优化,GroupedMatmul算子计算过程(通过python代码表达)为:

1
2
3
4
5
offset = 0
for i in range(g):
mmOut = x[offset:offset + groupList[i]] * weight[i] + bias[i]
y[offset:offset + groupList[i]] = Gelu(mmOut * scale[i] * pertokenScale[offset:offset + groupList[i]])
offset += groupList[i]

验证平台为Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件

优化分析以如下算子规格为例:

表1 算子规格

input

shape

data type

format

x

(1024,1024)

int8

ND

weight

(8,1024,8192)

int8

NZ

bias

(8,8192)

int32

ND

groupList

8

int64

ND

scale

(8,8192)

float

ND

pertokenScale

1024

float

ND

y

(1024,8192)

float16

ND

主要介绍以下优化方法:

获取性能数据

固定8核测试,即当前性能和后续优化tiling中blockDim固定设置为8。

通过msProf算子调优工具获取算子性能数据:

分析主要瓶颈点

固定8核进行测试的情况下,通过msprof op命令获取指令的cycle占比数据如下:

图1 指令的cycle占比数据ArithmeticUtilization.csv(性能总耗时为218.1us)

通过msprof op simulator获取到的指令流水图如下图所示:

图2 指令流水图

结合上述两种数据(真实数据和仿真数据)进行性能分析:

设计优化方案

验证优化方案性能收益

总结