Ascend转换工具功能说明
概述
本文档介绍云侧推理模型转换工具在Ascend后端的相关功能,如配置文件的选项、动态shape、AOE、自定义算子等。
配置文件
表1:配置[ascend_context]参数
参数 |
属性 |
功能描述 |
参数类型 |
取值说明 |
---|---|---|---|---|
|
可选 |
指定模型输入format。 |
String |
可选有 |
|
可选 |
指定模型输入Shape,input_name必须是转换前的网络模型中的输入名称,按输入次序排列,用 |
String |
例如: |
|
可选 |
指定动态BatchSize和动态分辨率参数。 |
String |
|
|
可选 |
配置模型精度模式。 |
String |
可选有 |
|
可选 |
配置算子选择模式。 |
String |
可选有 |
|
可选 |
指定网络输出数据类型。 |
String |
可选有 |
|
可选 |
配置融合规则开关配置文件路径及文件名。 |
String |
指定融合规则开关的配置文件 |
|
可选 |
模型插入AIPP算子 |
String |
AIPP配置文件路径 |
|
可选 |
AOE自动调优模式 |
String |
可选有"subgraph tuning"、"operator tuning"或者"subgraph tuning、operator tuning",默认不使能 |
|
可选 |
用于使能ascend后端融合优化生成自定义算子 |
String |
可选有 |
|
可选 |
指定使能模型中的自定义算子结构 |
String |
|
|
可选 |
指定融合的自定义算子属性 |
String |
|
表2:配置[acl_init_options]参数
参数 |
属性 |
功能描述 |
参数类型 |
取值说明 |
---|---|---|---|---|
|
可选 |
设置网络模型使用的Core类型。 |
String |
可选有 |
|
可选 |
昇腾AI处理器的版本。 |
String |
可选有 |
|
可选 |
数据缓存优化开关。 |
String |
可选有 |
|
可选 |
可以对Weight进行数据压缩,提升性能。 |
String |
可选有 |
|
可选 |
要压缩的node节点列表配置文件路径,node节点主要为conv算子、fc算子。 |
String |
配置文件路径 |
|
可选 |
选择算子精度模式。 |
String |
可选有 |
|
可选 |
内存复用开关。 |
String |
可选有 |
|
可选 |
是否使能一个模型只使用一个stream。 |
String |
可选有 |
|
可选 |
设置编译时使用的ai core数目。 |
String |
默认 |
|
可选 |
融合配置文件路径。 |
String |
配置文件路径 |
|
可选 |
是否使能small channel的优化。 |
String |
可选有 |
|
可选 |
选择算子实现模式。 |
String |
可选有 |
|
可选 |
算子列表,列表中算子使用 |
String |
算子类型 |
|
可选 |
配置算子编译磁盘缓存模式。 |
String |
可选有 |
|
可选 |
配置算子变异磁盘缓存目录。 |
String |
默认值 |
|
可选 |
配置保存算子编译生成的调试相关的过程文件的路径。 |
String |
默认生成当前路径 |
|
可选 |
算子debug功能开关。 |
String |
可选有 |
|
可选 |
配置混合精度名单。 |
String |
配置文件路径 |
|
可选 |
使能全局稀疏特性。 |
String |
可选有 |
|
可选 |
是否将常量节点的权重单独保存到文件中。 |
String |
可选有 |
|
可选 |
是否开启确定性计算。 |
String |
可选有 |
|
可选 |
支持编译环境操作系统与运行环境不一致。 |
String |
可选有 |
|
可选 |
支持编译环境操作系统架构与运行环境不一致。 |
String |
可选有 |
|
可选 |
是否支持离线模型在昇腾虚拟化实例特性生成的虚拟设备上运行。 |
String |
可选有 |
|
可选 |
压缩优化功能配置文件路径。 |
String |
配置文件路径 |
表3:配置[acl_build_options]参数
参数 |
属性 |
功能描述 |
参数类型 |
取值说明 |
---|---|---|---|---|
|
可选 |
指定模型输入format。 |
String |
可选有 |
|
可选 |
模型输入shape。模型转换后可以用Model.get_model_info("input_shpae")获取到。该参数与命令行中input_shape已统一。 |
String |
例如: |
|
可选 |
指定输入的shape rang。 |
String |
例如: |
|
可选 |
扩展算子映射配置文件路径。 |
String |
配置文件路径 |
|
可选 |
设置动态batch档位参数。 |
String |
该参数需要与 |
|
可选 |
设置输入图片的动态分辨率参数。 |
String |
该参数需要与 |
|
可选 |
设置ND格式下的动态维度的档位。模型转换后可以用Model.get_model_info("dynamic_dims")获取 |
String |
该参数需要与 |
|
可选 |
输入预处理算子的配置文件路径。 |
String |
配置文件路径 |
|
可选 |
选择算子精度模式。 |
String |
可选有 |
|
可选 |
内存复用开关。 |
String |
可选有 |
|
可选 |
网络输出数据类型。 |
String |
可选有 |
|
可选 |
指定输出节点。 |
String |
例如: |
|
可选 |
指定输入数据类型为FP16的输入节点名称。 |
String |
|
|
可选 |
设置日志级别。 |
String |
可选有 |
|
可选 |
配置算子编译磁盘缓存模式。 |
String |
可选有 |
|
可选 |
配置算子变异磁盘缓存目录。 |
String |
默认值 |
|
可选 |
配置保存算子编译生成的调试相关的过程文件的路径。 |
String |
默认生成当前路径 |
|
可选 |
算子debug功能开关。 |
String |
可选有 |
|
可选 |
加载模型调优后自定义知识库的路径。 |
String |
该参数需要和 |
|
可选 |
加载算子调优后自定义知识库路径。 |
String |
知识库路径 |
|
可选 |
配置混合精度名单。 |
String |
配置文件路径 |
|
可选 |
设置具体某个算子的精度模式,通过该参数设置配置文件路径。 |
String |
配置文件路径 |
|
可选 |
图编译时shape编译方式。 |
String |
可选有 |
|
可选 |
内存检测功能开关。 |
String |
配置文件路径 |
|
可选 |
是否将常量节点的权重单独保存到文件中。 |
String |
可选有 |
|
可选 |
设置网络模型不使用某个或者某些加速引擎。 |
String |
可选有 |
动态shape配置
在某些推理场景,如检测出目标后再执行目标识别网络,由于目标个数不固定导致目标识别网络输入BatchSize不固定。如果每次推理都按照最大的BatchSize或最大分辨率进行计算,会造成计算资源浪费。因此,推理需要支持动态BatchSize和动态分辨率的场景,Lite在Ascend上推理支持动态BatchSize和动态分辨率场景,在convert阶段通过configFile配置[ascend_context]中dynamic_dims动态参数,推理时使用model的Resize功能,改变输入shape。
动态Batch size
参数名
dynamic_dims
功能
设置动态batch档位参数,适用于执行推理时,每次处理图片数量不固定的场景,该参数需要与input_shape配合使用,input_shape中-1的位置为动态batch所在的维度。
取值
最多支持100档配置,每一档通过英文逗号分隔,每个档位数值限制为:[1~2048]。例如配置文件中参数配置如下:
[ascend_context] input_shape=input:[-1,64,64,3] dynamic_dims=[1],[2]
其中,input_shape中的"-1"表示设置动态batch,档位可取值为"1,2",即支持档位0:[1,64,64,3],档位1:[2,64,64,3]。
若存在多个输入,不同输入对应的挡位需要一致,并用
;
隔开。[ascend_context] input_shape=input1:[-1,64,64,3];input2:[-1,256,256,3] dynamic_dims=[1],[2];[1],[2]
converter
./converter_lite --fmk=ONNX --modelFile=${model_name}.onnx --configFile=./config.txt --optimize=ascend_oriented --outputFile=${model_name}
说明:使能动态BatchSize时,不需要指定inputShape参数,仅需要通过configFile配置[ascend_context]动态batch size,即上节示例中配置内容。
推理
使能动态BatchSize,进行模型推理时,输入shape只能选择converter时设置的档位值,想切换到其他档位对应的输入shape,使用model Resize功能。
注意事项
1)若用户执行推理业务时,每次处理的图片数量不固定,则可以通过配置该参数来动态分配每次处理的图片数量。例如用户执行推理业务时需要每次处理2张,4张,8张图片,则可以配置为2,4,8,申请了档位后,模型推理时会根据实际档位申请内存。
2)如果用户设置的档位数值过大或档位过多,可能会导致模型编译失败,此时建议用户减少档位或调低档位数值。
3)如果用户设置的档位数值过大或档位过多,在运行环境执行推理时,建议执行swapoff -a命令关闭swap交换区间作为内存的功能,防止出现由于内存不足,将swap交换空间作为内存继续调用,导致运行环境异常缓慢的情况。
动态分辨率
参数名
dynamic_dims
功能
设置输入图片的动态分辨率参数。适用于执行推理时,每次处理图片宽和高不固定的场景,该参数需要与input_shape配合使用,input_shape中-1的位置为动态分辨率所在的维度。
取值
最多支持100档配置,每一档通过英文逗号分隔。例如: "[imagesize1_height,imagesize1_width],[imagesize2_height,imagesize2_width]"。例如配置文件中参数配置如下:
[ascend_context] input_format=NHWC input_shape=input:[1,-1,-1,3] dynamic_dims=[64,64],[19200,960]
其中,input_shape中的"-1"表示设置动态分辨率,即支持档位0:[1,64,64,3],档位1:[1,19200,960,3]。
converter
./converter_lite --fmk=ONNX --modelFile=${model_name}.onnx --configFile=./config.txt --optimize=ascend_oriented --outputFile=${model_name}
说明:使能动态BatchSize时,不需要指定inputShape参数,仅需要通过configFile配置[ascend_context]动态分辨率,即上节示例中配置内容。
推理
使能动态分辨率,进行模型推理时,输入shape只能选择converter时设置的档位值,想切换到其他档位对应的输入shape,使用model的Resize功能。
注意事项
1)如果用户设置的分辨率数值过大或档位过多,可能会导致模型编译失败,此时建议用户减少档位或调低档位数值。
2)如果用户设置了动态分辨率,实际推理时,使用的数据集图片大小需要与具体使用的分辨率相匹配。
3)如果用户设置的分辨率数值过大或档位过多,在运行环境执行推理时,建议执行swapoff -a命令关闭swap交换区间作为内存的功能,防止出现由于内存不足,将swap交换空间作为内存继续调用,导致运行环境异常缓慢的情况。
动态维度
参数名
ge.dynamicDims
功能
设置ND格式下输入的动态维度的档位。适用于执行推理时,每次处理任意维度的场景,该参数需要与
input_shape
配合使用,input_shape
中-1的位置为动态维度。取值
最多支持100档配置,每一档通过英文逗号分隔。例如配置文件中参数配置如下:
[acl_build_options] input_format="ND" input_shape="input1:1,-1,-1;input2:1,-1" ge.dynamicDims="32,32,24;64,64,36"
其中,input_shape中的"-1"表示设置动态维度,即支持档位0:input1:1,32,32; input2:1,24,档位1:1,64,64; input2:1,36。
converter
./converter_lite --fmk=ONNX --modelFile=${model_name}.onnx --configFile=./config.txt --optimize=ascend_oriented --outputFile=${model_name}
说明:使能动态维度时,
input_format
必须设置为ND
。推理
使能动态维度,进行模型推理时,输入shape只能选择converter时设置的档位值,想切换到其他档位对应的输入shape,使用model的Resize功能。
注意事项
1)如果用户设置的动态维度数值过大或档位过多,可能会导致模型编译失败,此时建议用户减少档位或调低档位数值。
2)如果用户设置了动态维度,实际推理时,使用的数据集图片大小需要与具体使用的维度相匹配。
3)如果用户设置的动态维度数值过大或档位过多,在运行环境执行推理时,建议执行swapoff -a命令关闭swap交换区间作为内存的功能,防止出现由于内存不足,将swap交换空间作为内存继续调用,导致运行环境异常缓慢的情况。
AOE自动调优
AOE是一款专门为Davinci平台打造的计算图形性能自动调优工具。Lite使能AOE的能力,是在converter阶段集成AOE离线可执行程序,对图进行性能调优,生成知识库,并保存离线模型。该功能支持子图调优和算子调优。具体使用流程如下:
AOE工具调优
配置环境变量
${LOCAL_ASCEND}
为昇腾软件包安装所在路径export LOCAL_ASCEND=/usr/local/Ascend source ${LOCAL_ASCEND}/latest/bin/setenv.bash
确认环境中AOE可执行程序可被找到并运行:
aoe -h
指定知识库路径
AOE调优会生成算子知识库,默认的路径为
${HOME}/Ascend/latest/data/aoe/custom/graph(op)/${soc_version}
(可选)也可通过
export TUNE_BANK_PATH
环境变量来自定义知识库路径。清除缓存
为了模型编译能命中AOE生成的知识库,在使能AOE之前,最好先删除编译缓存,以免缓存复用,以Atlas推理系列产品环境,用户为root为例,删除
/root/atc_data/kernel_cache/Ascend310P3
和/root/atc_data/fuzzy_kernel_cache/Ascend310P3
目录。配置文件指定选项
在转换工具config配置文件中
[ascend_context]
指定AOE调优模式,如下举例中,会先执行子图调优,再执行算子调优。[ascend_context] aoe_mode="subgraph tuning, operator tuning"
性能提升结果会因不同环境存在差异,实际时延减少百分比不完全等同于调优日志中所展示的结果。
AOE调优会在执行任务的当前目录下产生
aoe_workspace
目录,用于保存调优前后的模型,用于性能提升对比,以及调优所必须的过程数据和结果文件。该目录会占用额外磁盘空间,如500MB左右的原始模型会占用2~10GB的磁盘空间,视模型大小,算子种类结构,输入shape的大小等因素浮动。因此建议预留足够的磁盘空间,否则可能导致调优失败。
aoe_workspace
目录需要手动删除来释放磁盘空间。
AOE API调优
Ascend推理时,运行时指定 provider
为 ge
时,支持多个模型共享权重,支持模型中存在可以被更新的权重,即变量。当前仅AOE API调优支持模型中存在变量,默认的AOE工具调优不支持。环境变量、知识库路径的设置和使用、AOE调优缓存与AOE工具调优一致。详情可参考AOE调优。
转换工具支持AOE API调优,当 optimize=ascend_oriented
,配置文件中识别到 [ascend_context]
存在 provider=ge
,且 [ascend_context]
或 [acl_option_cfg_param]
中存在有效的 aoe_mode
或 [aoe_global_options]
存在有效的 job_type
,将启动AOE API调优。AOE API调优只产生知识库,不产生优化后的模型。
指定
provider
为ge
[ascend_context] provider=ge
AOE选项
[aoe_global_options]
中的选项将传给AOE API的全局选项。[aoe_tuning_options]
中的选项将传给AOE API的调优选项。我们将提取
[acl_option_cfg_param]
、[ascend_context]
、[ge_session_options]
、[ge_graph_options]
等Section中的选项并转换为AOE选项,避免用户开启AOE调优时需要手动转换这些选项。提取的选项包括input_format
、input_shape
、dynamic_dims
、precision_mode
。相同选项在多个配置Section同时存在时,优先级从前往后由低到高,[aoe_global_options]
和[aoe_tuning_options]
中的选项优先级最高。建议使用[ge_graph_options]
和[aoe_tuning_options]
。AOE调优模式
aoe_mode
当前仅限定为subgraph tuning
或operator tuning
,暂不支持subgraph tuning, operator tuning
,即不支持同一个调优过程进行子图和算子调优,如需要,可通过两次调用转换工具分别启动子图调优和算子调优。[aoe_global_options]
中,job_type
为1
时为子图调优,job_type
为2
时为算子调优。[ascend_context] aoe_mode="operator tuning"
[acl_option_cfg_param] aoe_mode="operator tuning"
[aoe_global_options] job_type=2
动态分档
可在
[acl_option_cfg_param]
、[ascend_context]
、[ge_graph_options]
、[aoe_tuning_options]
设置动态分档信息,优先级从低到高。以下设置方式等价。[ascend_context]
分档设置可参考 动态shape配置。[acl_option_cfg_param]
、[ge_graph_options]
、[aoe_tuning_options]
分档设置可参考 dynamic_dims、dynamic_batch_size、dynamic_image_size。注意,[ge_graph_options]
仅支持ge.dynamicDims
,不支持类似dynamic_batch_size
和dynamic_image_size
的形式。input_format
用于指定动态分档的输入维度排布,使用dynamic_image_size
时需要指定input_format
为NCHW
或NHWC
指示H
和W
维度所在位置。[ascend_context] input_shape=x1:[-1,3,224,224];x2:[-1,3,1024,1024] dynamic_dims=[1],[2],[3],[4];[1],[2],[3],[4]
[acl_option_cfg_param] input_shape=x1:-1,3,224,224;x2:-1,3,1024,1024 dynamic_dims=1,1;2,2;3,3;4,4
[ge_graph_options] ge.inputShape=x1:-1,3,224,224;x2:-1,3,1024,1024 ge.dynamicDims=1,1;2,2;3,3;4,4
[aoe_tuning_options] input_shape=x1:-1,3,224,224;x2:-1,3,1024,1024 dynamic_dims=1,1;2,2;3,3;4,4
精度模式
可在
[acl_option_cfg_param]
、[ascend_context]
、[ge_graph_options]
、[aoe_tuning_options]
设置模式信息,优先级从低到高。以下设置方式等价。[ascend_context]
和[acl_option_cfg_param]
精度模式设置可参考 ascend_context - precision_mode。[ge_graph_options]
和[aoe_tuning_options]
精度模式设置可参考 precision_mode。[ascend_context] precision_mode=preferred_fp32
[acl_option_cfg_param] precision_mode=preferred_fp32
[ge_graph_options] precision_mode=allow_fp32_to_fp16
[aoe_tuning_options] precision_mode=allow_fp32_to_fp16
部署Ascend自定义算子
MindSpore Lite converter支持将带有MindSpore Lite自定义Ascend算子的模型转换为MindSpore Lite的模型,通过自定义算子,可以在特殊场景下使用自定义算子对模型推理性能进行优化,如使用自定义的MatMul实现更高的矩阵乘法计算,使用MindSpore Lite提供的transformer融合算子提升transformer模型性能(待上线)以及使用AKG图算融合算子对模型进行自动融合优化提升推理性能等。
如果MindSpore Lite转换Ascend模型时有自定义算子,用户需要在调用converter之前部署自定义算子到ACL的算子库中才能正常完成转换,以下描述了部署Ascend自定义算子的关键步骤:
配置环境变量
${ASCEND_OPP_PATH}
为昇腾软件CANN包的算子库路径,通常是在昇腾软件安装路径下,默认一般是/usr/local/Ascend/latest/opp
。export ASCEND_OPP_PATH=/usr/local/Ascend/latest/opp
获取Ascend自定义算子包
MindSpore Lite云侧推理包中会包含Ascend自定义算子包目录,其相对目录为
${LITE_PACKAGE_PATH}/tools/custom_kernels/ascend
,解压MindSpore Lite云侧推理包后,进入对应目录。tar zxf mindspore-lite-{version}-linux-{arch}.tar.gz cd tools/custom_kernels/ascend
运行install.sh脚本部署自定义算子
在算子包目录下运行安装脚本部署自定义算子。
bash install.sh
查看昇腾算子库目录检查是否安装成功
完成部署自定义算子之后,进入昇腾算子库目录
/usr/local/Ascend/latest/opp/vendors/
,查看其下目录是否有对应的自定义算子文件,当前主要提供了基本算子样例和AKG图算融合算子实现,具体文件结构如下。/usr/local/Ascend/latest/opp/vendors/ ├── config.ini # 自定义算子vendor配置文件,定义不同vendor间优先级,需要有mslite的vendor配置 └── mslite # mslite提供的自定义算子目录 ├── framework # 第三方框架适配配置 │ └── tensorflow # tensorflow适配配置,非必需 │ └── npu_supported_ops.json ├── op_impl # 自定义算子实现目录 │ ├── ai_core # 运行在ai_core的算子实现目录 │ │ └── tbe # tbe算子实现目录 │ │ ├── config # 不同芯片的算子配置 │ │ │ ├── ascend310 # Atlas 200/300/500推理产品芯片的算子配置 │ │ │ └── aic_ascend310-ops-info.json │ │ │ ├── ascend310p # Atlas推理系列产品芯片的算子配置 │ │ │ └── aic_ascend310p-ops-info.json │ │ │ ├── ascend910 # Atlas训练系列产品芯片的算子配置 │ │ │ └── aic_ascend910-ops-info.json │ │ └── mslite_impl # 算子的实现逻辑目录 │ │ ├── add_dsl.py # 基于dsl开发的add样例逻辑实现文件 │ │ ├── add_tik.py # 基于tik开发的add样例逻辑实现文件 │ │ ├── compiler.py # akg图算需要的算子编译逻辑文件 │ │ ├── custom.py # akg自定义算子实现文件 │ │ ├── matmul_tik.py # 基于tik开发的matmul样例逻辑实现文件 │ ├── cpu # aicpu自定义算子目录,非必需 │ │ └── aicpu_kernel │ │ └── impl │ └── vector_core # 运行在vector_core的算子实现目录 │ └── tbe # tbe算子实现目录 │ └── mslite_impl # 算子的实现逻辑目录 │ ├── add_dsl.py # 基于dsl开发的add样例逻辑实现文件 │ ├── add_tik.py # 基于tik开发的add样例逻辑实现文件 │ └── matmul_tik.py # 基于tik开发的matmul样例逻辑实现文件 └── op_proto # 算子原型定义包目录 └── libcust_op_proto.so # 算子原型定义so文件,akg自定义算子默认注册,不需要此文件