MindStudio Kernel Performance Prediction(算子设计工具,msKPP)具有性能建模分析的功能,在算子开发前,可根据算子的数学逻辑作为输入、基于msKPP提供的接口,写出一个算子实现方案的算子表达式,获得该方案的算子性能建模结果。由于本身针对性能的预测不需要进行真实的计算,仅需要依据输入和输出的规模,给出对应算法的执行时间,故而,可以在秒级给出性能建模结果。
环境要求
进行算子开发之前,需要安装驱动固件和CANN Toolkit软件包以及ops算子包,请参见《》。本节不再给出安装示例。
请参考环境要求完成相关环境变量的配置,完成后可直接使用msKPP工具的功能。
[object Object]
约束
在任意目录下基于msKPP接口进行算子建模,实现中包括如下注意事项:
二次开发请保证输入数据可信安全。
msKPP为了达到理论性能的目标,基于如下对实际处理器进行计算和搬运类指令的性能建模。
表 1 msKPP建模假设性能[object Object][object Object]
-
msKPP支持tensor拆分使用、debug模式和pipe信息的理论值与msprof实测值比对的功能,也支持对算子特性进行建模(搬运通路建模、随路转换建模和cache命中率建模),用户需根据实际需求进行选择。
-
以matmul算子为例介绍算子计算搬运规格分析功能。
-
以matmul算子为例介绍极限性能分析功能。
-
tiling策略的模拟体现在算子功能函数的for循环中,进行切分时,需确保每次for循环处理的数据量相同。
功能说明
msKPP支持tensor拆分使用、debug模式和pipe信息的理论值与msprof实测值比对的功能,也支持对算子特性进行建模(搬运通路建模、随路转换建模和cache命中率建模),用户需根据实际需求进行选择,完成后可实现、以及。
注意事项
文档中的Ascendxxxyy需替换为实际使用的处理器类型。
使用示例
支持搬运通路建模(Atlas A2 训练系列产品/Atlas A2 推理系列产品)
在Atlas A2 训练系列产品/Atlas A2 推理系列产品中,新增了L1到fixpipe buffer(FP)的通路以及L1到Bias table(BT)的通路。前者用于L0C_TO_OUT随路转换时存储量化转换的scale参数,后者用于存储一维的bias数据。在本工具中对该搬运通路建模只需按照GM->L1->FP/BT的顺序即可。
[object Object]支持随路转换建模
在昇腾AI处理器的Cube单元中,进行计算的数据格式需要是特殊的私有NZ格式。而通常在GM上的数据都是ND格式,因此在进行Cube运算时,需要将数据格式进行转换。在Atlas A2 训练系列产品/Atlas A2 推理系列产品中,GM到Cube相关的存储单元的搬运通路已具备ND转NZ的随路转换能力。
在msKPP工具中,若GM-L1且用户定义GM的tensor是ND,L1的tensor是NZ,或L0C-GM且用户定义L0C上的tensor是NZ,GM的tensor是ND,则开启随路转换,调取相关实测数据。
[object Object]支持Cache命中率建模
L2Cache是指部分GM空间与Vectorcore和cubecore之间存在高带宽的搬运通路,当L2Cache命中率接近100%与L2Cache命中率接近0%时,带宽能有两倍以上的差距。msKPP工具目前支持用户手动调整L2Cache命中率。
[object Object]支持Tensor拆分使用
msKPP工具中,Tensor拆分是指将一个大的Tensor用切片的手段生成新的小Tensor,例如:
[object Object]支持debug模式
该模式可使能用户初步定位算子建模过程中哪个指令的出队入队存在问题,提升与工具开发共同定位的效率,使能方式如下:
[object Object]支持PIPE信息的理论值与msprof实测值比对
以Ascend C算子为例,通过--application方式调用msprof,在
[object Object]目录中输出PipeUtilization.csv文件,并在脚本中使能:[object Object]生成的Pipe_statistic.csv文件包含“ProfDuration(us)_0“和“ProfRatio_0“两列,其中ProfDuration(us)_0列的取值和PipeUtilization.csv文件中对应的值一致,ProfRatio_0为实测值跟理论值的比值。 ProfRatio是实测值相对理论值的倍数,倍数越大,优化空间越大。
图 1 Pipe_statistic.csv文件
输出说明
无
功能说明
本章节以matmul算子为例介绍算子计算搬运规格分析功能。
注意事项
文档中的Ascendxxxyy需替换为实际使用的处理器类型。
使用示例
以matmul算子为例,该用例表示准备处理[160, 240]和[240, 80]的矩阵乘,切割为5个[32, 48]、[48, 16]和[32, 16]的小矩阵做矩阵乘。通过调用msKPP提供的接口实现的main.py脚本样例如下:
使用Python执行以上main.py脚本后,会在[object Object]目录下生成搬运流水统计文件(Pipe_statistic.csv)和指令信息统计文件(Instruction_statistic.csv),可查看msKPP建模结果。
[object Object]
输出说明
搬运流水统计
搬运流水统计文件Pipe_statistic.csv,该文件统计了不同PIPE的总搬运数据量大小、操作数个数以及耗时信息。
图 1 Pipe_statistic.csv
关键字段说明如下。
表 1 字段说明
对于流水线耗时最长,明显是搬运性能瓶颈的PIPE,通常有如下优化思路:
- 若搬运数据量较大时,尽可能一次搬运较多的数据,充分利用搬运带宽。
- 尽可能保证性能瓶颈的PIPE在流水上一直在工作。
指令信息统计
指令信息统计文件Instruction_statistic.csv,该文件统计了不同指令维度的总搬运数据量大小、操作数个数以及耗时信息,能够发现指令层面上的瓶颈主要在MOV-GM_TO_L1(属于PIPE-MTE2),从指令层面找到了性能瓶颈处。
图 2 Instruction_statistic.csv
关键字段说明如下。
表 2 字段说明
功能说明
本章节以matmul算子为例介绍极限性能分析功能。
注意事项
文档中的Ascendxxxyy需替换为实际使用的处理器类型。
使用示例
以matmul算子为例,该用例表示准备处理[160, 240]和[240, 80]的矩阵乘,切割为5个[32, 48]、[48, 16]和[32, 16]的小矩阵做矩阵乘。通过调用msKPP提供的接口实现的main.py脚本样例如下:
使用Python执行以上main.py脚本后,会在[object Object]目录下生成文件指令流水图(trace.json)和指令占比饼图(instruction_cycle_consumption.html),可查看msKPP建模结果。
[object Object]
输出说明
指令流水图
流水图文件trace.json,通过查看该文件可以发现在理想的流水中,性能瓶颈的PIPE-MTE2是需要能够一直进行运转的。
[object Object]
图 1 trace.json
单击流水图中的“MOV-GM_TO_L1“单指令,可查看该指令在当前搬运量及计算量下的cycle数和带宽,如所示。
图 2 指令详细信息[object Object][object Object]
指令占比饼图
生成了指令占比饼图instruction_cycle_consumption.html,从中可以发现MOV-GM_TO_L1是算子里的最大瓶颈。
图 3 指令耗时统计
功能说明
tiling策略的模拟体现在算子功能函数的for循环中,进行切分时,需确保每次for循环处理的数据量相同。
注意事项
文档中的Ascendxxxyy需替换为实际使用的处理器类型。
使用示例
以matmul算子为例,该用例表示模拟一个大矩阵被切分成小矩阵进行矩阵乘计算。需根据用户算子逻辑方案实现算子功能函数。tiling策略的模拟体现在算子功能函数的for循环中(以下代码中加粗部分),例如单核处理[160, 240]和[240, 80]的矩阵乘,切割为25个[32, 48]和[48, 16]的小矩阵分批处理,就需要for循环25次并每次创建大小为[32, 48]和[48, 16]的Tensor矩阵(在GM上)。
输出说明
无