K230 nncase开发指南
1. 概述
1.1 什么是nncase
nncase是一个为 AI 加速器设计的神经网络编译器, 目前支持的 target有cpu/K210/K510/K230等.
nncase提供的功能
- 支持多输入多输出网络,支持多分支结构
- 静态内存分配,不需要堆内存
- 算子合并和优化
- 支持 float 和uint8/int8量化推理
- 支持训练后量化,使用浮点模型和量化校准集
- 平坦模型,支持零拷贝加载
nncase支持的神经网络模型格式
- tflite
- onnx
1.2 nncase架构
nncase软件栈包括compiler和runtime两部分。
Compiler: 用于在PC上编译神经网络模型,最终生成kmodel文件。主要包括importer, IR, Evaluator, Quantize, Transform优化, Tiling, Partition, Schedule, Codegen等模块。
- Importer: 将其它神经网络框架的模型导入到nncase中
- IR: 中间表示, 分为importer导入的Neutral IR(设备无关)和Neutral IR经lowering转换生成的Target IR(设备相关)
- Evaluator: Evaluator提供IR的解释执行能力,常被用于Constant Folding/PTQ Calibration等场景
- Transform: 用于IR转换和图的遍历优化等
- Quantize: 训练后量化, 对要量化的tensor加入量化标记, 根据输入的校正集, 调用 Evaluator进行解释执行, 收集tensor的数据范围, 插入量化/反量化结点, 最后优化消除不必要的量化/反量化结点等
- Tiling: 受限于NPU较低的存储器容量,需要将大块计算进行拆 分. 另外, 计算存在大量数据复用时选择Tiling参数会对时延和带宽产生影响
- Partition: 将图按ModuleType进行切分, 切分后的每个子图会对应RuntimeModule, 不同类型的RuntimeModule对应不同的Device(cpu/K230)
- Schedule: 根据优化后图中的数据依赖关系生成计算顺序并分配Buffer
- Codegen: 对每个子图分别调用ModuleType对应的codegen,生成RuntimeModule
Runtime: 集成于用户App, 提供加载kmodel/设置输入数据/KPU执行/获取输出数据等功能.
1.3 开发环境
1.3.1 操作系统
支持的操作系统包括Ubuntu 18.04/Ubuntu 20.04
1.3.2 软件环境
序号 | 软件 | 版本号 |
---|---|---|
1 | python | 3.6/3.7/3.8/3.9/3.10 |
2 | pip | >=20.3 |
3 | numpy | 1.19.5 |
4 | onnx | 1.9.0 |
5 | onnx-simplifier | 0.3.6 |
6 | Onnxoptimizer | 0.2.6 |
7 | Onnxruntime | 1.8.0 |
8 | dotnet-runtime | 7.0 |
1.3.3 硬件环境
K230 evb
2. 编译模型APIs(Python)
nncase提供了Python APIs, 用于在PC上编译神经网络模型
2.1 支持的算子
2.1.1 tflite算子
Operator | Is Supported |
---|---|
ABS | Yes |
ADD | Yes |
ARG_MAX | Yes |
ARG_MIN | Yes |
AVERAGE_POOL_2D | Yes |
BATCH_MATMUL | Yes |
CAST | Yes |
CEIL | Yes |
CONCATENATION | Yes |
CONV_2D | Yes |
COS | Yes |
CUSTOM | Yes |
DEPTHWISE_CONV_2D | Yes |
DIV | Yes |
EQUAL | Yes |
EXP | Yes |
EXPAND_DIMS | Yes |
FLOOR | Yes |
FLOOR_DIV | Yes |
FLOOR_MOD | Yes |
FULLY_CONNECTED | Yes |
GREATER | Yes |
GREATER_EQUAL | Yes |
L2_NORMALIZATION | Yes |
LEAKY_RELU | Yes |
LESS | Yes |
LESS_EQUAL | Yes |
LOG | Yes |
LOGISTIC | Yes |
MAX_POOL_2D | Yes |
MAXIMUM | Yes |
MEAN | Yes |
MINIMUM | Yes |
MUL | Yes |
NEG | Yes |
NOT_EQUAL | Yes |
PAD | Yes |
PADV2 | Yes |
MIRROR_PAD | Yes |
PACK | Yes |
POW | Yes |
REDUCE_MAX | Yes |
REDUCE_MIN | Yes |
REDUCE_PROD | Yes |
RELU | Yes |
PRELU | Yes |
RELU6 | Yes |
RESHAPE | Yes |
RESIZE_BILINEAR | Yes |
RESIZE_NEAREST_NEIGHBOR | Yes |
ROUND | Yes |
RSQRT | Yes |
SHAPE | Yes |
SIN | Yes |
SLICE | Yes |
SOFTMAX | Yes |
SPACE_TO_BATCH_ND | Yes |
SQUEEZE | Yes |
BATCH_TO_SPACE_ND | Yes |
STRIDED_SLICE | Yes |
SQRT | Yes |
SQUARE | Yes |
SUB | Yes |
SUM | Yes |
TANH | Yes |
TILE | Yes |
TRANSPOSE | Yes |
TRANSPOSE_CONV | Yes |
QUANTIZE | Yes |
FAKE_QUANT | Yes |
DEQUANTIZE | Yes |
GATHER | Yes |
GATHER_ND | Yes |
ONE_HOT | Yes |
SQUARED_DIFFERENCE | Yes |
LOG_SOFTMAX | Yes |
SPLIT | Yes |
HARD_SWISH | Yes |