子图/算子调优
调优前须知
- 请保证训练脚本在昇腾AI处理器上执行成功,功能和精度满足预期。
- 不建议用户绑定训练进程到指定的CPU,请使用系统默认的CPU调度策略。否则可能会影响调优效果。
- 为提高调优效率,希望用户尽量控制训练步数。一般情况下,通过一个step能完成一次完整的图执行过程,保证图中所有的算子都能遍历一遍完成调优即可。
- 目前仅支持静态算子,暂不支持动态算子。
- AOE不支持不同用户同时使用同一device进行调优。
- 调优前,请确保关闭Profiling功能,关闭内存静态分配方式(即设置GE_USE_STATIC_MEMORY=0),避免影响调优结果。关闭Profiling功能具体操作请参见《性能分析工具使用指南》。
- 不支持多P场景下的调优。
- 单P场景下的调优,请确保具备如下条件。
- 调优用户的家目录下磁盘可用空间>=20G。
- 可用内存>=训练模型需要的内存*TUNING_PARALLEL_NUM。其中TUNING_PARALLEL_NUM的说明请参考配置文件。
- 算子调优时Host CPU建议>= 训练脚本中的进程数 * (TE_PARALLEL_COMPILER + TUNING_PARALLEL_NUM + min(CPU的核数/2, 8) + 50)。其中TE_PARALLEL_COMPILER和TUNING_PARALLEL_NUM的说明请分别参考表3和配置文件。
- 子图调优时Host CPU建议>=训练脚本中的进程数 * ( 2 * TUNING_PARALLEL_NUM + TE_PARALLEL_COMPILER)。其中TE_PARALLEL_COMPILER和TUNING_PARALLEL_NUM的说明请分别参考表3和配置文件。
- Device核数>=模型中所有算子使用的最大核数。
- Device内存:和模型相关,和模型的内存复用相关。
配置环境变量
- CANN软件基础环境变量
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。执行命令参考如下,以下示例均为root或非root用户默认安装路径,请以实际安装路径为准。
# 以root用户安装toolkit包 . /usr/local/Ascend/ascend-toolkit/set_env.sh # 以非root用户安装toolkit包 . ${HOME}/Ascend/ascend-toolkit/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:子图调优,2:算子调优 export AOE_MODE=2
- 配置DEVICE_ID:
export ASCEND_DEVICE_ID=0
- 调优前也可参考如下示例配置其他环境变量,但为可选配置,相关说明请参考环境变量说明。
export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank export TE_PARALLEL_COMPILER=8 export REPEAT_TUNE=False
- 用户可将设置环境变量的命令写入自定义脚本,方便后续执行。
- 除了通过环境变量方式指定调优模式,还可通过修改训练脚本相应参数指定调优模式,具体请参考通过修改训练脚本配置调优模式(TensorFlow 1.15),考虑到操作复杂度,建议通过设置环境变量方式指定调优模式。
执行调优
如需进行子图调优或算子调优,直接执行训练脚本,即可按照指定的调优模式自动调优。
- 如需指定调优路径,执行训练前,可以修改训练脚本中的work_path或者aoe_config.work_path。
- 如需对指定算子进行调优,执行训练前,可以修改训练脚本中的aoe_config_file或者aoe_config.aoe_config_file。
查看调优结果
# TFAdapter开启调优 in tune mode, training graph handled by tools # 工具启动调优 Aoe tuning graph.
调优完成后,若满足自定义知识库生成条件(请参见请参见图2和图3),则会生成自定义知识库。
生成自定义知识库存放如下:
- 针对子图调优,会存储到TUNE_BANK_PATH环境变量中指定的路径。若不设置此配置选项,默认存储到${HOME}/Ascend/latest/data/aoe/custom/graph/${soc_version}目录下。
- 针对算子调优,会存储到TUNE_BANK_PATH环境变量中指定的路径/${soc_version}目录,若不设置此环境变量,默认存储到${HOME}/Ascend/latest/data/aoe/custom/op/${soc_version}路径下。
性能验证
调优完成后,请还原代码修改,使用调优后的自定义知识(如何使用请参见如何使用调优后的自定义知识库)重新训练,验证性能是否提高。
算子调优结果文件
调优过程中,会在执行调优的工作目录下实时生成命名为“aoe_result_opat_{timestamp}_{pidxxx}.json”的文件,记录调优过程中被调优的算子信息。
其中{timestamp}为时间戳,格式为:年月日时分秒毫秒,“{pidxxx}”中的“xxx”为进程ID。
内容格式如下所示,可以包括多个调优任务,各字段含义请参见表1。tid为线程ID。
{ "report_{timestamp}_{tid}": [ { "basic": { "tuning_name": "调优任务名", "tuning_time(s)": 44 } }, { "OPAT": { "opat_tune_result": "tune success", "repo_modified_operators": { "add_repo_operators": [ { "op_name": "strided_slice_10", "op_type": "stridedsliced", "performance_after_tune(us)": 99, "performance_before_tune(us)": 134, "performance_improvement": "35.35%" }, { "op_name": "strided_slice_7", "op_type": "stridedsliced", "performance_after_tune(us)": 14, "performance_before_tune(us)": 124, "performance_improvement": "785.71%" }, "update_repo_operators": [ { "op_name": "test/conv3/conv3_1/Conv2Dtest/conv3/conv3_1/Relu", "op_type": "conv2d", "performance_after_tune(us)": 4891.762, "performance_before_tune(us)": 5008.928, "performance_improvement": "2.40%" }, { "op_name": "test/conv1/conv1_2/Conv2Dtest/conv1/conv1_2/Relu", "op_type": "conv2d", "performance_after_tune(us)": 13114.24, "performance_before_tune(us)": 13446.145, "performance_improvement": "2.53%" } } ] }, "repo_summary": { "repo_add_num": 2, "repo_hit_num": 3, "repo_reserved_num": 1, "repo_unsatisfied_num": 0, "repo_update_num": 2, "total_num": 5 } } } ], "report_{timestamp}_{tid}": [ ........ .....
调优失败时(即opat_tune_result显示为"tune failed"时),还会显示调优失败的算子的op_name列表。
"tune_failed_operators": [ "res4a_branch1" ]
字段名称 |
含义 |
|||
---|---|---|---|---|
basic |
||||
- |
tuning_name |
- |
- |
调优任务名称。 |
- |
tuning_time(s) |
- |
- |
调优耗费的时长,单位:s。 |
OPAT
说明:
没有可调优的算子时,该段信息不存在。 |
||||
- |
opat_tune_result |
- |
- |
调优结果,成功时显示为"tune success",失败时显示为"tune failed"。 |
- |
repo_modified_operators |
- |
- |
调优后,调优策略有增加和更新的算子详细信息。 |
- |
- |
add_repo_operators |
- |
调优后增加调优策略的算子,可以没有,也可以有多个。 |
- |
- |
- |
op_name |
算子名称。 |
- |
- |
- |
op_type |
算子类型。可以有一个,也可以有多个。当有多个的时候,需要使用[]将多个算子类型括起来。 |
- |
- |
- |
performance_after_tune(us) |
调优后算子执行时间,单位:us。 |
- |
- |
- |
performance_before_tune(us) |
调优前算子执行时间,单位:us。 |
- |
- |
- |
performance_improvement |
调优后算子执行时间减少百分比。 |
- |
- |
update_repo_operators |
- |
调优后更新调优策略的算子,可以没有,也可以有多个。 |
- |
- |
- |
op_name |
算子名称。 |
- |
- |
- |
op_type |
算子类型。 |
- |
- |
- |
performance_after_tune(us) |
调优后算子执行时间,单位:us。 |
- |
- |
- |
performance_before_tune(us) |
调优前算子执行时间,单位:us。 |
- |
- |
- |
performance_improvement |
调优后算子执行时间减少百分比。 |
- |
repo_summary |
- |
- |
记录调优任务中不同状态算子的个数。 |
- |
- |
repo_add_num |
- |
调优前调优策略不在知识库中,调优后调优策略追加到知识库中的算子的个数。 |
- |
- |
repo_hit_num |
- |
调优过程中调优策略在知识库中的算子的个数。 |
- |
- |
repo_reserved_num |
- |
调优前调优策略在知识库中,调优后知识库中的调优策略无变化的算子的个数。 |
- |
- |
repo_unsatisfied_num |
- |
调优前调优策略不在知识库,调优后也未写入知识库的算子个数。 |
- |
- |
repo_update_num |
- |
调优前调优策略在知识库中,调优后知识库中的调优策略有更新的算子个数。 |
- |
- |
total_num |
- |
调优任务中被调优的算子总数。
|
- |
tune_failed_operators |
- |
- |
调优失败的算子的op_name列表。
说明:
可选,当opat_tune_result显示"tune failed"时才记录该字段。 |
子图调优结果文件
调优过程中,会在执行调优的工作目录下实时生成命名为“aoe_result_sgat_{timestamp}_{pidxxx}.json”的文件,记录调优过程中被调优的子图信息。
其中{timestamp}为时间戳,格式为:年月日时分秒毫秒,“{pidxxx}”中的“xxx”为进程ID。
内容格式如下所示,可以包括多个调优任务,各字段含义请参见表2。tid为线程ID。
"report_{timestamp}_{tid}": [ { "basic": { "tuning_name": "调优任务名", "tuning_time(s)": 19 } }, { "SGAT": { "model_baseline_performance(ms)": 5.600486, "model_performance_improvement": "55.11%", "model_result_performance(ms)": 3.610442, "repo_modified_subgraphs": { "add_repo_subgraphs": [ { "performance_after_tune(ms)": 3.573203, "performance_before_tune(ms)": 5.58434, "performance_improvement": "56.28%", "repo_key": "1024942313106047484" } ] "update_repo_subgraphs": [ { "performance_after_tune(ms)": 2.573203, "performance_before_tune(ms)": 4.58434, "performance_improvement": "78.15%", "repo_key": "1024942313106057586" } ] }, "repo_summary": { "repo_add_num": 1, "repo_hit_num": 1, "repo_reserved_num": 0, "repo_unsatisfied_num": 120, "repo_update_num": 1, "total_num": 121 } } } ], "report_{timestamp}_{tid}": [ ....... .......
字段名称 |
含义 |
|||
---|---|---|---|---|
basic |
||||
- |
tuning_name |
- |
- |
调优任务名称。 |
- |
tuning_time(s) |
- |
- |
调优耗费的时长,单位:s。 |
SGAT
说明:
子图调优失败时,该段信息不存在。 |
||||
- |
model_baseline_performance(ms) |
- |
- |
调优前模型执行时间,单位: ms。 |
- |
model_performance_improvement |
- |
- |
调优后模型执行时间减少百分比。 |
- |
model_result_performance(ms) |
- |
- |
调优后模型执行时间,单位: ms。 |
- |
repo_modified_subgraphs |
- |
- |
调优后,调优策略有增加和更新的子图详细信息。 |
- |
- |
add_repo_subgraphs |
- |
调优后调优策略有增加的子图,可以没有,也可以有多个。 |
- |
- |
- |
performance_before_tune(ms) |
调优前子图执行时间,单位: ms。 |
- |
- |
- |
performance_after_tune(ms) |
调优后子图执行时间,单位:ms。 |
- |
- |
- |
performance_improvement |
调优后子图执行时间减少百分比。 |
- |
- |
- |
repo_key |
调优后子图的key值,用于调优知识库查询。 |
- |
- |
update_repo_subgraphs |
- |
调优后调优策略有更新的子图,可以没有,也可以有多个。 |
- |
- |
- |
performance_before_tune(ms) |
调优前子图执行时间,单位: ms。 |
- |
- |
- |
performance_after_tune(ms) |
调优后子图执行时间,单位:ms。 |
- |
- |
- |
performance_improvement |
调优后子图执行时间减少百分比。 |
- |
- |
- |
repo_key |
调优后子图的key值,用于调优知识库查询。 |
- |
repo_summary |
- |
- |
记录调优过程中不同状态子图的个数。 |
- |
- |
repo_add_num |
- |
调优前调优策略不在知识库中,调优后调优策略追加到知识库中的子图的个数。 |
- |
- |
repo_hit_num |
- |
调优过程中调优策略在知识库中的子图的个数。 |
- |
- |
repo_reserved_num |
- |
调优前调优策略在知识库中,调优后知识库中的调优策略无变化的子图的个数。 |
- |
- |
repo_unsatisfied_num |
- |
调优前调优策略不在知识库,调优后也未写入知识库的子图个数。 |
- |
- |
repo_update_num |
- |
调优前调优策略在知识库中,调优后知识库中的调优策略有更新的子图个数。 |
- |
- |
total_num |
- |
调优任务中调优的子图总数。
|
环境变量说明
环境变量 |
说明 |
可选/必选 |
---|---|---|
AOE_MODE |
调优模式,支持如下取值:
|
必选 |
ASCEND_DEVICE_ID |
通过该环境变量指定昇腾AI处理器的逻辑ID。 取值范围[0,N-1],默认为0。其中N为当前物理机/虚拟机/容器内的设备总数。 |
可选 |
TUNE_BANK_PATH |
可通过此环境变量指定调优后自定义知识库的存储路径。
设置的存储路径必须为绝对路径或相对于执行AOE调优引擎所在路径的相对路径,配置的路径需要为已存在的目录,且执行用户具有读、写、可执行权限。若配置的TUNE_BANK_PATH路径不存在或用户无权限,则调优进程会报错并退出。
说明:
在多用户共享知识库场景下,共享知识库的用户需要设置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。 |
可选 |