NPU编译器使用*
在使用NPU编译器gxnpuc
前,请仔细阅读下面两篇技术文档:
1、gxnpuc工具链介绍*
gxnpuc用于把模型文件编译成能在 NPU
上运行的 npu
文件。
$ gxnpuc -h
usage: gxnpuc [-h] [-V] [-L] [-v] [-m] [-c CMD [CMD ...]] [-w]
[config_filename]
NPU Compiler
positional arguments:
config_filename config file
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-L, --list list supported ops
-v, --verbose verbosely list the processed ops
-m, --meminfo verbosely list memory info of ops
-c CMD [CMD ...], --cmd CMD [CMD ...]
use command line configuration
-w, --weights print compressed weights(GRUS only)
1.1 config_filename 配置文件说明*
配置项 | 选项 | 说明 |
---|---|---|
CORENAME | LEO | 芯片型号(8008/8009 填 LEO) |
PB_FILE | 包含 CKPT 的 PB 文件 | |
OUTPUT_FILE | 编译后生成的文件名 | |
NPU_UNIT | NPU32 | NPU 型号(必须填 NPU32) |
COMPRESS | true / false | 是否打开全连接权重压缩 |
COMPRESS_QUANT_BITS | 8 | 量化压缩的 bit 数, LEO NRE 芯片只支持8bit |
COMPRESS_TYPE | LINEAR / GAUSSIAN | 线性压缩还是高斯压缩,线性压缩准确率更高,但压缩率不如高斯 |
OUTPUT_TYPE | raw / c_code | Linux 环境下运行的模型选择 raw ,VSP 下运行选择 c_code |
CONV2D_COMPRESS | true / false | 是否打开卷积权重压缩(默认 false) |
INPUT_OPS | op_name: [shape] ... | 设置输入的 OP 名和 shape |
OUTPUT_OPS | [out_op_names, ...] | 设置输出的 OP 名列表 |
FP16_OUT_OPS | [out_op_names, ...] | 列表内的 OP 输出格式为 float16,不在列表内的输出 float32 |
FUSE_BN | true / false | 是否把 BN 参数合并到卷积中(默认 false) (1.5.2rc6以上) |
WEIGHT_CACHE_SIZE | 权重需要分开放 SRAM 和 FLASH 时,SRAM 能放的大小 (1.5.3rc6以上) |
2、编译模型*
2.1 编写推理模型*
- 准备TensorFlow生成的PB和CKPT文件,或saved_model方式生成的模型文件。
- 通过TensorFlow提供的
freeze_graph.py
脚本生成frozen pb文件。
2.2 编写配置文件*
- 编写yaml配置文件,包括pb文件名,输出文件名,输出文件类型,是否压缩,输入节点名和维度信息,输出节点名等。
2.3 编译生成模型文件*
编译命令如下
$ gxnpuc config.yaml
注意
NPU工具链必须在安装有TensorFlow的环境下使用。生成的模型文件格式说明请阅读:NPU模型格式说明
3.优化模型*
为了让模型更高效地运行在 NPU 处理器上,需要对模型做一些优化。
- 做卷积和降采样的数据格式需要用 NCHW 格式,优化过程可以参考这里 。
- Placeholder 的维度信息需要确定。
- 各 OP 的 shape 需要确定,即和 shape 有关的 OP value 需要确定。
- Softmax 不建议放在 NPU 中,因为 NPU 使用 FP16 数据格式,容易导致数据溢出。
4.LEO NPU 使用限制:*
- 1.只支持TensorFlow 1,建议使用TensorFlow 1.13
- 2.Conv2D,Pool,BiasAdd 等 OP 必须使用 NCHW 格式。
- 3.模型中不建议使用 Softmax
- 4.Conv2D、DepthwiseConv2d 等算子会被拆分成 32*32 的二维矩阵乘加去计算,所以建议卷积通道数不要太大,否则生成的指令很大。
- 5.其他 OP 限制可使用
gxnpuc --list -c LEO
查看。