前言¶
本文档介绍如何在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 |
支持 |
支持INT8输入/权重/输出、INT32 bias、rank为4、group为1、3x3卷积、无融合激活或融合ReLU;权重为OHWI格式,支持per-tensor或per-output-channel量化 |
FP32 |
支持 |
支持rank为4、batch为1、无bias、无融合激活、stride和dilation均为1的depthwise等价卷积;要求group=input_channel=output_channel,权重为OHWI格式且I=1 |
Conv3D¶
对5D输入进行三维卷积计算。该算子仅支持TFLite格式和RISCV Micro目标,source entry为TFLite CONV_3D,输入布局为NDHWC,权重布局为[KD, KH, KW, IC, OC]。
float32模型可通过全量化生成int8数据通路,量化后权重为int8,偏置为int32。
表 1 Conv3D参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
input |
input |
tensor (float32/int8) |
输入张量,维度为5D,格式为NDHWC。 |
支持float32模型;float32模型可通过全量化生成int8数据通路。 |
filter |
input |
tensor (float32/int8) |
权重张量,维度为5D,格式为[KD, KH, KW, IC, OC]。 |
规格约束:权重为离线常量;全量化后权重为int8。 |
bias |
input |
tensor (float32/int32) |
偏置张量,维度为1D。 |
可选输入;无bias时按0处理;全量化后偏置为int32。 |
output |
output |
tensor (float32/int8) |
输出张量,维度为5D,格式为NDHWC。 |
数据类型与执行通路一致。 |
padding |
attribute |
string |
填充类型。 |
支持SAME、VALID。SAME按out=ceil(in/stride)计算输出尺寸并推导填充。 |
stride_d |
attribute |
int32 |
filter在D方向上的移动步长。 |
支持正整数。 |
stride_h |
attribute |
int32 |
filter在H方向上的移动步长。 |
支持正整数。 |
stride_w |
attribute |
int32 |
filter在W方向上的移动步长。 |
支持正整数。 |
dilation_d_factor |
attribute |
int32 |
filter在D方向上的扩张系数。 |
规格约束:仅支持1。 |
dilation_h_factor |
attribute |
int32 |
filter在H方向上的扩张系数。 |
规格约束:仅支持1。 |
dilation_w_factor |
attribute |
int32 |
filter在W方向上的扩张系数。 |
规格约束:仅支持1。 |
fused_activation_function |
attribute |
string |
融合的激活函数类型。 |
规格约束:仅支持NONE。 |
说明: TFLite Conv3D不支持dilation factor不为1的场景,不支持fused_activation_function不为NONE的场景。原生int8/int32输入模型不作为该规格支持范围;int8通路来自float32模型的全量化转换。
关键场景分析
使用场景 |
什么时候会遇到 |
软件行为与限制 |
|---|---|---|
TFLite NDHWC卷积 |
TFLite/TF导出CONV_3D |
输入输出按NDHWC布局处理,SAME按out=ceil(in/stride)推导填充。 |
无bias两输入节点 |
CONV_3D节点仅input/filter输入 |
偏置按0处理。 |
全量化int8通路 |
float32模型 + FULL_QUANT |
转换后使用int8输入/权重/输出和int32偏置执行。 |
不支持规格命中 |
dilation factor不为1或fused_activation_function不为NONE |
转换期报错,不生成模型。 |
MaxPool2D¶
对4D输入进行最大池化计算。
表 1 MaxPool2D参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
仅支持MaxPool,输入和输出均为INT8 NHWC四维张量,且必须携带量化参数 |
FP32 |
不支持 |
- |
FullyConnected¶
对2D、3D、4D输入的最后一个维度进行特征映射(类似Onnx规格中Gemm)。
表 1 FullyConnected参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
支持INT8输入/权重/输出,rank为2,A不转置、B转置、无融合激活;可选INT32 bias,权重支持per-tensor或per-output-channel量化 |
FP32 |
支持 |
支持rank为2、2个或3个输入、A不转置、B可转置;融合激活仅支持无融合激活或ReLU,bias元素数量必须等于输出通道数 |
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,输入和输出均为INT8且必须携带量化参数 |
FP32 |
支持 |
Activation训练反向仅支持ReLU |
Tanh¶
对输入张量做Tanh激活函数运算。
表 1 Tanh参数概览
Logistic (Sigmoid)¶
对输入张量做Sigmoid激活函数运算。
表 1 Logistic参数概览
Reshape¶
改变Tensor的Shape,但不改变其排布。
表 1 Reshape参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为FP32静态非空张量 |
Mul¶
计算两个矩阵逐点相乘。
说明: Mul支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Mul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
Add¶
计算两个矩阵逐点相加。
说明: Add支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Add参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
Sub¶
计算两个矩阵逐点相减。
说明: Sub支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Sub参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
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 |
支持 |
仅支持2个输入和1个输出;输入和输出rank必须相同且非空,非axis维度一致,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 |
不支持 |
- |
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 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为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 |
支持 |
支持rank为1~8的FP32静态非空张量;要求full-rank归一化参数,不支持slice mask,stride必须为正,不支持空切片 |
DepthwiseConv2D¶
对4D输入进行深度可分离卷积计算。
表 1 DepthwiseConv2D参数概览
Transpose¶
对输入张量进行转置。
表 1 Transpose参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
perm必须是合法的int32常量全排列;输入和输出为INT8或INT32,元素数量和rank必须一致 |
FP32 |
支持 |
perm必须是合法的int32常量全排列;输入和输出为FP32静态非空张量,rank为1~19 |
ArgMax¶
在张量的指定维度上,计算并返回最大值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMax参数概览
ArgMin¶
在张量的指定维度上,计算并返回最小值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMin参数概览
Div¶
对两输入张量进行除法运算。
表 1 Div参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持广播兼容shape,rank不超过10;不支持融合激活 |
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参数概览
Maximum¶
对两个输入张量执行逐元素取最大值运算。
表 1 Maximum参数概览
Minimum¶
对两个输入张量执行逐元素取最小值运算。
表 1 Minimum参数概览
ReduceProd¶
沿指定轴计算输入张量所有元素的乘积。
表 1 ReduceProd参数概览
OneHot¶
将整数类别索引张量展开为OneHot编码张量,在axis指定的位置插入深度维。该算子与布局无关,不进行NCHW/NHWC转换。
表 1 OneHot参数概览
Unique¶
对一维输入张量进行去重。唯一值按照在输入中首次出现的顺序输出,同时输出每个输入元素在唯一值输出中的下标。
说明: Unique算子支持float32/int8,不支持量化。
表 1 Unique参数概览
GatherNd¶
根据 indices 中的多维坐标,从 params 中收集元素或切片。设索引深度为 D=indices.shape[-1] ,输出shape为 indices.shape[:-1]+params.shape[D:] ,输出数据类型与 params 一致。
该算子仅支持TFLite格式和RISCV Micro目标,source entry为TFLite GATHER_ND。支持FP32、INT32、BOOL数据通路;float32模型可通过全量化生成INT8数据通路。
说明: GatherNd无属性。indices仅用于定位数据,不参与量化;INT8通路来自float32模型的全量化转换,不支持将indices量化。
表 1 GatherNd参数概览
必须为静态形状;rank(indices)必须大于等于1且不超过16;D必须大于0且小于等于rank(params);坐标值必须大于等于0且小于params对应维度大小。 |
||||
必须为静态形状;shape为indices.shape[:-1]+params.shape[D:];输出元素数、步长和偏移量必须在有符号32位整数范围内。 |
关键场景分析
使用场景 |
什么时候会遇到 |
软件行为与限制 |
|---|---|---|
TFLite基本GatherNd |
TFLite/TF导出GATHER_ND |
按indices最后一维表示的多维坐标从params收集元素或切片。 |
收集标量元素 |
D等于rank(params) |
输出shape为indices.shape[:-1]。 |
收集尾部切片 |
D小于rank(params) |
输出shape为indices.shape[:-1]+params.shape[D:]。 |
全量化int8通路 |
float32模型 + FULL_QUANT |
params/output使用INT8通路,indices保持INT32或INT64,不参与量化。 |
不支持规格命中 |
indices为负数、越界、D大于rank(params)、shape非静态或中间计算溢出INT32 |
转换期或运行期报错,不生成有效结果。 |
ScatterND¶
根据indices中的多维坐标,将updates中的元素或切片写入由shape指定的全零输出张量。设索引深度为K=indices.shape[-1],则updates.shape必须等于indices.shape[:-1]+shape[K:]。多个相同索引对应的updates执行累加。
该算子仅支持TFLite格式和RISCV Micro目标,支持FP32和全量化INT8通路。
表 1 ScatterND参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
indices |
input |
tensor (int32) |
多维索引张量,最后一维保存索引元组。 |
必须为静态形状,rank为2~16;K必须大于0且不超过输出rank;仅支持非负索引。 |
updates |
input |
tensor (float32/int8) |
写入或累加到目标位置的元素或切片。 |
必须为静态形状,shape等于indices.shape[:-1]+shape[K:];支持FP32和全量化INT8。 |
shape |
input |
tensor (int32) |
指定输出张量形状。 |
必须是转换时可确定的常量1D张量,元素个数等于输出rank,且内容与推导出的输出形状一致。 |
output |
output |
tensor (float32/int8) |
以全零张量为初值,按indices累加updates得到的结果。 |
数据类型与updates一致,必须为静态形状,rank为1~16。 |
说明: TFLite ScatterND没有data输入,输出以0初始化;重复索引按TFLite语义累加。索引小于0或超出对应输出维度范围时运行失败。INT8通路使用per-tensor量化参数。
LogSoftmax¶
对输入张量最后一维的元素计算对数归一化概率。对于最后一维中的每个元素,计算公式为:Yi=Xi-log(Σjexp(Xj))。输出张量的形状和格式与输入相同。
说明: 受TFLite算子规格限制,LogSoftmax仅支持在最后一维上进行计算。
表 1 LogSoftmax参数概览
TransposeConv¶
TFLite的转置卷积(反卷积)算子,用于上采样,数据布局为NHWC。输出空间维按TFLite规格计算:SAME模式下o=i×s,即输出尺寸等于输入尺寸乘以步长;VALID模式下o=(i-1)×s+k,即输出尺寸等于输入尺寸减1乘以步长再加核尺寸。其中o为该维度的输出尺寸,i为该维度的输入尺寸,s为步长(上采样因子),k为卷积核在该维度的大小。
说明: 支持SAME和VALID两种padding、大于等于1的任意步长、2D空间卷积核(KH×KW,各维尺寸大于等于1,支持非方形核)以及带偏置的四输入形态;支持FP32和全量化INT8转换,权重按输出通道逐通道量化,int8模式下batch固定为1。TFLite规格本身不提供dilation、group和output_padding属性,需要这些功能时应改用ONNX格式。紧随其后的Mul(常量)会在转换期被吸收并改写权重;Relu不做融合,作为独立节点保留。
表 1 TransposeConv参数概览
规格约束:形状为[N, oH, oW, OC],NHWC排布,oH/oW按功能描述中的公式计算;支持FP32和全量化INT8转换 |
||||
ONNX算子规格参考¶
Conv¶
基于一个filter模板对3D或4D输入进行卷积计算。
表 1 Conv参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
支持INT8输入/权重/输出、INT32 bias、rank为4、group为1、3x3卷积、无融合激活或融合ReLU;权重为OHWI格式,支持per-tensor或per-output-channel量化 |
FP32 |
支持 |
支持rank为4、batch为1、无bias、无融合激活、stride和dilation均为1的depthwise等价卷积;要求group=input_channel=output_channel,权重为OHWI格式且I=1 |
Conv3D¶
基于5D权重对5D输入进行三维卷积计算。该算子仅支持ONNX格式和RISCV Micro目标,source entry为ONNX Conv;转换器按输入和权重rank自动识别为Conv3D。输入X布局为NCDHW,输出布局为NCDHW。
float32模型可通过全量化生成int8数据通路。原生int8/int32模型不作为该规格支持范围。
表 1 Conv3D参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
X |
input |
tensor (float32/int8) |
输入张量,维度为5D,格式为NCDHW。 |
支持float32模型;float32模型可通过全量化生成int8数据通路。 |
W |
input |
tensor (float32/int8) |
权重张量,维度为5D。 |
规格约束:权重必须为initializer离线常量。 |
B |
input |
tensor (float32/int32) |
偏置张量,维度为1D。 |
可选输入;偏置必须为initializer离线常量;无bias时按0处理。 |
Y |
output |
tensor (float32/int8) |
输出张量,维度为5D,格式为NCDHW。 |
数据类型与执行通路一致。 |
auto_pad |
attribute |
string |
指定padding的类型。 |
规格约束:仅支持NOTSET。 |
dilations |
attribute |
list(int) |
每个空间轴上的扩张系数。 |
规格约束:仅支持[1, 1, 1]。 |
group |
attribute |
int |
在输入输出channel上划分的分组个数。 |
规格约束:仅支持1。 |
kernel_shape |
attribute |
list(int) |
kernel沿D/H/W轴的大小。 |
缺省时按权重空间维推导。 |
pads |
attribute |
list(int) |
D/H/W三个空间轴前后填充零的个数。 |
支持对称与非对称pads;缺省为全0。 |
strides |
attribute |
list(int) |
D/H/W三个方向上kernel的移动步长。 |
支持1或2;缺省为[1, 1, 1]。 |
说明: ONNX Conv3D通过ONNX Conv的5D输入和5D权重识别,不是独立的ONNX算子名。pads按ONNX格式[D_begin, H_begin, W_begin, D_end, H_end, W_end]解析,支持逐维前后填充不同。
不支持group大于1、dilations不等于[1, 1, 1]、auto_pad不等于NOTSET的场景,命中不支持规格时转换期报错,不生成模型。
关键场景分析
使用场景 |
什么时候会遇到 |
软件行为与限制 |
|---|---|---|
ONNX基本三维卷积 |
NCDHW模型常规导出 |
按strides/pads正向卷积,输出NCDHW。 |
ONNX缺省属性 |
节点未写kernel_shape、strides或pads |
分别按权重空间维、[1, 1, 1]、全0推导。 |
ONNX非对称pads |
前后填充不同,如[2, 1, 0, 0, 1, 2] |
解析期重排为逐维前后填充,独立填充。 |
无bias两输入节点 |
Conv节点仅X/W输入 |
偏置按0处理。 |
全量化int8通路 |
float32模型 + FULL_QUANT |
转换后使用int8数据通路执行,requant按乘法量化因子q=round(acc * mult) + zp计算。 |
不支持规格命中 |
group大于1、dilations不等于[1, 1, 1]、auto_pad不等于NOTSET |
转换期报错,不生成模型。 |
MaxPool¶
对3D或4D输入进行最大池化计算。
说明: Maxpool双输出规格暂不支持。
表 1 MaxPool参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
仅支持MaxPool,输入和输出均为INT8 NHWC四维张量,且必须携带量化参数 |
FP32 |
不支持 |
- |
Gemm¶
对两个2D张量进行矩阵乘积运算。
表 1 Gemm参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
支持INT8输入/权重/输出,rank为2,A不转置、B转置、无融合激活;可选INT32 bias,权重支持per-tensor或per-output-channel量化 |
FP32 |
支持 |
支持rank为2、2个或3个输入、A不转置、B可转置;融合激活仅支持无融合激活或ReLU,bias元素数量必须等于输出通道数 |
Matmul¶
对两个2D/3D/4D张量进行矩阵乘积运算。
说明: Matmul不支持广播场景。
表 1 Matmul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
支持INT8输入/权重/输出,rank为2,A不转置、B转置、无融合激活;可选INT32 bias,权重支持per-tensor或per-output-channel量化 |
FP32 |
支持 |
支持rank为2、2个或3个输入、A不转置、B可转置;融合激活仅支持无融合激活或ReLU,bias元素数量必须等于输出通道数 |
Softmax¶
计算指定维度的归一化Softmax概率分布。
说明: 当Softmax维度较大时,int8量化损失较大,推荐使用fp32模式的算子,关闭cfg中的enable_all_ops选项(仅保留矩阵运算类算子的量化)。
表 1 Softmax参数概览
Relu¶
对输入张量做Relu激活函数运算。
表 1 Relu参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
Activation训练反向仅支持ReLU,输入和输出均为INT8且必须携带量化参数 |
FP32 |
支持 |
Activation训练反向仅支持ReLU |
Tan¶
对输入张量中的每个元素计算正切函数。输入数据按弧度解释,输出张量的Shape与输入张量相同。
正切函数公式为:tan(x) = sin(x) / cos(x),其中 cos(x) 不等于 0。
正切函数的极点位于 x = π/2 + kπ(k 为整数)。在极点处正切函数没有有限值,接近极点时输出变化剧烈,数值误差会被显著放大。
表 1 Tan参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
x |
input |
tensor |
输入张量,维度不限制,输入值按弧度解释。 |
FP32;全量化推理时为INT8,并且必须携带量化参数。 |
y |
output |
tensor |
输出张量,Shape与输入相同,逐元素保存正切计算结果。 |
FP32输出为FP32;全量化推理时为INT8,重新量化后可能饱和到[-128, 127]。 |
推理支持规格
推理模式 |
支持情况 |
规格约束 |
|---|---|---|
FP32 |
支持 |
单输入、单输出,逐元素计算,输入和输出Shape一致;输入按弧度解释。 |
全量化 INT8 |
支持 |
输入范围应受控并远离所有极点,极点附近不保证高精度。 |
限制说明
Tan不包含可配置属性,仅支持单输入和单输出。
当前实现不支持FP16、FP64和BF16数据类型。
极点位置为 π/2 + kπ 。由于 tan'(x) = 1 / cos²(x) ,输入越接近极点,微小的输入误差越可能造成很大的输出误差。
在全量化INT8路径中,输入量化误差可能将值推向或跨过极点,输出重新量化还可能发生饱和。因此,要求极点附近精度或输入范围未知时,建议使用FP32;INT8仅适合明确远离极点的受控输入范围。
Tanh¶
对输入张量做Tanh激活函数运算。
表 1 Tanh参数概览
Sigmoid¶
对输入张量做Sigmoid激活函数运算。
表 1 Sigmoid参数概览
Reshape¶
改变Tensor的Shape,但不改变其排布。
表 1 Reshape参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为FP32静态非空张量 |
Mul¶
计算两个矩阵逐点相乘。
说明: Mul支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Mul参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
Add¶
计算两个矩阵逐点相加。
说明: Add支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Add参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
Sub¶
计算两个矩阵逐点相减。
说明: Sub支持广播特性。双向广播需要在转换命令中明确配置inputDataFormat和outputDataFormat参数。
表 1 Sub参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
不支持广播,两个输入和输出的shape必须完全一致;融合激活仅支持无融合激活或ReLU |
Gather¶
根据指定索引,从输入张量的指定轴上提取元素,组合成新张量。
表 1 Gather参数概览
Split¶
对张量分割按照某一轴平均或非平均切分成若干份。
表 1 Split参数概览
Concat¶
将多个张量拼接成某一个张量。
表 1 Concat参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
仅支持2个输入和1个输出;输入和输出rank必须相同且非空,非axis维度一致,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 |
支持 |
仅支持CONSTANT模式;rank为1~6,要求normalized paddings、非负padding和正静态shape,输出shape必须等于输入shape加padding |
Resize¶
对输入张量按照指定填充模式做缩放。
表 1 Resize参数概览
规格约束:离线常量,NC轴保持1.0。fp32仅支持out_dim为整数,int8不支持配置,scales为离线常量,与sizes必须配置且仅配置一个 |
||||
Squeeze¶
对输入张量进行shape压缩操作,被压缩维度的dim值必须为1。
表 1 Squeeze参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为FP32静态非空张量 |
Unsqueeze¶
对多维Tensor进行shape扩展。
表 1 Unsqueeze参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为FP32静态非空张量 |
Flatten¶
对多维Tensor进行维度展平。
表 1 Flatten参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
输入和输出元素数量必须一致,且输入和输出为INT8或INT32 |
FP32 |
支持 |
输入和输出元素数量必须一致,且为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 |
支持 |
支持rank为1~8的FP32静态非空张量;要求full-rank归一化参数,不支持slice mask,step必须为正,不支持空切片 |
GlobalMaxPool¶
对输入张量除通道轴以外进行最大池化操作。
表 1 GlobalMaxpool参数概览
GlobalAveragePool¶
对输入张量除通道轴以外进行平均池化操作。
表 1 GlobalAveragePool参数概览
Transpose¶
对输入张量进行转置。
表 1 Transpose参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
支持 |
perm必须是合法的int32常量全排列;输入和输出为INT8或INT32,元素数量和rank必须一致 |
FP32 |
支持 |
perm必须是合法的int32常量全排列;输入和输出为FP32静态非空张量,rank为1~19 |
ArgMax¶
在张量的指定维度上,计算并返回最大值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMax参数概览
ArgMin¶
在张量的指定维度上,计算并返回最小值对应的位置索引。
说明: 仅支持float类型,不支持int8类型。
表 1 ArgMin参数概览
Div¶
对两输入张量进行除法运算。
表 1 Div参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持广播兼容shape,rank不超过10;不支持融合激活 |
Mod¶
对两输入张量进行取模运算。
说明: Mod算子不支持量化。
表 1 Mod参数概览
BitShift¶
BitShift以X作为被移位数据、Y作为移位位数,逐元素执行无符号整数左移或右移运算,位移方向由direction属性指定。支持转换ONNX Opset 18及以上版本中的BitShift算子。
说明: BitShift算子不支持量化,按uint8、uint16、uint32或uint64数据类型执行位移运算。
表 1 BitShift参数概览
必须为静态shape,rank小于16,数据类型必须与X一致。shape必须与X满足多方向广播规则。移位位数大于或等于数据类型位宽时,对应输出为0。 |
||||
Clip¶
对张量进行最大最小值截断操作。
表 1 Clip参数概览
ReduceMax¶
对指定维度的张量进行最大值归约计算。
表 1 ReduceMax参数概览
ReduceMin¶
对指定维度的张量进行最小值归约计算。
表 1 ReduceMin参数概览
ReduceSum¶
对指定维度的张量进行求和归约计算。
表 1 ReduceSum参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持rank为1~8的FP32静态非空张量;axes必须为int32常量,允许为空表示全维归约,axes必须合法且唯一,输出shape必须匹配keep_dims |
ReduceSumSquare¶
ReduceSumSquare先对data中的元素逐元素平方,再沿axes指定的维度执行求和归约。支持转换ONNX Opset 18及以上版本中的ReduceSumSquare算子。
说明: ReduceSumSquare算子支持非量化FP32推理和全量化INT8推理。
表 1 ReduceSumSquare参数概览
可选的第二个输入,必须为一维离线常量,各轴不能重复。支持单轴、多轴和负轴,每个元素的取值范围为[-rank(data), rank(data))。负轴表示从末维开始计数;缺省或为空时的行为由noop_with_empty_axes确定。 |
||||
ReduceMean¶
对指定维度的张量进行均值归约计算。
表 1 ReduceMean参数概览
训练支持规格
训练模式 |
支持情况 |
规格约束 |
|---|---|---|
QAS INT8 |
不支持 |
- |
FP32 |
支持 |
支持rank为1~8的FP32静态非空张量;axes必须为int32常量,允许为空表示全维归约,axes必须合法且唯一,输出shape必须匹配keep_dims |
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参数概览
QLinearMatMul¶
对两个INT8量化张量执行矩阵乘法,并使用输出量化参数将INT32累加结果重新量化为INT8输出。计算过程如下:
acc = Σ((a - a_zero_point) × (b - b_zero_point))
y = saturate(round_to_nearest_even(acc × a_scale × b_scale / y_scale) + y_zero_point)
该算子仅支持ONNX格式和RISCV Micro目标,支持ONNX Opset 10及以上版本。转换时复用MatMulFusion算子及其INT8 Micro实现。
表 1 QLinearMatMul参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
a |
input |
tensor (int8) |
左输入量化张量。 |
仅支持INT8和2D/3D/4D静态形状。 |
a_scale |
input |
tensor (float32) |
输入a的量化缩放因子。 |
必须是有限正数和常量标量,仅支持per-tensor量化。 |
a_zero_point |
input |
tensor (int8) |
输入a的量化零点。 |
必须是常量标量。 |
b |
input |
tensor (int8) |
右输入量化张量。 |
仅支持INT8和2D/3D/4D静态形状;倒数第二维必须与a的最后一维匹配,不支持批次维广播。 |
b_scale |
input |
tensor (float32) |
输入b的量化缩放因子。 |
必须是有限正数常量;支持标量per-tensor量化,或长度等于b最后一维的1D per-column量化。 |
b_zero_point |
input |
tensor (int8) |
输入b的量化零点。 |
必须为常量,形状与b_scale一致。 |
y_scale |
input |
tensor (float32) |
输出y的量化缩放因子。 |
必须是有限正数和常量标量,仅支持per-tensor量化。 |
y_zero_point |
input |
tensor (int8) |
输出y的量化零点。 |
必须是常量标量。 |
y |
output |
tensor (int8) |
重新量化后的矩阵乘法结果。 |
仅支持INT8和2D/3D/4D静态形状。 |
说明: a、b和y仅支持INT8,不支持UINT8。所有scale和zero point必须在模型转换时可确定,且每组scale和zero point的元素个数必须一致。输入a和输出y仅支持per-tensor量化;输入b支持per-tensor或按输出列per-column量化。
当模型使用QuantizeLinear和DequantizeLinear作为浮点网络与QLinearMatMul之间的边界时,边界算子仅支持常量标量float32 scale和常量标量int8 zero point,转换后分别作为FP32到INT8、INT8到FP32的QuantDTypeCast执行。
QLinearMatMul源图已经包含量化参数,转换时不能再次启用全量化,否则转换器会按重复量化处理并终止转换。
GatherND¶
根据indices中的多维坐标,从data中收集元素或切片。设索引深度为D=indices.shape[-1],输出shape为indices.shape[:-1]+data.shape[D:],输出数据类型与data一致。
该算子仅支持ONNX格式和RISCV Micro目标,source entry为ONNX GatherND,转换后映射为GatherNd。支持FP32、INT32、BOOL数据通路;float32模型可通过全量化生成INT8数据通路。
表 1 GatherND参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
data |
input |
tensor (float32/int32/bool/int8) |
被收集元素或切片的数据张量。 |
必须为静态形状,rank不超过16;float32模型支持非量化和全量化INT8通路。 |
indices |
input |
tensor (int32/int64) |
多维索引张量,最后一维保存索引元组。 |
必须为静态形状;rank(indices)必须大于等于1且不超过16;D必须大于0且小于等于rank(data);坐标值必须大于等于0且小于data对应维度大小。 |
output |
output |
tensor |
按索引元组收集得到的元素或切片,数据类型与data一致。 |
必须为静态形状;shape为indices.shape[:-1]+data.shape[D:];输出元素数、步长和偏移量必须在有符号32位整数范围内。 |
说明: GatherND无属性。indices仅用于定位数据,不参与量化;INT8通路来自float32模型的全量化转换,不支持将indices量化。
关键场景分析
使用场景 |
什么时候会遇到 |
软件行为与限制 |
|---|---|---|
ONNX基本GatherND |
ONNX模型导出GatherND |
按indices最后一维表示的多维坐标从data收集元素或切片。 |
收集标量元素 |
D等于rank(data) |
输出shape为indices.shape[:-1]。 |
收集尾部切片 |
D小于rank(data) |
输出shape为indices.shape[:-1]+data.shape[D:]。 |
全量化int8通路 |
float32模型 + FULL_QUANT |
data/output使用INT8通路,indices保持INT32或INT64,不参与量化。 |
不支持规格命中 |
indices为负数、越界、D大于rank(data)、shape非静态或中间计算溢出INT32 |
转换期或运行期报错,不生成有效结果。 |
Scatter¶
先复制data得到输出,再沿axis使用indices指定的位置,以updates中的对应值进行覆盖。该算子转换后复用ScatterElements及其Micro实现。
该算子仅支持ONNX格式和RISCV Micro目标,适用于ONNX Opset 9和10;ONNX从Opset 11起已废弃Scatter,建议新模型使用ScatterElements。支持FP32和全量化INT8通路。
表 1 Scatter参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
data |
input |
tensor (float32/int8) |
提供输出初值的数据张量。 |
必须为静态形状,rank为1~16;支持FP32和全量化INT8。 |
indices |
input |
tensor (int32/int64) |
指定axis维上的目标位置。 |
必须与data具有相同rank,并与updates形状完全一致;索引范围为[-data.shape[axis], data.shape[axis]-1]。 |
updates |
input |
tensor (float32/int8) |
覆盖目标位置的新值。 |
数据类型通路与data一致,形状必须与indices一致;除axis外,各维大小不能超过data对应维度。 |
axis |
attribute |
int |
指定执行离散更新的维度。 |
默认0,范围为[-rank(data), rank(data)-1]。 |
output |
output |
tensor (float32/int8) |
完成覆盖更新后的结果。 |
形状与data一致。 |
说明: Scatter仅支持覆盖语义。负索引按对应维度从尾部计数;索引越界时运行失败。相同输出位置不应出现重复索引,否则最终覆盖值依赖更新顺序。
ScatterElements¶
先复制data得到输出,再逐元素读取indices,在axis维替换当前坐标,并使用updates中的对应元素覆盖该输出位置。
该算子仅支持ONNX格式和RISCV Micro目标,支持ONNX Opset 11及以上版本,支持FP32和全量化INT8通路。
表 1 ScatterElements参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
data |
input |
tensor (float32/int8) |
提供输出初值的数据张量。 |
必须为静态形状,rank为1~16;支持FP32和全量化INT8。 |
indices |
input |
tensor (int32/int64) |
逐元素指定axis维上的目标位置。 |
必须与data具有相同rank,并与updates形状完全一致;索引范围为[-data.shape[axis], data.shape[axis]-1]。 |
updates |
input |
tensor (float32/int8) |
覆盖目标位置的新值。 |
数据类型通路与data一致,形状必须与indices一致;除axis外,各维大小不能超过data对应维度。 |
axis |
attribute |
int |
指定执行离散更新的维度。 |
默认0,范围为[-rank(data), rank(data)-1]。 |
reduction |
attribute |
string |
指定重复位置的归约方式。 |
仅支持none;不支持add、mul、max和min。 |
output |
output |
tensor (float32/int8) |
完成覆盖更新后的结果。 |
形状与data一致。 |
说明: ScatterElements仅支持reduction=none。负索引按对应维度从尾部计数;索引越界时运行失败。reduction=none时相同输出位置不应出现重复索引。
ScatterND¶
先复制data得到输出,再将indices最后一维表示的K维坐标作为目标位置,使用updates覆盖对应元素或完整尾部切片。updates.shape必须等于indices.shape[:-1]+data.shape[K:]。
该算子仅支持ONNX格式和RISCV Micro目标,支持ONNX Opset 11及以上版本,支持FP32和全量化INT8通路。转换时映射为ScatterNdUpdate及其Micro实现。
表 1 ScatterND参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
data |
input |
tensor (float32/int8) |
提供输出初值的数据张量。 |
必须为静态形状,rank为1~16;支持FP32和全量化INT8。 |
indices |
input |
tensor (int32/int64) |
多维索引张量,最后一维保存K维坐标元组。 |
必须为静态形状,rank为1~16;K必须大于0且不超过data的rank;每维索引范围为[-data.shape[i], data.shape[i]-1]。 |
updates |
input |
tensor (float32/int8) |
覆盖目标元素或尾部切片的新值。 |
数据类型通路与data一致,必须为静态形状,shape等于indices.shape[:-1]+data.shape[K:]。 |
reduction |
attribute |
string |
指定重复位置的归约方式。 |
仅支持none;不支持add、mul、max和min。 |
output |
output |
tensor (float32/int8) |
完成覆盖更新后的结果。 |
形状与data一致。 |
说明: ONNX ScatterND包含data、indices和updates三个输入,与TFLite ScatterND的indices、updates、shape输入形式不同。负索引按对应维度从尾部计数;索引越界时运行失败。reduction=none时不应使用重复索引。INT8通路仅支持per-tensor量化。
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参数概览
Selu¶
对输入张量逐元素执行缩放指数线性激活。计算公式如下:
y = gamma × x, x > 0
y = gamma × alpha × (exp(x) - 1), x <= 0
该算子仅支持ONNX格式,转换时复用Activation算子。支持FP32和全量化INT8通路;INT8通路使用256项查找表执行。
表 1 Selu参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
X |
input |
tensor (float32/int8) |
待执行Selu激活的输入张量。 |
逐元素计算;支持FP32和全量化INT8通路。 |
alpha |
attribute |
float |
控制负值区间的指数缩放。 |
可选,默认值为1.6732631921768188。 |
gamma |
attribute |
float |
控制整体输出缩放。 |
可选,默认值为1.0507009873554805。 |
Y |
output |
tensor (float32/int8) |
Selu激活结果。 |
数据类型和形状与对应执行通路的输入一致。 |
说明: 全量化INT8通路使用per-tensor输入和输出量化参数,在模型转换阶段生成覆盖全部INT8输入值的查找表。
Max¶
对输入的多个张量在对应位置取最大值。
表 1 Max参数概览
Min¶
对输入的多个张量在对应位置取最小值。
表 1 Min参数概览
Sum¶
对输入的多个张量在对应位置逐元素求和。
表 1 Sum参数概览
Constant¶
静态常量生成算子,输出一个由属性指定的常量张量,其值和形状在模型定义时确定,推理时不发生变化。该算子无输入,仅有一个输出,通过属性指定常量值。仅有ONNX规格。
表 1 Constant参数概览
说明: 必须且只能指定以上属性(value/value_float/value_floats/value_int/value_ints)中的一个来定义常量值。
ConstantOfShape¶
常量填充算子,根据输入张量指定的目标形状,生成一个所有元素值均相同的常量张量。仅有ONNX规格。
表 1 ConstantOfShape参数概览
ReduceProd¶
沿指定轴计算输入张量所有元素的乘积。
表 1 ReduceProd参数概览
Hardmax¶
沿指定维度选取第一个最大值所在位置,输出与输入同形状的one-hot张量:第一个最大值位置为1,其余位置为0。
说明: Hardmax算子不支持量化。
表 1 Hardmax参数概览
Where¶
根据条件张量从两个输入张量中逐元素选择输出:条件为true时取X中对应元素,否则取Y中对应元素;condition、X、Y支持广播。
表 1 Where参数概览
ConvInteger¶
对量化后的整数输入张量和卷积核执行卷积运算,计算 Y = (X - x_zero_point) * (W - w_zero_point),输出int32类型的整数累加结果。
表 1 ConvInteger参数概览
配置范围:NOTSET、VALID、SAME_UPPER、SAME_LOWER;默认NOTSET;非NOTSET时不支持同时配置pads |
||||
规格约束:包含4个非负元素[top, left, bottom, right],仅在auto_pad为NOTSET时生效;默认[0, 0, 0, 0] |
||||
QLinearConv¶
对INT8量化输入和INT8量化权重执行二维卷积,并使用输出量化参数将INT32累加结果重新量化为INT8输出。计算过程如下:
acc = Σ((x - x_zero_point) × (w - w_zero_point)) + B
y = saturate(round_to_nearest_even(acc × x_scale × w_scale / y_scale) + y_zero_point)
该算子仅支持ONNX格式和RISCV Micro目标,支持ONNX Opset 10及以上版本。转换时复用Conv2DFusion算子及其INT8 Micro实现。
表 1 QLinearConv参数概览
参数名 |
参数/输入输出 |
数据类型 |
参数含义 |
配置范围及规格约束说明 |
|---|---|---|---|---|
x |
input |
tensor (int8) |
量化输入张量,格式为NCHW。 |
仅支持INT8和4D二维卷积输入。 |
x_scale |
input |
tensor (float32) |
输入x的量化缩放因子。 |
必须是有限正数和常量标量,仅支持per-tensor量化。 |
x_zero_point |
input |
tensor (int8) |
输入x的量化零点。 |
必须是常量标量。 |
w |
input |
tensor (int8) |
量化卷积权重。 |
必须是常量4D张量,形状为[M, C, kH, kW];M为输出通道数。 |
w_scale |
input |
tensor (float32) |
权重w的量化缩放因子。 |
必须是有限正数常量;支持标量per-tensor量化,或长度等于M的1D per-output-channel量化。 |
w_zero_point |
input |
tensor (int8) |
权重w的量化零点。 |
必须为常量,形状与w_scale一致。 |
y_scale |
input |
tensor (float32) |
输出y的量化缩放因子。 |
必须是有限正数和常量标量,仅支持per-tensor量化。 |
y_zero_point |
input |
tensor (int8) |
输出y的量化零点。 |
必须是常量标量。 |
B |
input |
tensor (int32) |
可选偏置。 |
必须是常量1D张量,元素个数等于M;省略时按全0偏置处理。偏置scale为x_scale与对应w_scale的乘积,zero point为0。 |
y |
output |
tensor (int8) |
重新量化后的卷积结果,格式为NCHW。 |
仅支持INT8和4D输出。 |
auto_pad |
attribute |
string |
指定padding类型。 |
仅支持NOTSET。 |
dilations |
attribute |
list(int) |
卷积核在两个空间轴上的扩张系数。 |
包含2个元素,每个元素大于等于1;默认[1, 1]。 |
group |
attribute |
int |
输入和输出通道的分组数。 |
仅支持1。 |
kernel_shape |
attribute |
list(int) |
卷积核的空间尺寸。 |
包含2个元素,配置时必须与w的[kH, kW]一致;默认从w推导。 |
pads |
attribute |
list(int) |
输入空间维度各轴前后的填充量。 |
包含4个非负元素[top, left, bottom, right];仅在auto_pad为NOTSET时生效,默认[0, 0, 0, 0]。 |
strides |
attribute |
list(int) |
卷积核在两个空间轴上的移动步长。 |
包含2个元素,每个元素大于等于1;默认[1, 1]。 |
说明: x、w和y仅支持INT8,不支持UINT8。所有scale和zero point必须在模型转换时可确定,且每组scale和zero point的元素个数必须一致。输入x和输出y仅支持per-tensor量化;权重w支持per-tensor或按输出通道per-output-channel量化。
当模型使用QuantizeLinear和DequantizeLinear作为浮点网络与QLinearConv之间的边界时,边界算子仅支持常量标量float32 scale和常量标量int8 zero point,转换后分别作为FP32到INT8、INT8到FP32的QuantDTypeCast执行。
QLinearConv源图已经包含量化参数,转换时不能再次启用全量化,否则转换器会按重复量化处理并终止转换。
OneHot¶
将整数类别索引张量展开为OneHot编码张量,在axis指定的位置插入深度维。该算子与布局无关,不进行NCHW/NHWC转换。
表 1 OneHot参数概览
ThresholdedRelu¶
对输入张量逐元素执行阈值过滤。当输入值严格大于alpha时保留原值,否则输出0;输入值等于alpha时输出0。该算子与布局无关,输出形状和格式与输入一致。
表 1 ThresholdedRelu参数概览
规格约束:维度为1D/2D/3D/4D;源模型仅支持float32,全量化通路为int8;不支持float16、float64、bfloat16 |
||||
Unique¶
对输入张量进行去重。省略axis时按行主序展平输入并比较标量元素;配置axis时沿指定轴比较完整子张量。
说明: Unique算子支持float32/int8,不支持量化。
表 1 Unique参数概览
规格约束:维度为1D/2D/3D/4D且形状必须静态,不支持动态秩、动态轴和逐通道量化;float64、int64源模型分别归一化为float32、int32运行 |
||||
展平模式输出为1D;axis模式保持输入秩及非轴维度,所选轴收缩为唯一个数;变长输出,必须作为图的终端输出;全量化时继承X的量化参数 |
||||
Softsign¶
对输入张量逐元素执行Softsign激活函数运算。公式为:Y=X/(1+|X|)。输出与输入形状相同,输出值范围为(-1, 1)。
表 1 Softsign参数概览
Softplus¶
对输入张量逐元素执行Softplus激活函数运算。公式为:Y=ln(exp(X)+1)。输出与输入形状相同。
表 1 Softplus参数概览
LogSoftmax¶
沿axis指定的维度计算输入张量的对数归一化概率。对于该维度中的每个元素,计算公式为:Yi=Xi-log(Σjexp(Xj))。输出张量的形状和格式与输入相同。
表 1 LogSoftmax参数概览
ConvTranspose¶
转置卷积(反卷积)算子,用于上采样。输出空间维按ONNX规格公式计算:output_shape[i]=stride[i]×(input_size[i]-1)+output_padding[i]+((kernel_shape[i]-1)×dilations[i]+1)-pads[start_i]-pads[end_i]。
说明: 支持group=1的标准反卷积,包括任意对称或非对称pads、步长 ≥ 1、膨胀 ≥ 1、auto_pad、output_padding以及可选偏置;支持FP32和全量化INT8转换,权重按输出通道逐通道量化。不支持output_shape属性、group大于1、int8模式下batch大于1以及非4D输入。
表 1 ConvTranspose参数概览
规格约束:形状为[N, C_out, oH, oW],oH/oW按功能描述中的公式计算;支持FP32和全量化INT8转换 |
||||
配置范围:NOTSET、VALID、SAME_UPPER、SAME_LOWER;默认NOTSET;非NOTSET时不支持同时配置pads |
||||
规格约束:包含4个非负元素[top, left, bottom, right],支持任意对称或非对称补边;默认[0, 0, 0, 0] |
||||
RNN¶
循环神经网络算子,计算一层简单循环网络,对时间步t逐拍更新隐状态并输出:Ht=activation(Xt·WT+Ht-1·RT+Wb+Rb)。其中Xt为当前时间步输入,W为输入权重,R为循环权重,Wb/Rb为对应偏置(可省略,缺省为零);clip属性存在时在激活之前把括号内求和值裁剪到[-clip, +clip]。每个方向维护独立的权重与隐状态。
说明: 模型数据类型仅支持float32,部署路径为FP32与全量化INT8。x86平台的benchmark验证仅支持FP32,不支持INT8量化。必须同时输出Y与Y_h。仅支持layout=0(时间步在前的布局),layout=1(批在前的布局)不支持。TFLite无对应builtin算子,不支持转换。
表 1 RNN参数概览
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高效算子支持规格列表






