AOE(Ascend Optimization Engine)是一款自动调优工具,通过生成调优策略、编译和在运行环境上验证的闭环反馈机制,不断迭代出更优的调优策略,最终得到最佳的调优策略,从而可以更充分利用硬件资源,不断提升网络的性能,达到最优的效果。
用户在模型训练后,可参见PyTorch Analyse迁移分析工具,使用“dynamic_shape”模式,添加动态分析代码并运行脚本,根据分析结果判断为固定shape或动态shape。当结果为固定shape时,可选择AOE调优。
以PyTorch官网提供的Imagenet数据集训练脚本main.py为例,说明在PyTorch 1.8及以上版本通过AOE进行调优的方法。
--precision_mode==allow_fp32_to_fp16
--precision_mode==must_keep_origin_dtype
# switch to train mode
model.train()
end = time.time()
scaler = amp.GradScaler()
# 这里的dump_path需用户自行指定,本例以训练脚本main.py所在路径下的dump文件夹为例
# 例如可以设置为torch_npu.npu.set_aoe('./dump/')
torch_npu.npu.set_aoe(dump_path)
for i, (images, target) in enumerate(train_loader):
# 仅需要运行一个step即可
if i > 0:
exit()
# measure data loading time
data_time.update(time.time() - end)
# move data to the same device as model
images = images.to(device, non_blocking=True)
target = target.to(device, non_blocking=True)
# compute output
with amp.autocast():
output = model(images)
loss = criterion(output, target)
# measure accuracy and record loss
acc1, acc5 = accuracy(output, target, topk=(1, 5))
losses.update(loss.item(), images.size(0))
top1.update(acc1[0], images.size(0))
top5.update(acc5[0], images.size(0))
# compute gradient and do SGD step
optimizer.zero_grad()
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if i % args.print_freq == 0:
progress.display(i + 1)export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank
如不配置此环境变量,自定义知识库默认存储在${HOME}/Ascend/latest/data/aoe/custom/op/${soc_version}路径下。自定义知识库可以应用于推理和训练的性能提升,使用方法请参考《AOE工具使用指南》中的“附录>如何使用调优后的自定义知识库”章节。
# dump_path为上述步骤中配置的算子图文件存放路径 # 以训练脚本main.py所在路径下的dump文件夹为例 aoe --job_type=2 --model_path=dump_path
调优完成后,会在/home/HwHiAiUser/custom_tune_bank/${soc_version}路径下生成自定义知识库。调优命令参数说明可参考下表。完整参数介绍请参见《AOE工具使用指南》中AOE参数说明章节。
参数名称 |
参数简述 |
|---|---|
---model_path |
原始模型文件路径,该路径下可以存放多个模型文件。此处配置为dump算子图步骤中的dump_path。 |
-j --job_type |
调优模式。取值为:
|
export ENABLE_TUNE_BANK=True
使用AOE前训练的第一个epoch数据,如图2所示,每10个数据处理耗时(TIME)均有超过0.1,最高达到0.8。
使用AOE后训练的第一个epoch数据,如图3所示,每10个数据处理耗时(TIME)明显下降。