---
title: 算子调优
description: "本节介绍PyTorch训练场景下，如何进行算子调优，包括调优前须知、dump算子图、配置环境变量和调优命令。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/aoe/aoeep_16_043.html
sourcePath: /source/zh/canncommercial/900/devaids/aoe/aoeep_16_043.html
indexId: 944097316c688b1081e6e4e4fbcf5ec45910b302f8628e1fbb17b8af2fb20ad059
---
# 算子调优

本节介绍PyTorch训练场景下，如何进行算子调优，包括调优前须知、dump算子图、配置环境变量和调优命令。

#### 调优前须知

1. 请保证训练脚本在AI处理器上执行成功，功能和精度满足预期。
2. 不建议用户绑定训练进程到指定的CPU，请使用系统默认的CPU调度策略。否则，可能会影响调优效果。
3. 为提高调优效率，希望用户尽量控制训练步数。一般情况下，通过一个step能完成一次完整的图执行过程，保证图中所有的算子都能遍历一遍完成调优即可。
4. 目前仅支持静态算子，暂不支持动态算子。
5. 仅支持1P脚本进行dump图。
6. AOE不支持不同用户同时使用同一device进行调优。
7. 单个AOE进程时，请确保具备如下条件。多个AOE进程时，可参考如下条件自行扩展。

  - 调优用户的家目录下磁盘可用空间>=20G。
  - 可用内存>=32G。
  - 算子调优时Host CPU要求：建议>=TE_PARALLEL_COMPILER + TUNING_PARALLEL_NUM + 1 + min(CPU的核数/2, 8) + 58。其中TE_PARALLEL_COMPILER和TUNING_PARALLEL_NUM的说明请分别参考    表1
和    表1
。
  - device核数>=模型中所有算子使用的最大核数。
  - device内存：和模型相关，和模型的内存复用相关。
