跳转至

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 查看。