前言¶
本文档介绍如何在HiSpark系列MCU上,基于MindSpore Lite Enterprise Micro v106版本,实现第三方开源框架(如TFLite、ONNX等)网络模型的轻量化部署与推理任务。Converter_lite是MindSpore Lite Enterprise Micro的转换工具,基于一系列内存/算子优化技术,生成适配HiSpark MCU上可执行的Micro模块代码。基于Converter_lite,在服务器端能够将模型转换为可在x86 / RISCV/ARM平台(x86部署可以为板端调试提供精度标杆)上部署的Micro工程代码,从而脱离在线解析模型和图编译,具有运行时内存小、代码轻量化等特点。
通过本文档,您将能够实现以下目标:
了解不同开源框架网络模型离线转换Micro工程代码的方法。
能够基于本文档的参数配置,转成量化或非量化的Micro工程代码。
能够基于Micro工程代码在x86/RISCV/ARM平台侧(x86部署可以为板端调试提供精度标杆)做部署推理。
掌握以下经验和技能可以更好理解本文档:
熟悉Linux基本命令。
对机器学习、人工智能有一定的了解。
有一定的C++工程开发经验。
本文档适用于使用MindSpore Lite Enterprise Micro v106工具进行AI模型端侧部署的人员,本文档适用于以下工程师:
技术支持工程师
软件工程师
硬件工程师
在本文中可能出现下列标志,它们所代表的含义如下。
Converter_lite工具使用环境搭建¶
获取converter_lite转换工具¶
工具包获取:converter_lite工具位于发布包的“mindspore-enterprise-lite-{version}-linux-x64/tools/converter/converter/converter_lite”路径下,其中“version”为软件版本号。
本文档以converter_lite转换工具的使用为例进行说明。
设置环境变量¶
使用export方式设置环境变量后,环境变量仅在当前窗口有效。如果用户之前已在.bashrc文件中设置过环境变量,则需要在执行上述命令前,先手动删除原来设置的环境变量。
设置converter_lite工具动态库链接。
export LD_LIBRARY_PATH=mindspore-enterprise-lite-{version}-linux-x64安装目录/tools/converter/lib:$LD_LIBRARY_PATH将Python3.11的路径添加到LD_LIBRARY_PATH中。
export LD_LIBRARY_PATH=${py311_install_path}/lib:$LD_LIBRARY_PATH将GCC的libstdc++6.0.30库路径添加到LD_LIBRARY_PATH中。
export LD_LIBRARY_PATH=${libc++6.0.30_path}/libxx:$LD_LIBRARY_PATH切换到GCC中libstdc++.so.6.0.30的安装目录,为libstdc++建立软链接。
ln -s libstdc++.so.6.0.30 libstdc++.so.6
若需要在RISCV平台进行部署推理,只需配置RISCV交叉编译链路径。
设置RISCV交叉编译工具链:
export HISPARK_RISCV_TOOLCHAIN_PATH=${sdk_install_path}/tools/bin/compiler/riscv/cc_riscv32_musl_105/
若需要在ARM平台进行部署推理,只需配置ARM交叉编译链路径。
设置ARM交叉编译工具链:
export HISPARK_ARM_TOOLCHAIN_PATH=${arm_compiler_path}/gcc-arm-v01c01-linux-musleabi/arm-v01c01-linux-musleabi-gcc/
限制与约束¶
关于工具链版本的约束要求,如表1所示。
表 1 工具链版本约束
(musl-1.2.3 linux-5.10 V12CS61.003.020 2024-01-16 12:00:00) 10.3.0 |
|
(musl-1.2.3 linux-5.10 V12CS61.003.020 2024-01-16 12:00:00) 10.3.0 |
|
快速入门¶
本章节以TFLite与ONNX框架的MNIST模型转换为例,演示如何快速转换生成Micro工程推理代码。
开源框架的TFLite/ONNX模型转换为Micro工程¶
获取开源框架MNIST网络模型。
TFLite模型:从链接中获取MNIST网络的模型文件:mnist网络模型,下载后解压得到mnist.tflite、mnist.tflite.ms.bin(MNIST输入数据)、mnist.tflite.ms.out(标杆输出数据,可用于精度对比)。该模型为已经训练完成的MNIST分类模型,为TFLite模型,将mnist.tflite模型拷贝到开发环境任意目录,例如上传到“$HOME/module/”目录下。
ONNX模型:从链接中获取mnist网络的模型文件:mnist网络模型,下载解压得到mnist-7.onnx,该模型为已经训练完成的MNIST分类模型,为ONNX模型,将mnist-7.onnx模型拷贝到开发环境任意目录,例如上传到“$HOME/module/”目录下。
获取converter_lite的压缩包,并进行解压。
tar -xvf mindspore-enterprise-lite-{version}-linux-x64.tar.gz将转换工具运行时所需的动态链接库添加到环境变量LD_LIBRARY_PATH中。
export LD_LIBRARY_PATH=mindspore-enterprise-lite-{version}-linux-x64/tools/converter/lib:${LD_LIBRARY_PATH}进入转换目录。
cd mindspore-enterprise-lite-{version}-linux-x64安装目录/tools/converter/converter-
场景一:以RISCV平台部署为例,将原模型直接转换为Micro工程目录。
#控制micro配置项 [micro_param] # 支持code-gen生成Micro工程代码 enable_micro=true # 支持x86,RISCV,ARM32平台 target=RISCV # 配置是否并行推理,当前仅支持单线程推理 support_parallel=false
场景二:以RISCV平台部署为例,将FP32原模型转换为int8量化Micro工程目录,具体参数请参见“参数说明”章节。
#控制micro配置项 [micro_param] # 支持code-gen生成Micro工程代码 enable_micro=true # 支持x86,RISCV平台 target=RISCV # 配置是否并行推理,当前仅支持单线程推理 support_parallel=false #控制通用量化参数配置项 [common_quant_param] # 当前仅支持全量化方式 quant_type=FULL_QUANT # 全量化仅支持8bit量化 bit_num=8 # 配置校准数据集参数 [data_preprocess_param] #关于calibrate_path解释为前半部分是网络的输入名称,后半部分是输入存放路径,详细设置请参见“5-参数说明”章节 calibrate_path=input:${HOME}/module/dataset/quant_data #数据集大小,这里必须与calibrate_path目录下的数据集大小对应,请参见“5-参数说明”章节 calibrate_size=1 #数据集格式,仅支持bin校准数据集格式,且该数据集下不允许存储非bin格式文件 input_type=BIN #全量化参数配置项 [full_quant_param] #激活值量化算法选择MAX_MIN,当前仅支持MAX_MIN量化算法 activation_quant_method=MAX_MIN #是否开启数据集校准 bias_correction=true #扩展量化算子,提升量化精度且牺牲性能可关闭 enable_all_ops=true
场景三:以RISCV平台部署为例,将原模型转换为int8量化训练Micro工程目录,具体参数请参见“参数说明”章节。
#控制micro配置项 [micro_param] # 支持code-gen生成Micro工程代码 enable_micro=true # 支持x86,RISCV平台 target=RISCV # 配置是否并行推理,当前仅支持单线程推理 support_parallel=false #控制通用量化参数配置项 [common_quant_param] # 当前仅支持全量化方式 quant_type=FULL_QUANT # 全量化仅支持8bit量化 bit_num=8 # 配置校准数据集参数 [data_preprocess_param] #关于calibrate_path解释为前半部分是网络的输入名称,后半部分是输入存放路径,详细设置请参见“5-参数说明”章节 calibrate_path=input:${HOME}/module/dataset/quant_data #数据集大小,这里必须与calibrate_path目录下的数据集大小对应,请参见“5-参数说明”章节 calibrate_size=1 #数据集格式,仅支持bin校准数据集格式,且该数据集下不允许存储非bin格式文件 input_type=BIN #全量化参数配置项 [full_quant_param] #激活值量化算法选择MAX_MIN,当前仅支持MAX_MIN量化算法 activation_quant_method=MAX_MIN #是否开启数据集校准 bias_correction=true #扩展量化算子,提升量化精度且牺牲性能可关闭 enable_all_ops=true #INT8量化训练参数配置项 [train] #QAS INT8量化训练模式;配置后自动生成训练模式Micro工程 train_mode=qas_int8 #是否输出训练图和内存规划信息 dump_training_graph=false #当前仅支持softmax_cross_entropy loss=softmax_cross_entropy #标签张量名称 label_tensor_name=label #当前仅支持sgd_with_momentum optimizer=sgd_with_momentum #学习率,必须大于0 learning_rate=0.005 #动量,必须大于等于0 momentum=0.9 #当前仅支持批大小为1 batch_size=1
场景四:以RISCV平台部署为例,将FP32原模型转换为FP32训练Micro工程目录。FP32训练与量化训练使用不同的训练配置, 不需要配置量化参数和校准数据集。
#控制micro配置项 [micro_param] #支持code-gen生成Micro工程代码 enable_micro=true #支持x86、RISCV平台 target=RISCV #配置是否并行执行,当前仅支持单线程 support_parallel=false #FP32端侧训练参数配置项 [train] #FP32训练模式;配置后自动生成训练模式Micro工程 train_mode=fp32 #支持softmax_cross_entropy、mean_squared_error loss=softmax_cross_entropy #标签或目标张量名称 label_tensor_name=label #支持sgd_with_momentum、adam optimizer=sgd_with_momentum #学习率,必须大于0 learning_rate=0.005 #仅sgd_with_momentum使用,必须大于等于0 momentum=0.9 #当前仅支持批大小为1 batch_size=1
使用Adam优化器时,将
optimizer配置为adam,并删除momentum。Adam参数beta1、beta2和epsilon可以省略,默认值依次为0.9、0.999和1e-8。 执行如下命令生成Micro工程代码(如下命令中使用的目录以及文件均为样例,请以实际为准)。
TFLite模型converter_lite转换命令:
#转换TFLite框架的MNIST模型生成Micro工程代码,converter_lite转换时参数请参见“5-参数说明”章节 ./converter_lite --fmk=TFLITE --modelFile=mnist.tflite --outputFile=mnist --configFile=micro.cfg --encryption=false --inputDataFormat=NHWC --outputDataFormat=NHWC --inputDataType=FLOAT --outputDataType=FLOAT
ONNX模型converter_lite转换命令:
#转换ONNX框架的MNIST模型生成Micro工程代码,converter_lite转换时参数请参见“5-参数说明”章节 ./converter_lite --fmk=ONNX --modelFile=mnist-7.onnx --outputFile=mnist --configFile=micro.cfg --encryption=false --inputDataFormat=NCHW --outputDataFormat=NCHW --inputDataType=FLOAT --outputDataType=FLOAT
运行成功后的结果显示为:
CONVERT RESULT SUCCESS:0
若想快速体验转换后的Micro工程代码的编译与推理,请准备好环境、符合模型输入要求的*.bin输入数据以及Micro工程代码,具体操作请参见“初级功能”章节。
基础知识¶
工具功能架构¶
converter_lite工具功能架构设计如图1所示。
开源框架网络模型场景的详细流程如下:
开源框架网络模型经过Parser解析后,转换为中间态IR Graph。
中间态IR经过图拆分与图编译优化操作后,根据节点注册对应规格算子。
生成模型权重数据、头文件与C源码等Micro工程代码。
通过gcc或者RISCV交叉编译工具链生成静态库文件,并将其上传到指定平台执行推理。
工具运行流程¶
使用converter_lite工具将模型转成Micro工程代码的总体流程如图1所示。
详细流程说明如下:
使用converter_lite工具之前,请先在开发环境中安装converter_lite工具包,并获取相关路径下的converter_lite工具。详细说明请参见“Converter_lite工具使用环境搭建”章节。
准备要进行转换的模型文件,并将其上传到开发环境。
设置Micro配置项,可根据需要进行量化与非量化的参数配置。
使用converter_lite工具进行模型转换,生成Micro工程代码。
编译Micro工程。
初级功能¶
本章节介绍如何在“基础知识”Micro工程代码的基础上进行编译部署推理。当前支持模型规格如下:
FP32 TFLite模型FP32 Micro推理。
FP32 TFLite模型INT8量化Micro推理。
INT8 TFLite模型INT8 Micro推理。
FP32 ONNX模型FP32 Micro推理。
FP32 ONNX模型INT8量化Micro推理。
支持推理平台为:x86_64平台(x86部署可以为板端调试提供精度标杆)与RISCV平台。
支持后端类型:CPU单核单线程。
RISCV平台编译部署¶
本节以FP32的mnist.onnx模型为例,介绍如何利用生成的Micro INT8量化推理代码,并在RISCV平台部署推理。
converter_lite工具转换开源框架模型生成Micro工程,请参见“快速入门”章节。
须知:在使用converter_lite转换命令时,--fmk选项必须与AI模型的开源框架对应,否则将导致转换失败。
micro.cfg的target必须选择RISCV,并且需要按照“开源框架的TFLite/ONNX模型转换为Micro工程”章节中的5场景二进行配置。
RISCV平台部署编译需要依赖海思提供的RISCV编译工具链,需下载相应的工具包。
切换到Micro工程目录。
#切换到名为micro的Micro工程目录 cd $HOME/micro/
下载并解压converter_lite工具包。
#进入到算子库在开发环境的路径 cd ${mindspore-enterprise-lite-{version}-linux-x64安装目录} #解压tar包 tar -xvf mindspore-enterprise-lite-{version}-linux-x64.tar.gz
在Micro工程目录新建“build_riscv.sh”脚本,配置如下:
#mindspore-enterprise-lite-{version}-linux-x64为converter_lite工具包在开发环境的路径,sdk_path为海思工具包在开发环境的路径 rm -rf build cmake -S . -B build -D OP_LIB="${mindspore-enterprise-lite-{version}-linux-x64安装目录}/tools/codegen/lib/riscv/libnnacl.a" \ -D WRAPPER_LIB="${mindspore-enterprise-lite-{version}-linux-x64安装目录}/tools/codegen/lib/riscv/libwrapper.a" -D RISCV_TOOLCHAIN_PATH="${sdk_path}/tools/bin/compiler/riscv/cc_riscv32_musl_105/cc_riscv32_musl/bin" \ -D PKG_PATH="${mindspore-enterprise-lite-{version}-linux-x64安装目录}" cd build make -j4
在"Micro工程目录/build ”目录中生成算子执行文件,目录如下:
Micro工程目录/build # MCU推理代码目录 ├── CMakeCache.txt ├── CMakeFiles ├── cmake_install.cmake ├── libmicro_runtime.a # 算子运行时静态库 ├── Makefile └── src ├── CMakeFiles ├── cmake_install.cmake ├── libnet.a # 算子定义与实现的静态库 └── Makefile
代码编译成功,屏幕显示结果如下:
[ 50%] Built target net [100%] Built target micro_runtime
将编译产物libnet.a与libmicro_runtime.a上传至海思工具包再次编译得到编译产物*.fwpkg文件。然后,使用海思工具在Windows平台烧录推理,具体步骤请参考对应的application/samples/ai中的readme.md。
ARM平台编译部署¶
本节以FP32的mnist.onnx模型为例,介绍如何利用生成的Micro INT8量化推理代码,并在ARM平台部署推理。
converter_lite工具转换开源框架模型生成Micro工程,请参见“快速入门”章节。
须知:在使用converter_lite转换命令时,--fmk选项必须与AI模型的开源框架对应,否则将导致转换失败。
micro.cfg的target必须选择ARM32,并且需要按照“开源框架的TFLite/ONNX模型转换为Micro工程”章节中的5场景二进行配置。
ARM平台部署编译需要依赖海思提供的ARM编译工具链,需下载相应的工具包。
切换到Micro工程目录。
#切换到名为micro的Micro工程目录 cd $HOME/micro/
下载并解压converter_lite工具包。
#进入到算子库在开发环境的路径 cd ${mindspore-enterprise-lite-{version}-linux-x64安装目录} #解压tar包 tar -xvf mindspore-enterprise-lite-{version}-linux-x64.tar.gz
在Micro工程目录新建“build_riscv.sh”脚本,配置如下:
#mindspore-enterprise-lite-{version}-linux-x64为converter_lite工具包在开发环境的路径,sdk_path为海思工具包在开发环境的路径 rm -rf build cmake -S . -B build -D OP_LIB="${mindspore-enterprise-lite-{version}-linux-x64安装目录}/tools/codegen/lib/riscv/libnnacl.a" \ -D WRAPPER_LIB="${mindspore-enterprise-lite-{version}-linux-x64安装目录}/tools/codegen/lib/riscv/libwrapper.a" -D HISPARK_ARM_TOOLCHAIN_PATH="${arm_compiler_path}/gcc-arm-v01c01-linux-musleabi/arm-v01c01-linux-musleabi-gcc" \ -D PKG_PATH="${mindspore-enterprise-lite-{version}-linux-x64安装目录}" cd build make -j4
在"Micro工程目录/build ”目录中生成算子执行文件,目录如下:
Micro工程目录/build # MCU推理代码目录 ├── CMakeCache.txt ├── CMakeFiles ├── cmake_install.cmake ├── libmicro_runtime.a # 算子运行时静态库 ├── Makefile └── src ├── CMakeFiles ├── cmake_install.cmake ├── libnet.a # 算子定义与实现的静态库 └── Makefile
代码编译成功,屏幕显示结果如下:
[ 50%] Built target net [100%] Built target micro_runtime
将编译产物libnet.a与libmicro_runtime.a上传至海思工具包再次编译得到编译产物*.fwpkg文件。然后,使用海思工具在Windows平台烧录推理,具体步骤请参考对应的application/samples/ai中的readme.md。
基于x86_64平台精度调试¶
本节以mnist.tflite模型为例,介绍在x86_64平台上的编译和部署过程(x86部署可以为板端调试提供精度标杆)。
使用converter_lite工具将开源框架模型转换为Micro工程,请参见“快速入门”章节
须知:在使用converter_lite转换命令时,--fmk选项必须与AI模型的开源框架对应,否则将导致转换失败,且需要配置--encryption=false参数。
micro.cfg的target必须选择x86,且需要按照“开源框架的TFLite/ONNX模型转换为Micro工程”章节中的5场景一进行配置。
切换到Micro工程目录。
#切换到Micro工程目录,假设工程目录叫micro cd $HOME/micro/
Micro工程目录结构如下,其中benchmark目录为x86_64部署的样例工程,调用相关Micro API接口。
micro # 指定的生成代码根目录名称 ├── benchmark # 对模型推理代码进行集成调用的benchmark例程 │ ├── benchmark.c │ ├── calib_output.c │ ├── calib_output.h │ ├── load_input.c │ └── load_input.h ├── CMakeLists.txt # benchmark例程的cmake工程文件 ├── include # 头文件 │ ├── model_handle.h └── src # 模型推理代码目录 ├── allocator.c ├── allocator.h ├── CMakeLists.txt ├── context.c ├── context.h ├── model.c ├── model.h ├── net.cmake ├── tensor.c └── tensor.h
gcc编译生成可执行文件。
切换到converter_lite工具包算子库路径,然后将算子库拷贝到父级目录。
cd "mindspore-enterprise-lite-{version}-linux-x64安装目录"/tools/codegen/lib/cpu 将算子库拷贝到父级目录 cp libnnacl.a libwrapper.a ../
创建编译目录,gcc编译benchmark可执行环境。
#创建并且切换到编译目录 mkdir build && cd build #gcc编译生成可执行文件 cmake -DPKG_PATH="mindspore-enterprise-lite-{version}-linux-x64安装目录" .. make
若Micro工程代码编译成功,屏幕将显示如下结果,此时在“Micro工程目录/build/src/”目录下会生成libnet.a。
[100%] Linking C executable benchmark [100%] Built target benchmark
运行benchmark推理流程,输入bin文件可以从mnist.tar.gz获取,也可以自行构造随机输入。
构造随机输入数据,下面给出生成[0,1]范围内Fp32随机数据的Python参考脚本,输出结果为mnist.bin文件。
须知:随机输入数据可以用于Micro工程推理,也可用于Micro INT8量化校准数据集。
若用户有真实数据集,可转换为Bin格式,无需参考下面的随机数据构造脚本。
#随机输入构造脚本,仅供参考 import numpy as np import os def generate_random_data(output_file, shape=(1, 25, 24, 1), dtype=np.float32): # 生成[0, 1)范围内的随机数 random_data = np.random.uniform(low=0.0, high=1.0, size=shape).astype(dtype) # 手动将部分点设为1.0,确保范围包含1 total_elements = np.prod(shape) if total_elements > 0: # 将最后一个元素设为1.0 random_data.flat[-1] = 1.0 # 再随机选一个元素设为0.0,确保包含0 random_data.flat[np.random.randint(0, total_elements)] = 0.0 # 验证数据范围 min_val = np.min(random_data) max_val = np.max(random_data) assert min_val >= 0.0, f"数据最小值{min_val}小于0" assert max_val <= 1.0, f"数据最大值{max_val}大于1" # 确保输出目录存在 os.makedirs(os.path.dirname(output_file), exist_ok=True) # 保存为二进制文件 with open(output_file, 'wb') as f: random_data.tofile(f) # 输出信息 print(f"数据维度: {random_data.shape}") print(f"数据类型: {random_data.dtype}") print(f"数据范围: [{min_val:.6f}, {max_val:.6f}]") print("数据前5个元素预览:", random_data.flatten()[:5]) if __name__ == "__main__": # 输出文件路径 output_file = "mnist.bin" # 生成并保存数据 generate_random_data(output_file)
运行benchmark,在x86_64平台完成推理。
#benchmark是精度评测的可执行文件,用法为./benchmark "mnist.tflite.ms.bin路径" "net0.bin路径",benchmark第一个参数是输入数据,第二个参数是模型权重文件(模型文件在benchmark目录同级的src/model0目录下)。假设mnist.tflite.ms.bin相对路径为"../../mnist/mnist.tflite.ms.bin",net0.bin相对路径为"net0.bin"。执行命令可参考如下: ./benchmark ../../mnist/mnist.tflite.ms.bin ../src/model0/net0.bin
推理成功,屏幕显示结果应该如下:
=======run benchmark====== ThreadNum: 1. BindMode: 0. input 0: ../../mnist/mnist.tflite.ms.bin Running warm up loops...========run success======= outputs: name: Identity, DataType: 43, Elements: 10, Shape: [1 10 ], Data: 0.000036, 0.000000, 0.009328, 0.000032, 0.000011, 0.000002, 0.000000, 0.000000, 0.990591, 0.000000, ========run success=======
参数说明¶
总体约束¶
针对converter_lite转换工具总体约束如下:
支持ONNX、TFLite开源框架的模型转换,当原始框架类型为ONNX、TFLite时,输入类型应为FP32、INT8、UINT8。
开源框架模型类型应与--fmk配置参数名称必须保持一致(包括大小写)。
在使用全量化转换时,必须构建校准输入数据集,且按照模型的输入名称设置Micro配置项。校准数据集和实际输入格式为BIN(即数据类型为.bin二进制文件),并且该路径下不允许存在其他格式文件。
参数概览¶
须知:
如果通过./converter_lite --help命令查询出的参数未在表1中解释,则说明该参数预留或者适用于其他芯片版本,用户无需关注。
使用converter_lite命令进行Micro工程代码生成时,支持模型量化与非量化,x86_64与RISCV编译,用户可根据实际情况进行选择。
converter_lite参数概览如表1所示,详细说明请参见“基础功能参数”章节。
表 1 converter_lite工具参数概览
基础功能参数¶
总体选项¶
功能说明
打印全部帮助信息。
关联参数
无
参数取值
无
推荐配置及收益
无
示例
#切换到converter_lite工具安装目录,配置LD_LIBRARY_PATH环境变量 ./converter_lite --help
依赖约束
无
输入选项¶
功能说明
配置输入开源框架模型的原始格式。
关联参数
无
参数取值
TFLite:转换TFLite开源框架模型为Micro工程代码。
ONNX:转换ONNX开源框架模型为Micro工程代码。
参数默认值:无
推荐配置及收益
无
示例
#配置输入开源框架模型的原始格式,模型与fmk对应关系为*.tflite-TFLite;*.onnx->ONNX --fmk=TFLITE --fmk=ONNX
依赖约束
无
功能说明
输入模型的路径。
关联参数
无
参数取值
参数默认值:无
推荐配置及收益
无
示例
#配置开源框架的输入模型路径,例如 --modelFile=$HOME/module/mnist.tflite
依赖约束
无
功能说明
设置转换Micro工程的配置项。
关联参数
无
参数取值
参数取值参考如表1所示。
须知:Micro配置项表1中未声明的参数不支持或者适用于其他芯片,用户无需关注。
如果不使用全量化,仅配置[micro_param]、enable_micro、target、support_parallel,其中support_parallel将默认配置为false。
如果需要使用全量化,需要配置表1中除debug_mode以外的参数。quant_type需要配置为FULL_QUANT,bit_num默认配置为8,bias_correction默认配置为true,enable_all_ops默认配置为false。
全量化时配置calibrate_path必须符合“input_name_1:input_1_dir,input_name_2:input_2_dir.... ”输入格式,且input_name_1、input_name_2等的输入数量与名称必须与开源框架AI模型的输入数量和名称相符合。
全量化时配置的calibrate_size必须与calibrate_path每个数据集目录元素数量相同。
表 1 micro.cfg配置项参数概览
推荐配置及收益
无
示例
#配置Micro工程配置项绝对路径,例如 --configFile=$HOME/module/micro.cfg
依赖约束
无
输出选项¶
功能说明
转成Micro工程代码的路径
关联参数
无
参数取值
参数默认值:无
推荐配置及收益
无
示例
#Micro工程路径为当前目录的mnist文件夹 --outputFile=mnist #Micro工程路径为当前目录的micro文件夹 --outputFile=.
命令执行完毕后,屏幕会打印类似如下信息:
CONVERT RESULT SUCCESS:0依赖约束
无
算子规格参考¶
本章主要介绍(MindSpore Lite)所支持的算子规格限制,目前主要支持ONNX格式以及TFLite格式的模型,并且支持算子的数据类型主要为int8以及fp32。
说明: Gemm是ONNX框架的矩阵乘法算子,而FullyConnected则是TFLite框架的矩阵乘法算子。目前,int8仅支持量化模型,不支持onnxruntime量化场景。
TFLite算子规格参考¶
Conv2D¶
对4D输入进行卷积计算。
表 1 Conv2D参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
FP32 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
MaxPool2D¶
对4D输入进行最大池化计算。
表 1 MaxPool2D参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
仅支持MaxPool,输入和输出均为四维量化张量 |
FP32 |
不支持 |
- |
FullyConnected¶
对2D、3D、4D输入的最后一个维度进行特征映射(类似Onnx规格中Gemm)。
表 1 FullyConnected参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
要求使用静态形状 |
FP32 |
支持 |
要求使用静态形状 |
BatchMatmul¶
对两个2D/3D/4D输入张量进行矩阵乘法运算。
说明: BatchMatmul暂时不支持广播机制,x倒数两维为计算维度[M, K],y倒数两维为计算维度[K, N],K大小必须保持一致。计算维度前,维度必须保持一致。
表 1 BatchMatmul参数概览
Softmax¶
计算最后一维的归一化Softmax概率分布。
说明: 受TFLite限制,Softmax仅支持在最后一维上进行计算。
表 1 Softmax参数概览
Relu¶
对输入张量做Relu激活函数运算。
表 1 Relu参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
当前Activation训练反向仅支持ReLU |
FP32 |
支持 |
当前Activation训练反向仅支持ReLU |
Tanh¶
对输入张量做Tanh激活函数运算。
表 1 Tanh参数概览
Logistic (Sigmoid)¶
对输入张量做Sigmoid激活函数运算。
表 1 Logistic参数概览
Reshape¶
改变Tensor的Shape,但不改变其排布。
表 1 Reshape参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
Mul¶
计算两个矩阵逐点相乘。
说明: Mul支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Mul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Add¶
计算两个矩阵逐点相加。
说明: Add支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Add参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Sub¶
计算两个矩阵逐点相减。
说明: Sub支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Sub参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Gather¶
根据指定索引,从输入张量的指定轴上提取元素,组合成新张量
表 1 Gather参数概览
Split¶
Split算子在TFLITE框架中包含tfl.Split、tfl.SplitV等api,其中tfl.Split表示均匀划分,tfl.SplitV自定义非均匀划分。
Split¶
对张量分割按照某一轴平均切分成若干份。
表 1 Split参数概览
SplitV¶
对张量分割按照某一轴非平均切分成若干份。
表 1 SplitV参数概览
Concatenation¶
将多个张量拼接成某一个张量。
表 1 Concatenation参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
输入rank、axis和静态形状必须满足拼接约束 |
AveragePool2D¶
对4D输入进行平均池化计算。
表 1 AveragePool2D参数概览
Tile¶
对2D/3D/4D输入沿指定维度做复制扩展。
表 1 Tile参数概览
Pad¶
Pad算子在TFLITE框架中包含tfl.Pad、tfl.PadV2、tfl.Mirror_Pad等api,其中tfl.Pad表示零填充,tfl.Padv2表示自定义常量填充,tfl.Mirror_Pad表示镜像反射填充。
Pad¶
对输入张量边界做零填充。
表 1 Pad参数概览
PadV2¶
对输入张量边界做自定义常量填充。
表 1 PadV2参数概览
Mirror_Pad¶
对输入张量边界做镜像反射填充。
表 1 Mirror_Pad参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
pads必须为转换期常量 |
Resize¶
Resize算子在TFLITE框架中包含tfl.Resize_Bilinear、tfl.Resize_Nearest_Neighbor等api,其中tfl.Pad表示零填充,tfl.Resize_Bilinear表示双线性插值缩放,tfl.Resize_Nearest_Neighbor表示最近邻插值缩放。
Resize_Bilinear¶
对输入张量做双线性插值缩放。
表 1 Resize_Bilinear参数概览
Resize_Nearest_Neighbor¶
对输入张量做最近邻插值缩放。
表 1 Resize_Nearest_Neighbor参数概览
Squeeze¶
对输入张量进行shape压缩操作。
表 1 Squeeze参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
ExpandDims¶
对输入张量进行shape扩展操作。
表 1 ExpandDims参数概览
Abs¶
对张量的每个元素做绝对值运算。
表 1 Abs参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
要求使用FP32静态非空张量 |
Ceil¶
对张量中的每个元素做向上取整操作。
表 1 Ceil参数概览
Cos¶
对张量中的每个元素做余弦操作。
表 1 Cos参数概览
Exp¶
对张量中的每个元素做指数计算操作。
表 1 Exp参数概览
Floor¶
对张量中的每个元素做向下取整操作。
表 1 Floor参数概览
Log¶
对张量中的每个元素做对数计算操作(底数值为e)。
表 1 Log参数概览
Round¶
对张量中的每个元素做四舍五入操作。
表 1 Round参数概览
Rsqrt¶
对张量中的每个元素做平方根倒数计算操作。
表 1 Rsqrt参数概览
Sin¶
对张量中的每个元素做正弦计算操作。
表 1 Sin参数概览
Sqrt¶
对张量中的每个元素做平方根计算操作。
表 1 Sqrt参数概览
Square¶
对张量中的每个元素做平方计算操作。
表 1 Square参数概览
L2Normalization¶
沿指定轴,用L2范数对输入张量执行归一化计算。
表 1 L2Normalization参数概览
Slice¶
Slice算子在TFLITE框架中包含tfl.slice、tfl.strided_slice等api,其中tfl.slice为连续提取子张量,tfl.strided_slice可以通过指定步长、掩码等方式更灵活地进行提取。
Slice¶
从输入张量中沿指定轴连续提取子张量。
表 1 Slice参数概览
StridedSlice¶
从输入张量中沿指定轴提取子张量。
表 1 StridedSlice参数概览
第 i 维度对应位为 1 时,忽略该维度的 begin[i],改用维度起始边界(正向切片 = 0,反向切片 = 维度长度 - 1)。 |
||||
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
begin、end和stride等结构输入必须为转换期常量 |
DepthwiseConv2D¶
对4D输入进行深度可分离卷积计算。
表 1 DepthwiseConv2D参数概览
Transpose¶
对输入张量进行转置。
表 1 Transpose参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
perm必须是合法的常量全排列 |
FP32 |
支持 |
perm必须是合法的常量全排列 |
ArgMax¶
在张量的指定维度上,计算并返回最大值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMax参数概览
ArgMin¶
在张量的指定维度上,计算并返回最小值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMin参数概览
Div¶
对两输入张量进行除法运算。
表 1 Div参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
ReduceMax¶
对指定维度的张量进行最大值归约计算。
表 1 ReduceMax参数概览
ReduceMin¶
对指定维度的张量进行最小值归约计算。
表 1 ReduceMin参数概览
Sum¶
对指定维度的张量进行求和归约计算。
表 1 Sum参数概览
Mean¶
对指定维度的张量进行均值归约计算。
表 1 Mean参数概览
Cast¶
对输入张量进行数据类型的转换。
说明: Cast算子不支持量化。
表 1 Cast参数概览
Quantize¶
对输入张量进行量化操作。
说明: Quantize算子不支持量化。
表 1 Quantize参数概览
Dequantize¶
对输入张量进行反量化操作。
说明: Dequantize算子不支持量化。
表 1 Dequantize参数概览
PRelu¶
对输入张量进行参数化 ReLU 激活处理。其在输入为非负值时保持原值,在输入为负值时根据斜率参数进行线性缩放。
表 1 PRelu参数概览
说明: 在量化过程中,PReLU算子的第二输入保留FP32格式,以保证负半轴计算精度。
CumSum¶
对输入张量沿指定维度进行累加求和处理,输出结果为该维度上的前缀和。
表 1 CumSum参数概览
数据类型仅支持 int32、int64;取值范围为 [ -rank(input), rank(input) - 1],当 axis 为负数时,表示从最后一个维度开始反向索引。 |
||||
ReverseSequence¶
对输入张量指定轴前N个数据进行反转。
表 1 ReverseSequence参数概览
Relu6¶
对输入张量做Relu6激活函数运算。在输入为非负值且不大于 6 时保持原值,在输入为负值时置为 0,在输入大于 6 时置为 6。
表 1 Relu6参数概览
LeakyRelu¶
对输入张量做LeakyRelu激活函数运算。在输入为非负值时保持原值,在输入为负值时根据缩放系数进行线性缩放。
表 1 LeakyRelu参数概览
HardSwish¶
对输入张量做HardSwish激活函数运算。公式为:output = input * HardSigmoid(α=1/6, β=0.5, input)
表 1 HardSwish参数概览
LogicalAnd¶
对两个输入张量执行逐元素“与”逻辑运算。
说明: LogicalAnd支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。 LogicalAnd算子不支持量化。
表 1 LogicalAnd参数概览
Equal¶
对两个输入张量执行逐元素“等于”逻辑运算。
说明: Equal支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Equal参数概览
GreaterEqual¶
对两个输入张量执行逐元素“大于等于”逻辑运算。
说明: GreaterEqual支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 GreaterEqual参数概览
Greater¶
对两个输入张量执行逐元素“大于”逻辑运算。
说明: Greater支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Greater参数概览
LessEqual¶
对两个输入张量执行逐元素“小于等于”逻辑运算。
说明: LessEqual支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 LessEqual参数概览
Less¶
对两个输入张量执行逐元素“小于”逻辑运算。
说明: Less支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Less参数概览
NotEqual¶
对两个输入张量执行逐元素“不等于”逻辑运算。
说明: NotEqual支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 NotEqual参数概览
LogicalNot¶
逐元素返回输入张量的取反值。
说明: LogicalNot算子不支持量化。
表 1 LogicalNot参数概览
LogicalOr¶
对两个输入张量执行逐元素“或”逻辑运算。
说明: LogicalOr支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。 LogicalOr算子不支持量化。
表 1 LogicalOr参数概览
Elu¶
对输入张量做Elu激活函数运算。公式为:y = x if x >= 0 else (exp(x)-1)
表 1 Elu参数概览
DepthToSpace¶
对输入张量维度的深度(通道)维度的数据重排到空间(高、宽)维度。
表 1 DepthToSpace参数概览
SpaceToDepth¶
对输入张量空间(高、宽)维度的数据重排到深度(通道)维度。
表 1 SpaceToDepth参数概览
Fill¶
创建形状为 dims 的张量,所有元素填充为给定的标量 value。该算子仅在 TFLITE 框架中定义(BuiltinOperator 编号:94),ONNX 框架无对应标准算子。不支持 ONNX 格式转换。
表 1 Fill参数概览
Shape¶
获取输入张量的形状信息。
表 1 Shape参数概览
Neg¶
对张量的每个元素做取负运算(符号取反),即 y = -x。
表 1 Neg参数概览
Pow¶
计算两个张量的逐元素幂运算,base 为底数张量,exponent 为指数张量,输出 result = base^exponent。支持 NumPy 风格广播。
说明:
Pow 无内置属性,转换时自动填充。支持广播特性,双向广播需在转换命令中明确配置 inputDataFormat 和 outputDataFormat 参数。
推荐使用 X ≥ 0 的输入组合确保结果确定性;X < 0 且 Y 为非整数时实数域无定义,输出值取决于底层数学库。
INT8 量化仅支持 X ≥ 0 的输入,X < 0 时负数值在 int8 对称量化中将被映射为 0。
表 1 Pow参数概览
TopK¶
获取输入张量中沿指定维度前K个最大值。
表 1 TopK参数概览
Gelu¶
对输入张量做Gelu激活函数运算。Gelu(Gaussian Error Linear Unit)基于正态分布累积概率,对输入乘以其概率分布的值实现连续非线性变换,相比传统激活函数在负值区域具有平滑的非零梯度。
表 1 Gelu参数概览
Pack¶
Pack算子用于沿着指定的新轴(axis)将一组形状相同的输入张量堆叠(拼接)成一个新的高维张量。堆叠后输出张量的维度(Rank)相比单个输入张量增加1。
表 1 Pack参数概览
Unpack¶
Unpack算子用于沿指定的轴(axis)将一个高维张量拆分(解包)成一组低维张量,是Pack算子的逆向操作。解包后每个输出张量的维度(Rank)相比输入张量减少1。
表 1 Unpack参数概览
输出张量列表,每个输出张量维度为输入维度-1(输出Rank=输入Rank-1),输出张量数量等于输入在axis轴上的Size。 |
||||
Select¶
根据条件张量从两输入张量中选择元素,不支持广播。
表 1 Select参数概览
SelectV2¶
根据条件张量从两输入张量中选择元素,支持广播。
表 1 SelectV2参数概览
ReverseV2¶
沿指定轴对张量进行反转。
表 1 ReverseV2参数概览
ONNX算子规格参考¶
Conv¶
基于一个filter模板对3D或4D输入进行卷积计算。
表 1 Conv参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
FP32 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
MaxPool¶
对3D或4D输入进行最大池化计算。
说明: Maxpool双输出规格暂不支持。
表 1 MaxPool参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
仅支持MaxPool,输入和输出均为四维量化张量 |
FP32 |
不支持 |
- |
Gemm¶
对两个2D张量进行矩阵乘积运算。
表 1 Gemm参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
FP32 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
Matmul¶
对两个2D/3D/4D张量进行矩阵乘积运算。
说明: Matmul不支持广播场景。
表 1 Matmul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
FP32 |
支持 |
要求使用静态形状;仅对可微输入和可训练权重生成梯度 |
Softmax¶
计算指定维度的归一化Softmax概率分布。
说明: 当Softmax维度较大时,int8量化损失较大,推荐使用fp32模式的算子,关闭cfg中的enable_all_ops选项(仅保留矩阵运算类算子的量化)。
表 1 Softmax参数概览
Relu¶
对输入张量做Relu激活函数运算。
表 1 Relu参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
当前Activation训练反向仅支持ReLU |
FP32 |
支持 |
当前Activation训练反向仅支持ReLU |
Tanh¶
对输入张量做Tanh激活函数运算。
表 1 Tanh参数概览
Sigmoid¶
对输入张量做Sigmoid激活函数运算。
表 1 Sigmoid参数概览
Reshape¶
改变Tensor的Shape,但不改变其排布。
表 1 Reshape参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
Mul¶
计算两个矩阵逐点相乘。
说明: Mul支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Mul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Add¶
计算两个矩阵逐点相加。
说明: Add支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Add参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Sub¶
计算两个矩阵逐点相减。
说明: Sub支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Sub参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Gather¶
根据指定索引,从输入张量的指定轴上提取元素,组合成新张量。
表 1 Gather参数概览
Split¶
对张量分割按照某一轴平均或非平均切分成若干份。
表 1 Split参数概览
Concat¶
将多个张量拼接成某一个张量。
表 1 Concat参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
输入rank、axis和静态形状必须满足拼接约束 |
AveragePool¶
对3D或4D输入进行平均池化计算。
表 1 AveragePool参数概览
InstanceNormalization¶
对3D输入张量做归一化计算。
说明: 暂时只支持1D,仅支持float类型,暂不支持int8类型。
表 1 InstanceNormalization参数概览
LSTM¶
一种循环神经网络,用于捕捉输入的时序数据长期依赖关系。
说明: 仅支持float类型,暂不支持int8类型。
表 1 LSTM参数概览
Tile¶
对2D/3D/4D输入沿指定维度做复制扩展。
表 1 Tile参数概览
Pad¶
对输入张量边界做填充。
表 1 Pad参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
pads必须为转换期常量 |
Resize¶
对输入张量按照指定填充模式做缩放。
表 1 Resize参数概览
规格约束:离线常量,NC轴保持1.0。fp32仅支持out_dim为整数,int8不支持配置,scales为离线常量,与sizes必须配置且仅配置一个 |
||||
Squeeze¶
对输入张量进行shape压缩操作,被压缩维度的dim值必须为1。
表 1 Squeeze参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
Unsqueeze¶
对多维Tensor进行shape扩展。
表 1 Unsqueeze参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
Flatten¶
对多维Tensor进行维度展平。
表 1 Flatten参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致 |
FP32 |
支持 |
输入和输出元素数量必须一致 |
Abs¶
对张量的每个元素做绝对值运算。
表 1 Abs参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
要求使用FP32静态非空张量 |
Ceil¶
对张量中的每个元素做向上取整操作。
表 1 Ceil参数概览
Cos¶
对张量中的每个元素做余弦操作。
表 1 Cos参数概览
Exp¶
对张量中的每个元素做指数计算操作。
表 1 Exp参数概览
Floor¶
对张量中的每个元素做向下取整操作。
表 1 Floor参数概览
Log¶
对张量中的每个元素做对数计算操作(底数值为e)。
表 1 Log参数概览
Round¶
对张量中的每个元素做四舍五入操作。
表 1 Round参数概览
Sin¶
对张量中的每个元素做正弦计算操作。
表 1 Sin参数概览
Sqrt¶
对张量中的每个元素做平方根计算操作。
表 1 Sqrt参数概览
BatchNormalization¶
对输入张量做批归一化计算。
表 1 BatchNormalization参数概览
LayerNormalization¶
对输入张量做层归一化计算。
表 1 LayerNormalization参数概览
LpNormalization¶
沿指定轴,用 1 或 2 阶 Lp 范数对输入张量执行归一化计算。
表 1 LpNormalization参数概览
Slice¶
从输入张量中沿指定轴提取子张量。
表 1 Slice参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
starts、ends、axes和steps必须为转换期常量 |
GlobalMaxPool¶
对输入张量除通道轴以外进行最大池化操作。
表 1 GlobalMaxpool参数概览
GlobalAveragePool¶
对输入张量除通道轴以外进行平均池化操作。
表 1 GlobalAveragePool参数概览
Transpose¶
对输入张量进行转置。
表 1 Transpose参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
perm必须是合法的常量全排列 |
FP32 |
支持 |
perm必须是合法的常量全排列 |
ArgMax¶
在张量的指定维度上,计算并返回最大值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMax参数概览
ArgMin¶
在张量的指定维度上,计算并返回最小值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMin参数概览
Div¶
对两输入张量进行除法运算。
表 1 Div参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持范围取决于输入角色和广播规格 |
Mod¶
对两输入张量进行取模运算。
说明: Mod算子不支持量化。
表 1 Mod参数概览
Clip¶
对张量进行最大最小值截断操作。
表 1 Clip参数概览
ReduceMax¶
对指定维度的张量进行最大值归约计算。
表 1 ReduceMax参数概览
ReduceMin¶
对指定维度的张量进行最小值归约计算。
表 1 ReduceMin参数概览
ReduceSum¶
对指定维度的张量进行求和归约计算。
表 1 ReduceSum参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
rank为1~8,axes必须为转换期常量 |
ReduceMean¶
对指定维度的张量进行均值归约计算。
表 1 ReduceMean参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
rank为1~8,axes必须为转换期常量 |
ReduceL1¶
对指定维度的张量进行L1范数归约计算。
表 1 ReduceL1参数概览
ReduceL2¶
对指定维度的张量进行L2范数归约计算。
表 1 ReduceL2参数概览
Cast¶
对输入张量进行数据类型的转换。
说明: Cast算子不支持量化。
表 1 Cast参数概览
PRelu¶
对输入张量进行参数化 PRelu 激活处理。其在输入为非负值时保持原值,在输入为负值时根据斜率参数进行线性缩放。
表 1 PRelu参数概览
说明: 在量化过程中,PReLU 算子的第二输入保留 FP32 格式,以保证负半轴计算精度。
CumSum¶
对输入张量沿指定维度进行累加求和处理,输出结果为该维度上的前缀和。
表 1 CumSum参数概览
数据类型仅支持 int32、int64;取值范围为 [-rank(input), rank(input)),当 axis 为负数时,表示从最后一个维度开始反向索引。 |
||||
ReverseSequence¶
对输入张量指定轴前N个数据进行反转。
表 1 ReverseSequence参数概览
Einsum¶
对输入张量进行简约求和,支持多输入的矩阵乘,对角,旋转,规约等操作。
说明: 详细规则请参考Einsum,不支持...操作。
表 1 Einsum参数概览
LeakyRelu¶
对输入张量做LeakyRelu激活函数运算。在输入为非负值时保持原值,在输入为负值时根据缩放系数进行线性缩放。
表 1 LeakyRelu参数概览
HardSwish¶
对输入张量做HardSwish激活函数运算。公式为:Y = X * HardSigmoid(α=1/6, β=0.5, X)
表 1 HardSwish参数概览
Swish¶
对输入张量做Swish激活函数运算。公式为:Y = X * sigmoid(alpha * X)
表 1 Swish参数概览
说明: 在ONNX Opset24以上才支持构造Swish算子,对应ONNX版本为1.19.0以上。
And¶
对两个输入张量执行逐元素“与”逻辑运算。
说明: And支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。 And算子不支持量化。
表 1 And参数概览
Equal¶
对两个输入张量执行逐元素“等于”逻辑运算。
说明: Equal支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Equal参数概览
GreaterOrEqual¶
对两个输入张量执行逐元素“大于等于”逻辑运算。
说明: GreaterOrEqual支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 GreaterOrEqual参数概览
Greater¶
对两个输入张量执行逐元素“大于”逻辑运算。
说明: Greater支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Greater参数概览
LessOrEqual¶
对两个输入张量执行逐元素“小于等于”逻辑运算。
说明: LessOrEqual支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 LessOrEqual参数概览
Less¶
对两个输入张量执行逐元素“小于”逻辑运算。
说明: Less支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Less参数概览
Not¶
逐元素返回输入张量的取反值。
说明: Not算子不支持量化。
表 1 Not参数概览
Or¶
对两个输入张量执行逐元素“或”逻辑运算。
说明: Or支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。 Or算子不支持量化。
表 1 Or参数概览
Xor¶
对两个输入张量执行逐元素“异或”逻辑运算。
说明: Xor支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。 Xor算子不支持量化。
表 1 Xor参数概览
Dropout¶
对输入张量进行 Dropout 处理。推理场景下,Dropout 等价于 Identity,输出张量与输入张量保持一致,不进行随机屏蔽和缩放处理。
表 1 Dropout参数概览
可选输入;数据类型通常为 bool。为 false 或未配置时表示推理模式,Dropout 等价于 Identity。当前端侧推理场景通常按 false 处理。 |
||||
可选输出;数据类型通常为 bool;维度与 X 一致。推理场景下通常不使用该输出,若框架保留该输出,其值不参与后续推理计算。 |
说明: 暂不支持training_mode为true,暂不支持ratio或training_mode为运行时输入。
Identity¶
对输入张量进行恒等映射处理。该算子不改变输入数据的数值、数据类型和维度信息,输出张量与输入张量保持一致。
表 1 Identity参数概览
GatherElements¶
对目标张量的某个轴进行重新取索引,索引为一个与目标张量相同大小的整型张量。
表 1 GatherElements参数概览
ReduceLogSum¶
对目标张量进行Reduce操作,Reduce操作为LogSum。
表 1 ReduceLogSum参数概览
ReduceLogSumExp¶
对目标张量进行Reduce操作,Reduce操作为LogSumExp。
表 1 GatherElements参数概览
Expand¶
对输入张量按目标形状进行扩展运算,扩展规则遵循广播机制。
表 1 Expand参数概览
Elu¶
对输入张量做Elu激活函数运算。公式为:Y= X if X >= 0 else alpha * (exp(X)-1)
表 1 Elu参数概览
DepthToSpace¶
对输入张量维度的深度(通道)维度的数据重排到空间(高、宽)维度。
表 1 DepthToSpace参数概览
SpaceToDepth¶
对输入张量空间(高、宽)维度的数据重排到深度(通道)维度。
表 1 SpaceToDepth参数概览
GRU¶
一种循环神经网络,用于捕捉输入的时序数据长期依赖关系。
说明: 仅支持float类型,暂不支持int8类型。
表 1 GRU参数概览
Gelu¶
对输入张量做Gelu激活函数运算。Gelu(Gaussian Error Linear Unit)基于正态分布累积概率,对输入乘以其概率分布的值实现连续非线性变换,相比传统激活函数在负值区域具有平滑的非零梯度。
表 1 Gelu参数概览
配置范围:只能配置为"none"或"tanh","none"使用erf精确形式计算,"tanh"使用tanh近似算法计算 |
Trilu¶
Trilu(Triangular Upper / Lower)算子用于提取输入张量的三角矩阵部分,将保留区域之外的元素全部置为零。根据配置可提取上三角矩阵或下三角矩阵;对高维张量作用在最后两个维度组成的每一个二维矩阵上,批次维度保持不变。
表 1 Trilu参数概览
Shape¶
获取输入张量的形状信息。
表 1 Shape参数概览
MatMulInteger¶
对两个量化后的整数矩阵进行乘积运算,计算 Y = (A - a_zero_point) * (B - b_zero_point)。
表 1 MatMulInteger参数概览
TopK¶
获取输入张量中沿指定维度前K个最大值,并返回其值及对应的索引。
表 1 TopK参数概览
Erf¶
对输入张量逐元素计算高斯误差函数值。
表 1 Erf参数概览
HardSigmoid¶
对输入张量做HardSigmoid激活函数运算。公式为:Y=max(0, min(1, α·X+β))
表 1 HardSigmoid参数概览
Celu¶
对输入张量做Celu激活函数运算。公式为:Y=max(0, x)+min(0, α·(exp(x/α)-1))
表 1 Celu参数概览
专题¶
Neg¶
对张量的每个元素做取负运算(符号取反),即 y = -x。
表 1 Neg参数概览
Pow¶
计算两个张量的逐元素幂运算,X 为底数张量,Y 为指数张量,输出 Z = X^Y。支持 NumPy 风格广播。
说明:
Pow 无原生属性,转换时 MSLite 内部 scale=1.0, shift=0.0 等价于标准幂运算。支持广播特性,双向广播需在转换命令中明确配置 inputDataFormat 和 outputDataFormat 参数。
推荐使用 X ≥ 0 的输入组合确保结果确定性;X < 0 且 Y 为非整数时实数域无定义,输出值取决于底层数学库。
INT8 量化仅支持 X ≥ 0 的输入,X < 0 时负数值在 int8 对称量化中将被映射为 0。
表 1 Pow参数概览
规格约束:最大维度 4D;支持 NumPy 广播;fp16/fp64/int32/int64 不支持该类型;INT8 不支持 X<0 的输入 |
||||
高效算子支持¶
HiSpark.AI工具链对部分常用嵌入式AI的算子规格进行了RISC-V专题的性能优化。在converter_lite命令行中开启riscvOpt选项,即可启用高性能模式。对性能要求较高的嵌入式AI场景中,在AI模型设计时可以优先采用以下规格。
Conv优化¶
以下规格的Onnx算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 1 Conv Onnx高效算子支持规格列表
以下规格的TFLite算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 2 Conv TFLite高效算子支持规格列表
Matmul优化¶
以下规格的Onnx算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 1 Matmul Onnx高效算子支持规格列表
以下规格的TFLite算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 2 Matmul TFLite高效算子支持规格列表
MaxPool/AveragePool优化¶
以下规格的Onnx算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 1 MaxPool / AveragePool Onnx高效算子支持规格列表
以下规格的TFLite算子在riscvOpt高性能模式下推理时间上有较大优化,算法工程师在AI模型设计时可以优先采用以下规格。
表 2 MaxPool2D / AveragePool2D TFLite高效算子支持规格列表






