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 |