前言同样的模型不同输入 shape、不同硬件配置最优的算子参数不一样。AOEAuto Optimization Engine做的事情就是搜索这些最优参数——比如矩阵乘的 tile 大小、卷积的循环展开方式。一、AOE 能调什么AOE 的调优对象是算子的实现参数不是模型结构。具体包括参数类型示例影响Tiling 参数矩阵乘的 block 大小决定并行度和 UB 利用率循环展开卷积的循环展开次数影响 Cube/Vector 选择内存布局NC1HWC0 vs NCHW影响带宽利用率算子选择Cube vs Vector 实现影响延迟和吞吐AOE 不会改变模型的数学逻辑只是找到更高效的执行方式。二、调优模式选择AOE 支持两种调优模式1. GA遗传算法模式适合调优空间大的场景搜索时间较长30-60 分钟。# 使用 GA 模式调优aoe--modelmodel.onnx\--framework5\--job_type2\--modega\--outputoptimized_model2. RL强化学习模式适合快速调优搜索时间较短5-15 分钟适合开发阶段快速迭代。# 使用 RL 模式调优aoe--modelmodel.onnx\--framework5\--job_type2\--moderl\--outputoptimized_model模式对比模式搜索时间效果适用场景GA30-60 分钟最优最终部署RL5-15 分钟次优开发迭代三、ResNet50 调优实战准备工作# 1. 编译原始模型atc--modelresnet50.onnx\--framework5\--outputresnet50_base# 2. 准备调优数据python prepare_data.py--outputcalibration_data.bin启动调优aoe--modelresnet50.onnx\--framework5\--job_type2\--modega\--calibration_datacalibration_data.bin\--outputresnet50_optimized调优过程输出[AOE] Start tuning... [AOE] Generation 1/50, best latency: 12.5ms [AOE] Generation 10/50, best latency: 10.2ms [AOE] Generation 20/50, best latency: 9.1ms [AOE] Generation 30/50, best latency: 8.5ms [AOE] Generation 40/50, best latency: 8.3ms [AOE] Generation 50/50, best latency: 8.1ms [AOE] Tuning completed! [AOE] Original latency: 12.5ms [AOE] Optimized latency: 8.1ms [AOE] Improvement: 35.2%调优结果指标调优前调优后提升推理延迟12.5ms8.1ms35%AICore 利用率62%78%16%带宽利用率55%71%16%四、查看调优参数调优完成后AOE 会输出调优参数文件可以用于后续编译。# 调优参数保存在 .json 文件里ls-laresnet50_optimized/# output:# resnet50_optimized.om# tuning_result.json调优参数示例{op_tuning:{Conv_0:{tiling_strategy:cube_opt,block_m:16,block_n:16,block_k:32},MatMul_10:{impl_type:cube,tiling:{M_tile:64,N_tile:64,K_tile:128}}}}每个算子都有对应的调优参数包括 tiling 策略、block 大小、实现类型等。五、应用调优结果调优后的.om文件可以直接使用。如果只想保存调优参数供后续编译使用# 使用调优参数编译新模型atc--modelresnet50.onnx\--framework5\--outputresnet50_final\--load_tuning_resultresnet50_optimized/tuning_result.jsonPython 中应用调优结果importtorchimporttorch_npu# 加载调优后的模型modeltorch.jit.load(resnet50_optimized.om,map_locationnpu:0)# 正常推理outputmodel(input_tensor)六、不同模型的调优效果Transformer 模型BERT-baseaoe--modelbert_base.onnx\--framework5\--job_type2\--modega\--outputbert_optimized指标调优前调优后提升首token延迟95ms78ms18%生成速度52 tok/s61 tok/s17%显存占用12GB11.2GB-7%Transformer 的主要优化点是 FlashAttention 的 tile 大小和 Softmax 的实现选择。目标检测模型YOLOv5aoe--modelyolov5s.onnx\--framework5\--job_type2\--moderl\--outputyolov5_optimized指标调优前调优后提升推理延迟18ms13ms28%后处理时间4.5ms1.2ms73%YOLOv5 的主要优化点是 NMS 算子的实现和卷积的 tiling 策略。七、自定义调优空间如果只想调优特定的算子可以指定调优空间# 定义调优空间配置tuning_config{ops_to_tune:[Conv_0,MatMul_10],# 只调这两个算子tiling_range:{block_m:[8,16,32,64],block_n:[8,16,32,64],block_k:[16,32,64,128]},impl_options:[cube,vector]}importjsonwithopen(tuning_config.json,w)asf:json.dump(tuning_config,f)# 使用自定义调优空间aoe--modelmodel.onnx\--framework5\--job_type2\--tuning_configtuning_config.json\--outputmodel_optimized八、调优最佳实践1. 选择正确的输入 shape调优时的输入 shape 应该和生产环境一致# 生产环境输入是 (1, 3, 640, 640)atc--modelmodel.onnx\--input_shapeinput:1,3,640,640\--framework5\--outputmodel aoe--modelmodel.onnx\--framework5\--input_shapeinput:1,3,640,640\--job_type2\--outputmodel_optimized如果输入 shape 变化调优参数可能不再最优需要重新调优。2. 批量调优多个 shape# 调优多个 batch sizeforbatchin14816;doaoe--modelmodel.onnx\--framework5\--input_shapeinput:${batch},3,224,224\--job_type2\--outputmodel_batch${batch}done3. 增量调优如果只改了模型的一部分可以只调优改动部分# 加载之前的调优结果只调优新增算子aoe--modelmodel_v2.onnx\--framework5\--job_type2\--load_tuning_resultmodel_v1/tuning_result.json\--incremental\--outputmodel_v2_optimized参考资源AOE 调优指南https://www.hiascend.com/document/detail/zh/CANN/调优参数详解https://www.hiascend.com/document/detail/zh/CANN/AOE 样例仓库https://atomgit.com/cann/samples性能调优最佳实践https://www.hiascend.com/document/detail/zh/CANN/总结AOE 的调优本质是搜索算子的最优参数——tile 大小、实现方式、内存布局。GA 模式搜索彻底适合最终部署RL 模式搜索快速适合开发迭代。调优效果因模型而异ResNet50 能提 30%Transformer 能提 15-20%。调优时的输入 shape 要和生产一致shape 变化需要重新调优。调优结果可以保存成.json文件后续编译直接加载不需要重新搜索。