三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

昇腾AOE调优引擎

昇腾AOE调优引擎

昇腾AOE调优引擎

AOE 调优引擎

AOE 概述

AOE(Ascend Optimization Engine)是 CANN 提供的自动化性能调优引擎,通过搜索最优的算子执行参数(如 Tiling 策略)来提升模型性能,无需开发者手动调优。

AOE 支持三种调优模式

模式 全称 调优对象 典型收益
OPAT Operator Auto Tuning 单算子 Tiling 参数 10-30%
SGAT Subgraph Auto Tuning 子图级融合与调度 15-40%
GDAT Gradient Auto Tuning 梯度计算优化 5-20%

AOE 工作原理

┌─────────────────────────────────────────────────────────┐
│                    AOE 调优流程                          │
│                                                         │
│  1. 收集算子信息                                         │
│     ├── 算子类型、输入输出形状、数据类型                   │
│     └── 当前执行性能基线                                  │
│                                                         │
│  2. 搜索空间构建                                         │
│     ├── Tiling 参数空间(分块大小、循环顺序等)            │
│     └── 融合策略空间                                     │
│                                                         │
│  3. 自动搜索(贝叶斯优化 / 遗传算法)                     │
│     ├── 在真实硬件上执行候选配置                          │
│     └── 记录性能数据                                     │
│                                                         │
│  4. 生成调优知识库                                       │
│     └── 保存最优配置到 .json 文件                        │
│                                                         │
│  5. 推理/训练时加载调优结果                               │
│     └── 自动使用最优配置执行                              │
└─────────────────────────────────────────────────────────┘

OPAT:算子自动调优

通过 ATC 触发 OPAT

# 在模型转换时同时进行算子调优
atc --model=model.onnx \--framework=5 \--output=model_tuned \--soc_version=Ascend910B3 \--input_shape="input:1,3,224,224" \--enable_scope_fusion_passes=true \--op_compiler_cache_mode=enable \--op_compiler_cache_dir=./op_cache \--aoe_mode=1  # 1=OPAT

独立运行 AOE 工具

# 方式一:基于模型文件调优
aoe --framework=5 \--model=model.onnx \--job_type=1 \--output=./aoe_result \--soc_version=Ascend910B3 \--input_shape="input:1,3,224,224"# 方式二:基于已有 .om 文件调优
aoe --om=model.om \--job_type=1 \--output=./aoe_result \--soc_version=Ascend910B3

在 Python 中触发 OPAT

import torch
import torch_npu# 开启 AOE 调优模式
torch.npu.set_option({"ACL_OP_COMPILER_CACHE_MODE": "enable","ACL_OP_COMPILER_CACHE_DIR": "./op_cache"
})# 运行几个 step 收集算子信息
for i, batch in enumerate(dataloader):if i >= 10:  # 收集 10 个 step 的数据breakoutput = model(batch)# 触发 AOE 调优
torch_npu.npu.set_aoe("./aoe_result")

SGAT:子图自动调优

SGAT 在子图级别进行优化,寻找最优的算子融合策略。

# 子图调优
aoe --framework=5 \--model=model.onnx \--job_type=2 \--output=./sgat_result \--soc_version=Ascend910B3 \--input_shape="input:1,3,224,224" \--tuning_time_limit=3600  # 调优时间限制(秒)

子图调优配置

// sgat_config.json
{"job_type": "subgraph","tuning_time_limit": 3600,"max_tuning_count": 100,"search_algorithm": "bayesian","target_metric": "throughput"
}

GDAT:梯度自动调优

GDAT 专门针对训练场景的梯度计算进行优化。

# 梯度调优(需要训练数据)
aoe --framework=5 \--model=model.onnx \--job_type=3 \--output=./gdat_result \--soc_version=Ascend910B3 \--input_shape="input:1,3,224,224;label:1" \--loss_name="loss"

加载调优结果

ATC 转换时加载

atc --model=model.onnx \--framework=5 \--output=model_optimized \--soc_version=Ascend910B3 \--input_shape="input:1,3,224,224" \--op_compiler_cache_mode=enable \--op_compiler_cache_dir=./aoe_result  # 指向调优结果目录

运行时加载

import torch_npu# 加载 AOE 调优结果
torch.npu.set_option({"ACL_OP_COMPILER_CACHE_MODE": "enable","ACL_OP_COMPILER_CACHE_DIR": "./aoe_result"
})

调优结果分析

调优报告

AOE 会生成详细的调优报告:

aoe_result/
├── summary.json          # 调优摘要
├── op_tuning/
│   ├── MatMul_fp16.json  # MatMul 算子调优结果
│   ├── Conv2D_fp16.json  # Conv2D 算子调优结果
│   └── ...
└── profiling/├── before_tuning/    # 调优前性能数据└── after_tuning/     # 调优后性能数据

summary.json 示例:

{"total_ops": 156,"tuned_ops": 89,"performance_improvement": "23.5%","tuning_time": "1823s","top_improved_ops": [{"op": "MatMul_1", "improvement": "45.2%"},{"op": "Conv2D_3", "improvement": "31.8%"},{"op": "LayerNorm_2", "improvement": "28.4%"}]
}

调优最佳实践

1. 选择代表性输入

# 使用实际业务中最常见的输入形状进行调优
# 避免使用极端形状(太小或太大)
--input_shape="input:8,3,224,224"  # 使用实际 batch size

2. 分阶段调优

# 第一阶段:快速 OPAT(1-2小时)
aoe --job_type=1 --tuning_time_limit=3600# 第二阶段:深度 SGAT(4-8小时)
aoe --job_type=2 --tuning_time_limit=28800

3. 调优结果复用

# 相同模型结构、相同硬件的调优结果可以复用
# 将调优结果纳入版本管理
git add aoe_result/
git commit -m "Add AOE tuning results for ResNet50 on 910B3"

4. 增量调优

# 模型更新后,只对变化的算子重新调优
aoe --model=model_v2.onnx \--job_type=1 \--output=./aoe_result_v2 \--base_result=./aoe_result  # 基于已有结果增量调优

性能调优效果示例

模型 调优前(ms) 调优后(ms) 提升
ResNet50 3.2 2.4 25%
BERT-Base 12.5 9.8 22%
YOLOv5s 8.1 6.2 24%
GPT-2 45.3 35.1 22%

以上数据为示意,实际效果因硬件和模型而异

← 返回列表