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 | 
 | 
| 
 | 可选 | 指定算子多流配置文件路径 | 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_shape")获取到。该参数与命令行中input_shape已统一。 | 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 | 可选有 | 
表4:配置[SplitGraph]参数
| 参数 | 属性 | 功能描述 | 参数类型 | 取值说明 | 
|---|---|---|---|---|
| 
 | 可选 | 指定子图切分节点 | 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模型性能(待上线)。
如果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/,查看其下目录是否有对应的自定义算子文件,当前主要提供了基本算子样例,具体文件结构如下:- /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样例逻辑实现文件 │ │ ├── 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文件