推理场景下调优
环境准备
- Auto Tune工具运行依赖昇腾AI处理器硬件设备,所以当前工具仅支持开发调测环境的场景,即在安装昇腾AI处理器的设备上安装开发套件包Ascend-cann-toolkit。
- 请参见《CANN 软件安装指南》进行环境部署。
- 请确保运行环境中执行调优用户的家目录下磁盘可用空间>=20G。
- Auto Tune工具存储在ATC安装路径的python/site-packages/schedule_search.egg/schedule_search/和python/site-packages/auto_tune.egg/auto_tune/目录下。
- 第三方软件
环境部署完成后,需要参见表6-1安装Auto Tune工具依赖的第三方软件。
- 如果在安装ATC时使用了--install-for-all参数,即other用户也有权限进行Auto Tune功能调优,为了保证other用户对自定义知识库有可读、写、执行权限,可根据实际情况选择其中一种方式进行操作:
- 调优时使用默认自定义知识库路径,即不指定TUNE_BANK_PATH,需要执行如下命令修改默认自定义知识库的权限:
chmod -R 777 ${install_path}/atc/data
- 调优时指定TUNE_BANK_PATH,自定义调优后存储知识库的路径,详细可参见配置环境变量。
- 调优时使用默认自定义知识库路径,即不指定TUNE_BANK_PATH,需要执行如下命令修改默认自定义知识库的权限:
配置环境变量
Auto Tune工具执行前,利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export LD_LIBRARY_PATH=${install_path}/acllib/lib64:${install_path}/atc/lib64:$LD_LIBRARY_PATH export PATH=${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH export ASCEND_OPP_PATH=${install_path}/opp # Auto Tune可选环境变量 export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank export REPEAT_TUNE=False export TUNE_OPS_NAME=conv_layers/Pad_1 # 网络中需要调优的节点的name, 若指定此环境变量,则仅对指定的节点进行调优 export ASCEND_DEVICE_ID=0 export TE_PARALLEL_COMPILER=2 export ENABLE_TUNE_BANK=True # 离线调优环境变量 export ENABLE_TUNE_DUMP=True # 离线调优场景下可选环境变量 export TUNE_DUMP_PATH=/home/HwHiAiUser/DumpData
- install_path为ATC、ACLlib及OPP的安装路径,请根据实际环境替换。
- 用户可将设置环境变量的命令写入自定义脚本,方便后续执行。
环境变量说明如下表所示。
环境变量 |
说明 |
---|---|
LD_LIBRARY_PATH |
必选配置。 动态库的查找路径,参考上述举例配置。
|
PATH |
必选配置。 可执行程序的查找路径,参考上述举例配置。
|
PYTHONPATH |
必选配置。 Python搜索路径,参考上述举例配置。
|
ASCEND_OPP_PATH |
必选配置。 算子库根目录,参考上述举例配置。 为算子编译所需环境变量。 |
ASCEND_DEVICE_ID |
可选配置。 通过该环境变量指定昇腾AI处理器的逻辑ID。 取值范围[0,N-1],默认为0。其中N为当前物理机/虚拟机/容器内的设备总数。 当前版本DEVICE_ID和ASCEND_DEVICE_ID并存期间,系统处理逻辑如下:
须知:
该环境变量会在后续版本中替代DEVICE_ID,对于新安装版本建议使用ASCEND_DEVICE_ID。 |
DEVICE_ID |
可选配置。 指定执行调优的昇腾AI处理器的ID,即Device的序号,取值为整数。 DEVICE_ID查看方法如下: 使用root用户在Host侧执行命令:ls -l /dev | grep davinci 如下所示,粗体部分即为Device的ID。 [root@localhost home]# ls -l /dev | grep davinci crw-rw----. 1 HwHiAiUser HwHiAiUser 241, 0 Jul 23 2020 davinci0 crw-rw----. 1 HwHiAiUser HwHiAiUser 241, 0 Jul 23 2020 davinci1 crw-rw----. 1 HwHiAiUser HwHiAiUser 241, 0 Jul 23 2020 davinci2 crw-rw----. 1 HwHiAiUser HwHiAiUser 241, 0 Jul 23 2020 davinci3 ... crw-rw----. 1 HwHiAiUser HwHiAiUser 240, 0 Jul 23 2020 davinci_manager 当前版本DEVICE_ID和ASCEND_DEVICE_ID并存期间,系统处理逻辑如下:
|
TE_PARALLEL_COMPILER |
可选配置。 算子编译所需环境变量。 网络模型较大时,可通过配置此环境变量,开启算子的并行编译功能。 TE_PARALLEL_COMPILER的值代表算子并行编译进程数(配置为整数),默认值为8,当大于1时开启并行编译。 开启Auto Tune调优场景下:配置不能超过CPU核数*80%/昇腾AI处理器的个数,取值范围:1~32。 |
TUNE_BANK_PATH |
可选配置。 可通过此环境变量指定调优后自定义知识库的存储路径。 针对RL调优模式支持的算子:
针对GA调优模式支持的算子:
说明:
若调优时自定义了知识库路径,后续进行模型转换时,若想直接使用自定义知识库,也需要配置上此环境变量。 例如自定义知识库存储在/home/HwHiAiUser/custom_bank/<soc version>/ga目录下,则执行ATC工具进行模型转换时需要配置如下环境变量: export TUNE_BANK_PATH=/home/HwHiAiUser/custom_bank |
REPEAT_TUNE |
可选配置。 是否重新发起调优,此环境变量仅在开启了Auto Tune调优的场景下生效。 如果知识库(内置或者自定义)中已经存在网络模型中的调优case(针对某shape的调优策略),则会跳过此case的调优流程,若想重新发起调优,可设置此环境变量为True。例如某些算子进行了逻辑的变更,如GEMM算子新增了支持ND的输入,该情况下需要设置此环境变量后, 重新发起调优。 取值范围:True或者False,默认值为False。 |
ENABLE_TUNE_BANK |
可选配置。 使能知识库开关,有以下两种取值:
默认值为True。 |
TUNE_OPS_NAME |
可选配置。 指定层调优,用于网络调优场景中。在对网络进行Profiling性能分析后,可通过此环境变量指定对某个性能较低的算子进行调优。
说明:
此环境变量仅支持生成网络模型时同步调优的场景,不支持基于DUMP数据离线调优的场景。 |
ENABLE_TUNE_DUMP |
可选配置。 此环境变量应用于基于DUMP数据离线调优的场景。 进行离线调优时,开启生成算子DUMP数据的开关。 取值范围:True或者False,默认值为False。 说明:
若此环境变量设置为True,即使开启Auto Tune调优开关,也不会进行在线调优,仅生成DUMP调优数据。 |
TUNE_DUMP_PATH |
可选配置。 此环境变量应用于基于DUMP数据离线调优的场景。 可通过此环境变量指定生成的DUMP数据的存储路径。 可配置为绝对路径或相对于执行Auto Tune工具所在路径的相对路,可指定任意执行用户具有可读、写、执行的目录。 若不配置此环境变量,则默认在工具执行路径下生成tune_dump目录进行存储。 |
执行调优
使用ATC工具进行模型转换时调优
在执行ATC工具进行模型转换时,可通过--auto_tune_mode="xx"开关,使能Auto Tune调优工具。
- "RL,GA":同时进行RL与GA的调优,RL与GA顺序不区分,Auto Tune工具会自动根据算子特点选择使用RL调优模式还是GA调优模式。
- "RL":仅针对RL调优模式支持的算子进行调优。
- "GA":仅针对GA调优模式支持的算子进行调优。
命令示例如下所示:
atc --model=./tune.pb --framework=3 --output=./add_tune --output_type=FP16 --soc_version=Ascend310 --auto_tune_mode="RL,GA"
- ATC模型转换时默认不记录日志信息,若想输出Auto Tune的日志信息(Auto Tune记录的为Info级别的日志),请在执行atc命令时添加“--log=info”参数,则Auto Tune的日志信息会记录到“/var/log/npu/slog/host-0/host-0_*.log”中,ATC命令详细解释请参见ATC工具使用指南中的约束及参数说明。
- 调优过程中可通过环境变量进行如下功能的设置:
- 如果网络模型中某个算子已命中知识库,默认不会重复调优,可通过配置REPEAT_TUNE环境变量强制调优。
- 网络调优场景中,若某层算子性能较低,可通过配置TUNE_OPS_NAME环境变量对指定层进行调优。
- Auto Tune工具还提供了其他环境变量控制功能,详情可参见配置环境变量。
- 当前在同一个Host上允许开启多个ATC进程同时调优,多进程并行在一定范围内会提升调优效率,但由于资源的限制,达到一定峰值后调优效率会随着进程数的增多下降,ATC进程数配置建议满足如下规则:
ATC进程数 * TE_PARALLEL_COMPILER * 2 < Host侧CPU核数。其中TE_PARALLEL_COMPILER为算子并行编译进程数。
TBE算子并行编译场景下(即TE_PARALLEL_COMPILER>1),建议一个ATC进程对应一个Device。
IR模型构建时调优
在使用Ascend Graph接口构建离线模型时,可在模型构建初始化接口“aclgrphBuildInitialize”的“global_options”参数中进行如下配置,使能Auto Tune调优工具。
std::map<std::string, std::string> global_options = { {ge::ir_option::SOC_VERSION, "Ascend310"}, {ge::ir_option::EXEC_DISABLE_REUSED_MEMORY, "0"}, {ge::ir_option::AUTO_TUNE_MODE, "RL,GA"} }; auto status = aclgrphBuildInitialize( global_options );
- "RL,GA":同时进行RL与GA的调优,RL与GA顺序不区分,Auto Tune工具会自动根据算子特点选择使用RL调优模式还是GA调优模式。
- "RL":仅针对RL调优模式支持的算子进行调优。
- "GA":仅针对GA调优模式支持的算子进行调优。
IR模型构建时默认不记录日志信息,若想输出Auto Tune的日志信息(Auto Tune记录的为Info级别的日志),请在模型编译接口“aclgrphBuildModel”的“options”参数中添加如下配置:
{ge::ir_option::LOG_LEVEL, "info"}
则Auto Tune的日志信息会记录到“/var/log/npu/slog/host-0/host-0_*.log”中。IR模型构建的详细方法可参见《IR模型构建指南》。
调优过程中可通过环境变量进行如下功能的设置:
- 如果网络模型中某个算子已命中知识库,默认不会重复调优,可通过配置REPEAT_TUNE环境变量强制调优。
- 网络调优场景中,若某层算子性能较低,可通过配置TUNE_OPS_NAME环境变量对指定层进行调优。
- Auto Tune工具还提供了其他环境变量控制功能,详情可参见配置环境变量。
- 当前在同一个Host上允许开启多个构图进程同时调优,多进程并行在一定范围内会提升调优效率,但由于资源的限制,达到一定峰值后调优效率会随着进程数的增多下降,构图进程数配置建议满足如下规则:
构图进程数 * TE_PARALLEL_COMPILER * 2 < Host侧CPU核数。其中TE_PARALLEL_COMPILER为算子并行编译进程数。
TBE算子并行编译场景下(即TE_PARALLEL_COMPILER>1),建议一个构图进程对应一个Device。
基于DUMP数据离线调优
- 用户需要在使用ATC工具进行模型转换或者执行IR模型构建时获取调优所需的DUMP数据(包含算子输出描述文件、算子的二进制文件等)。
- 直接执行Auto Tune调优工具,基于上述步骤获取的DUMP数据进行离线调优。
详细操作如下所示:
- 使用ATC工具进行模型转换或者执行IR模型构建时获取网络模型中算子的DUMP数据。
DUMP数据主要包含算子的输出描述文件以及算子的二进制文件等,生成DUMP数据的前提为:
- 配置DUMP相关环境变量。开启DUMP数据开关。
- 配置Auto Tune所需必选环境变量LD_LIBRARY_PATH、PYTHONPATH与ASCEND_OPP_PATH,详细请参见配置环境变量。
export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export LD_LIBRARY_PATH=${install_path}/acllib/lib64:${install_path}/atc/lib64:$LD_LIBRARY_PATH export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH export ASCEND_OPP_PATH=${install_path}/opp
- 开启DUMP数据开关:
export ENABLE_TUNE_DUMP=True
- 设置DUMP数据存储路径:
export TUNE_DUMP_PATH=/home/HwHiAiUser/DumpData
- 配置Auto Tune所需必选环境变量LD_LIBRARY_PATH、PYTHONPATH与ASCEND_OPP_PATH,详细请参见配置环境变量。
- 执行ATC工具进行模型转换或者执行IR模型构建操作(无需使能Auto Tune调优工具),同步生成DUMP数据。
模型构建完成后,会在“TUNE_DUMP_PATH”指定的路径下生成DUMP数据。
- 配置DUMP相关环境变量。开启DUMP数据开关。
- 基于DUMP数据,执行Auto Tune工具进行离线调优。
Auto Tune工具离线调优入口脚本为ATC安装路径下的:atc/python/site-packages/schedule_search.egg/schedule_search/msoptune.py,用户可直接调用此python文件实现离线调优,调用命令如下:
python3.7 {msoptune.py文件所在路径} --start {DUMP数据所在目录}
示例:
python3.7 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/atc/python/site-packages/schedule_search.egg/schedule_search/msoptune.py --start /home/HwHiAiUser/DumpData
- /home/HwHiAiUser/Ascend/ascend-toolkit/latest:ATC组件安装目录,请根据实际情况替换。
- /home/HwHiAiUser/DumpData:生成的DUMP数据所在目录,可配置为绝对路径,或者相对于当前脚本执行所在目录的相对路径。
当前版本同一个Host上只允许开启一个进程进行离线调优,不允许多进程并发调优。
调优结果
介绍调优完成后知识库的变更及调优结果文件。
自定义知识库
调优完成后,若满足自定义知识库生成条件(请参见调优流程介绍),则会生成自定义知识库。
自定义知识库会存储到“TUNE_BANK_PATH”环境变量指定的路径中。若不设置此环境变量,针对RL调优模式支持的算子,会存储到ATC安装路径的/atc/data/rl/<soc_version>/custom/中;针对GA调优模式支持的算子,会存储到ATC安装路径的atc/data/tiling/<soc_version>/custom/中。
调优结果文件
调优开始后,会在执行调优的工作目录下生成命名为“tune_result_pidxxx_{timestamp}.json”的文件,记录调优过程和调优结果。
- 调优过程“process_data”的内容格式为:
"[['Operator Name']]":{"best_ticks":[[82, "2020-08-08 18:03:38"], [104, "2020-08-08 18:03:50"],...}
其中:- Operator Name:原图中的算子的名字,若原图在图优化过程中进行了融合,融合后的节点对应原图中的多个节点,则会显示多个Operator Name,例如:[['scale5a_branch1', 'bn5a_branch1', 'res5a_branch1'], ['res5a'], ['res5a_relu']]。
- best_ticks:记录每轮调优的结果,包含tiling耗时和本轮算子的调优结束时间。
- 调优结果“result_data”的内容格式为:
"[['Operator Name']]": {"before_tune": 66, "after_tune": 56}
其中:- Operator Name:原图中的算子的名字,若原图在图优化过程中进行了融合,融合后的节点对应原图中的多个节点,则会显示多个Operator Name,例如:[['scale5a_branch1', 'bn5a_branch1', 'res5a_branch1'], ['res5a'], ['res5a_relu']]
- before_tune:未开启Auto Tune调优前,算子执行时间,单位:us。
- after_tune:Auto Tune调优后,算子执行时间,单位:us。
Auto Tune在调优过程中会在执行调优工具的目录下生成tune_show_pidxxx_{timestamp}文件夹,tune_show_pidxxx_{timestamp}文件夹存储每个调优算子的flag文件,用户在调优过程中若想停止某层算子的调优可执行如下命令:
python3.7 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/atc/python/site-packages/schedule_search.egg/schedule_search/msoptune.py --stop tune_show_pidxxx_{timestamp}
按照提示信息选择需要停止调优的算子即可。调优停止后,会取当前调优生成知识库与已经存知识库进行比对,若性能优于已有知识库,则在custom目录替换已有知识库或追加新的知识库,否则不生成新的知识库。
tune_show_pidxxx_{timestamp}文件夹在调优结束后会自动删除。