请添加图片描述

前言

同样的模型,不同输入 shape、不同硬件配置,最优的算子参数不一样。AOE(Auto Optimization Engine)做的事情就是搜索这些最优参数——比如矩阵乘的 tile 大小、卷积的循环展开方式。


一、AOE 能调什么

AOE 的调优对象是算子的实现参数,不是模型结构。具体包括:

参数类型 示例 影响
Tiling 参数 矩阵乘的 block 大小 决定并行度和 UB 利用率
循环展开 卷积的循环展开次数 影响 Cube/Vector 选择
内存布局 NC1HWC0 vs NCHW 影响带宽利用率
算子选择 Cube vs Vector 实现 影响延迟和吞吐

AOE 不会改变模型的数学逻辑,只是找到更高效的执行方式。


二、调优模式选择

AOE 支持两种调优模式:

1. GA(遗传算法)模式

适合调优空间大的场景,搜索时间较长(30-60 分钟)。

# 使用 GA 模式调优
aoe --model=model.onnx \
    --framework=5 \
    --job_type=2 \
    --mode=ga \
    --output=optimized_model

2. RL(强化学习)模式

适合快速调优,搜索时间较短(5-15 分钟),适合开发阶段快速迭代。

# 使用 RL 模式调优
aoe --model=model.onnx \
    --framework=5 \
    --job_type=2 \
    --mode=rl \
    --output=optimized_model

模式对比

模式 搜索时间 效果 适用场景
GA 30-60 分钟 最优 最终部署
RL 5-15 分钟 次优 开发迭代

三、ResNet50 调优实战

准备工作

# 1. 编译原始模型
atc --model=resnet50.onnx \
    --framework=5 \
    --output=resnet50_base

# 2. 准备调优数据
python prepare_data.py --output calibration_data.bin

启动调优

aoe --model=resnet50.onnx \
    --framework=5 \
    --job_type=2 \
    --mode=ga \
    --calibration_data=calibration_data.bin \
    --output=resnet50_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.5ms 8.1ms 35%
AICore 利用率 62% 78% +16%
带宽利用率 55% 71% +16%

四、查看调优参数

调优完成后,AOE 会输出调优参数文件,可以用于后续编译。

# 调优参数保存在 .json 文件里
ls -la resnet50_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 --model=resnet50.onnx \
    --framework=5 \
    --output=resnet50_final \
    --load_tuning_result=resnet50_optimized/tuning_result.json

Python 中应用调优结果

import torch
import torch_npu

# 加载调优后的模型
model = torch.jit.load("resnet50_optimized.om", map_location="npu:0")

# 正常推理
output = model(input_tensor)

六、不同模型的调优效果

Transformer 模型(BERT-base)

aoe --model=bert_base.onnx \
    --framework=5 \
    --job_type=2 \
    --mode=ga \
    --output=bert_optimized
指标 调优前 调优后 提升
首token延迟 95ms 78ms 18%
生成速度 52 tok/s 61 tok/s 17%
显存占用 12GB 11.2GB -7%

Transformer 的主要优化点是 FlashAttention 的 tile 大小和 Softmax 的实现选择。

目标检测模型(YOLOv5)

aoe --model=yolov5s.onnx \
    --framework=5 \
    --job_type=2 \
    --mode=rl \
    --output=yolov5_optimized
指标 调优前 调优后 提升
推理延迟 18ms 13ms 28%
后处理时间 4.5ms 1.2ms 73%

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"]
}

import json
with open("tuning_config.json", "w") as f:
    json.dump(tuning_config, f)
# 使用自定义调优空间
aoe --model=model.onnx \
    --framework=5 \
    --job_type=2 \
    --tuning_config=tuning_config.json \
    --output=model_optimized

八、调优最佳实践

1. 选择正确的输入 shape

调优时的输入 shape 应该和生产环境一致:

# 生产环境输入是 (1, 3, 640, 640)
atc --model=model.onnx \
    --input_shape="input:1,3,640,640" \
    --framework=5 \
    --output=model

aoe --model=model.onnx \
    --framework=5 \
    --input_shape="input:1,3,640,640" \
    --job_type=2 \
    --output=model_optimized

如果输入 shape 变化,调优参数可能不再最优,需要重新调优。

2. 批量调优多个 shape

# 调优多个 batch size
for batch in 1 4 8 16; do
    aoe --model=model.onnx \
        --framework=5 \
        --input_shape="input:${batch},3,224,224" \
        --job_type=2 \
        --output=model_batch${batch}
done

3. 增量调优

如果只改了模型的一部分,可以只调优改动部分:

# 加载之前的调优结果,只调优新增算子
aoe --model=model_v2.onnx \
    --framework=5 \
    --job_type=2 \
    --load_tuning_result=model_v1/tuning_result.json \
    --incremental \
    --output=model_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 文件,后续编译直接加载,不需要重新搜索。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