华为 CANN autotune_utils.py 华为昇腾算子开发性能调优 算子开发
在华为 CANNCompute Architecture for Neural Networks开发流程中自定义算子的开发和测试是关键环节。你提到的mskpp很可能是拼写误差或特定项目内部的命名通常在 CANN 生态中新建算子主要指的是TBETensor Boost Engine算子或Ascend C 算子。而autotune_utils.py是算子开发中用于自动调优的重要辅助脚本主要目的是为了寻找让算子在 NPU 上运行性能最佳的参数如 Tiling 策略、Block 大小等。autotune_utils.py通过穷举或启发式搜索自动帮你测试不同参数组合下的算子运行速度从而确定最优的 Tiling 策略。建议先阅读你所使用的样例代码中autotune_utils.py内的具体函数定义理解它需要传入什么参数通常是输入数据列表、输出列表、以及参数搜索空间字典然后照猫画虎编写驱动脚本即可。autotune_utils.py的详细使用指南。一、 背景介绍CANN 新建算子与测试在 CANN 中开发一个新算子通常包含两个核心阶段算子开发使用 TIKTensor Iterator KernelPython DSL或 Ascend CC编写算子代码实现计算逻辑。算子测试与调优正确性测试确保算子在 NPU 上运行的结果与 CPU如 NumPy上的 golden data 一致。性能调优NPU 的性能极度依赖于数据搬运GM 到 UB的策略。如何切分数据、如何利用流水线需要通过调优来找到最优参数。autotune_utils.py的作用该脚本通常位于算子工程目录下用于在算子开发完成后自动遍历不同的 Tiling 参数或配置组合运行算子并记录耗时从而帮助开发者找到性能最好的配置。二、autotune_utils.py介绍autotune_utils.py并非 CANN 安装包中的全局命令而是通常包含在算子工程模板或TBE 开发示例中的一个 Python 工具类。它封装了与 CANN 编译器和运行时交互的底层逻辑。核心功能编译支持调用ascendc或tikc编译器生成不同的.o或.so文件。运行支持调用 ACLAscend Computing Language接口加载算子并在设备上执行。性能采样利用 NPU 的 Profiling 接口或简单的 Pythontime库统计算子运行耗时。参数搜索提供简单的网格搜索或随机搜索框架用于遍历 Tiling 参数。三、 如何使用autotune_utils.py进行测试以下是一个典型的使用流程。假设你已经写好了基于 TIK 或 Ascend C 的算子代码。1. 环境准备确保你已经设置了 CANN 的环境变量source/usr/local/Ascend/ascend-toolkit/set_env.sh2. 准备算子工程目录你的目录结构通常如下my_custom_op/ ├── src/ │ └── add_custom.cpp (或 .py) # 你的算子实现代码 ├── inc/ │ └── add_custom.h ├── tests/ │ ├── test_add_custom.py # 单元测试脚本 │ └── autotune_utils.py # 自动调优工具 └── build.sh # 编译脚本3. 编写调用脚本通常你不需要直接修改autotune_utils.py而是编写一个 Python 脚本如run_tune.py来调用它。假设autotune_utils.py中提供了一个类似auto_tune的函数具体函数名需查看你手中的文件内容常见的有run_tune或tune_op。示例代码逻辑importnumpyasnpfromautotune_utilsimporttune_op# 假设这是工具类提供的入口函数# 1. 定义输入输出数据shape(1024,1024)input_xnp.random.uniform(-10,10,shape).astype(np.float16)input_ynp.random.uniform(-10,10,shape).astype(np.float16)output_znp.zeros(shape).astype(np.float16)# 2. 定义调优参数空间# 这是非常关键的一步。你需要告诉工具哪些参数是可以变化的。# 例如UB切分块的大小是否开启双缓冲等。tune_range{block_dim:[8,16,32],# 不同的 Block 维度ub_factor:[1,2,4],# 不同的 UB 利用倍率enable_double_buffer:[True,False]}# 3. 调用 Autotune 工具# 这将自动编译不同版本的算子运行并记录时间best_config,best_timetune_op(op_nameadd_custom,op_funcNone,# 某些工具需要直接传入算子函数有些只需传算子名inputs[input_x,input_y],outputs[output_z],tune_paramstune_range,repeat_num100,# 每次运行 100 次取平均compiler_pathbuild/src/add_custom.so# 已编译的算子库路径)print(fBest Config:{best_config})print(fBest Time:{best_time}us)4. 执行与结果分析运行你的 Python 脚本python3 run_tune.py预期输出脚本会在终端打印调优过程类似于Running config: {block_dim: 8, ub_factor: 1} ... Time: 150.5 us Running config: {block_dim: 8, ub_factor: 2} ... Time: 120.1 us ... Running config: {block_dim: 32, ub_factor: 4} ... Time: 85.2 us [INFO] Autotune finished. [INFO] Best performance: 85.2 us with params: {block_dim: 32, ub_factor: 4}5. 固化参数找到最佳参数后你需要将这些参数回填到你的算子代码中例如在GetTilingKey或TilingContext中硬编码或者编写相应的 Tiling 算法逻辑以确保算子在正式部署时始终使用最高效的策略。四、 常见注意事项算子编译在使用autotune_utils前确保你的算子已经被正确编译成.so或.o文件并且没有语法错误。Autotune 主要是为了找性能参数而不是为了找语法 Bug。数据精度测试时尽量使用较小的数据 Shape如(16, 16)或(128, 128)来快速验证逻辑使用大 Shape如(4096, 4096)来进行性能调优。设备可用性确保当前机器上有 NPU 设备Ascend 310/310P/910 等且驱动状态正常可以使用npu-smi info查看。版本差异不同版本的 CANN如 5.0.2, 6.0, 7.0中autotune_utils.py的实现可能不同。请务必参考你当前 CANN 版本对应样例中的代码注释。总结你提到的场景是典型的华为昇腾算子开发性能调优环节。新建算子指实现前向计算逻辑。测试验证结果正确性。autotune_utils.py通过穷举或启发式搜索自动帮你测试不同参数组合下的算子运行速度从而确定最优的 Tiling 策略。建议先阅读你所使用的样例代码中autotune_utils.py内的具体函数定义理解它需要传入什么参数通常是输入数据列表、输出列表、以及参数搜索空间字典然后照猫画虎编写驱动脚本即可。