8. 调优前，请确保关闭Profiling功能，避免影响调优结果。关闭Profiling功能具体操作请参见《性能调优工具(https://www.hiascend.com/document/detail/zh/canncommercial/900/devaids/Profiling/atlasprofiling_16_0144.html)》。


#### dump算子图

方式一：通过“aclGenGraphAndDumpForOp(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclcppdevg_03_0033.html)”接口dump出来算子图。


方式二：在模型脚本中添加如下使能代码，将算子图dump到本地。```
# 在模型脚本首行，确认PyTorch框架版本
import torch
if torch.__version__ >= "1.8":
    import torch_npu
import torch.npu

def train_model():
    # 1.8及以上版本参见如下设置使能AOE dump接口，dump_path为保存算子子图的路径，请自行设置
    torch_npu.npu.set_aoe(dump_path)
    torch_npu.npu.set_compile_mode(jit_compile=True)    # 仅支持在线编译的算子dump算子图，通过该配置开启在线编译（即非二进制模式）
    train_model_one_step()    # 模型训练过程，一般仅需要跑一个step即可
# dump_path表示设置保存dump出算子图的路径，必须要设置，不能为空；当设置的路径不存在时，会尝试创建，支持多级目录创建
```


以resnet50模型为实际样例，修改如下。```
#line 427~437
model.train()
optimizer.zero_grad()
end = time.time()
torch_npu.npu.set_aoe(dump_path) #使能接口   

    if i > 0:             #仅需要运行一个step
        exit()
    if i > 100:
        pass
    # measure data loading time
    data_time.update(time.time() - end)

    if args.gpu is not None:
        images = images.cuda(args.gpu, non_blocking=True)
```


参考链接：https://gitee.com/ascend/ModelZoo-PyTorch/blob/master/PyTorch/built-in/cv/classification/ResNet50_for_PyTorch/pytorch_resnet50_apex.py(https://gitee.com/ascend/ModelZoo-PyTorch/blob/master/PyTorch/built-in/cv/classification/ResNet50_for_PyTorch/pytorch_resnet50_apex.py)


#### 配置环境变量

发起调优前，需要添加如下环境变量。- CANN软件基础环境变量
  CANN提供进程级环境变量设置脚本，供用户在进程中引用，以自动完成环境变量设置。执行命令参考如下，以下示例均为root或非root用户默认安装路径，请以实际安装路径为准。

```
# 以root用户安装toolkit包后配置环境变量
source /usr/local/Ascend/cann/set_env.sh
# 以非root用户安装toolkit包后配置环境变量
source ${HOME}/Ascend/cann/set_env.sh
```


- AOE工具依赖Python，以Python3.7.5为例，请以运行用户执行如下命令设置Python3.7.5的相关环境变量。

```
#用于设置python3.7.5库文件路径
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
#如果用户环境存在多个python3版本，则指定使用python3.7.5版本
export PATH=/usr/local/python3.7.5/bin:$PATH
```


  Python3.7.5安装路径请根据实际情况进行替换，您也可以将以上命令写入~/.bashrc文件中，然后执行source ~/.bashrc命令使其立即生效。

- 调优前也可参考如下示例配置其他环境变量，但为可选配置，相关说明请参考  表1
。

```
export ASCEND_DEVICE_ID=0
export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank
export TE_PARALLEL_COMPILER=8
export REPEAT_TUNE=False
```


  用户可将设置环境变量的命令写入自定义脚本，方便后续执行。

**表1 环境变量说明**

| 环境变量 | 说明 |
| --- | --- |
| ASCEND\_DEVICE\_ID | 通过该环境变量指定AI处理器的逻辑ID。 取值范围[0,N\-1]，默认为0。其中N为当前物理机/虚拟机/容器内的设备总数。 |
| TUNE\_BANK\_PATH | 可通过此环境变量指定调优后自定义知识库的存储路径。 设置的存储路径必须为绝对路径或相对于执行AOE调优引擎所在路径的相对路径，配置的路径需要为已存在的目录，且执行用户具有读、写、可执行权限。若配置的TUNE\_BANK\_PATH路径不存在或用户无权限，则调优进程会报错并退出。 自定义知识库存放路径的优先级为：TUNE\_BANK\_PATH>ASCEND\_CACHE\_PATH>默认，TUNE\_BANK\_PATH和ASCEND\_CACHE\_PATH详细信息请参考《环境变量参考(https://www.hiascend.com/document/detail/zh/canncommercial/900/maintenref/envvar/envref\_07\_0001.html)》。 算子自定义知识库 若不配置此环境变量，请使用env命令查询ASCEND\_CACHE\_PATH是否存在，若存在，自定义知识库存储在：${ASCEND\_CACHE\_PATH}/aoe\_data/${soc\_version}；若不存在，自定义知识库默认存储在：${HOME}/Ascend/latest/data/aoe/custom/op/${soc\_version}。 若配置此环境变量，则调优后的最优策略存储在配置路径的${soc\_version}。 说明： 在多用户共享知识库场景下，共享知识库的用户需要设置TUNE\_BANK\_PATH为同一路径，并且对配置的路径具有读、写权限。 若调优时自定义了知识库路径，后续进行模型转换时，若想直接使用自定义知识库，也需要配置此环境变量。 |
| TE\_PARALLEL\_COMPILER | 算子编译所需环境变量。 网络模型较大时，可通过配置此环境变量，开启算子的并行编译功能。 TE\_PARALLEL\_COMPILER的值代表算子编译进程数（配置为整数），当取值大于1时开启算子的并行编译功能。开启AOE调优场景下：配置不能超过CPU核数\*80%/AI处理器的个数，取值范围：1~32，默认值为8。 由于该环境变量能够加速算子编译，所以可以加快涉及算子编译的相关流程调优。 |
| REPEAT\_TUNE | 是否重新发起调优，此环境变量在开启子图调优或算子调优的场景下生效。 如果知识库（内置或者自定义）中已经存在网络模型中的调优case（针对某shape的调优策略），则会跳过此case的调优流程，若想重新发起调优，可设置此环境变量为True。例如某些算子进行了逻辑的变更，如GEMM算子新增了支持ND的输入，该情况下需要设置此环境变量后，重新发起调优。 取值范围：True或者False，默认值为False。 |


#### 执行调优

将准备好的算子图使用AOE进行调优，调优示例如下。

```
aoe --job_type=2 --model_path=
dump_path
```


更多AOE参数请参见AOE参数说明。
