TPU-MLIR实战——ResNet18部署

1.编译ONNX模型

本章以 resnet18.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。

该模型来自onnx的官网:

models/vision/classification/resnet/model/resnet18-v1-7.onnx at main · onnx/models · GitHub

本例模型和代码在 http://219.142.246.77:65000//sharing/hddTi2adl

下载到本地 model_resnet18.tar.gz,并解压:

  tar zxvf resnet18_classify.tar.gz

model_resnet18目录中包含以下文件:

  • model/resnet18.onnx resnet18原始模型
  • images/ 测试图片集
  • ILSVRC2012/ 量化用数据
  • outputs 输出结果位置
  • Workspace 编译量化结果存放位置
  • calssify_resnet18.py 推理程序

2.加载TPU-MLIR

以下操作需要在Docker容器中。关于Docker的使用, 请参考 启动Docker Container

$ tar zxf tpu-mlir_xxxx.tar.gz
$ source tpu-mlir_xxxx/envsetup.sh

envsetup.sh 对环境变量的修改内容为:

export PATH=${TPUC_ROOT}/bin:$PATH
export PATH=${TPUC_ROOT}/python/tools:$PATH
export PATH=${TPUC_ROOT}/python/utils:$PATH
export PATH=${TPUC_ROOT}/python/test:$PATH
export PATH=${TPUC_ROOT}/python/samples:$PATH
export LD_LIBRARY_PATH=$TPUC_ROOT/lib:$LD_LIBRARY_PATH
export PYTHONPATH=${TPUC_ROOT}/python:$PYTHONPATH
export MODEL_ZOO_PATH=${TPUC_ROOT}/../model-zoo

3  准备工作目录

建立 model_resnet18目录, 注意是与tpu-mlir同级目录; 并把模型文件和图片文件都 放入 model_resnet18 目录中。操作如下:

$ mkdir model_resnet18 && cd model_resnet18
$ cp -rf $TPUC_ROOT/python/samples/classify_resnet18.py .
$ mkdir workspace && cd workspace
$ mkdir outputs

4 ONNX转MLIR

模型转换命令如下:

$ model_transform.py \    
	--model_name resnet18 \    
	--model_def ../model/resnet18.onnx \    
	--input_shapes [[1,3,224,224]] \    
	--mean 0.0,0.0,0.0 \    
	--scale 0.0039216,0.0039216,0.0039216 \    
	--keep_aspect_ratio \    
	--pixel_format rgb \    
	--output_names output \    
	--test_input ../images/dog.jpg \    
	--test_result resnet18_top_outputs.npz \	
	--mlir resnet18.mlir \ 

转成mlir文件后, 会生成一个 ${ model_name}_in_f32.npz 文件, 该文件是模型的输入文件。

model_transform.py参数表

参数名

必选?

说明

model_name

指定模型名称

model_def

指定模型定义文件, 比如`.onnx``.tflite``.prototxt`文件

input_shapes

指定输入的shape, 例如[[1,3,640,640]]; 二维数组, 可以支

持多输入情况

resize_dims

原始图片需要resize之后的尺寸; 如果不指定, resize成模

型的输入尺寸

keep_aspect_ratio

Resize时是否保持长宽比, 默认为false; 设置时会对不足

部分补0

mean

图像每个通道的均值, 默认为0.0,0.0,0.0

scale

图片每个通道的比值, 默认为1.0,1.0,1.0

pixel_format

图片类型, 可以是rgbbgrgrayrgbd四种情况

output_names

指定输出的名称, 如果不指定, 则用模型的输出; 指定后用

该指定名称做输出

test_input

指定输入文件用于验证, 可以是图片或npynpz; 可以不

指定, 则不会正确性验证

test_result

指定验证后的输出文件

excepts

指定需要排除验证的网络层的名称, 多个用,隔开

mlir

指定输出的mlir文件名称和路径

post_handle_type

将后处理融合到模型中,指定后处理类型, 比如yolo

ssd

5 MLIR转F32模型 

mlir文件转换成f32bmodel, 操作方法如下

$ model_deploy.py \    
	--mlir resnet18.mlir \   
	--quantize F32 \   
 	--chip bm1684x \    
	--test_input resnet18_in_f32.npz \    
	--test_reference resnet18_top_outputs.npz \    
	--tolerance 0.99,0.99 \   
 	--model resnet18_1684x_f32.bmodel

编译完成后, 会生成名为 ${ model_name}_1684x_f32.bmodel 的文件。

 6 MLIR转INT8模型

6.1生成校准表
    run_calibration.py resnet18.mlir \

      --dataset ../ILSVRC2012 \

      --input_num 100 \

      -o resnet18_cali_table

6.2 编译为INT8对称量化模型 
$ model_deploy.py \    
	--mlir resnet18.mlir \    
	--quantize INT8 \    
	--calibration_table resnet18_cali_table \    
	--chip bm1684x \    
	--test_input resnet18_in_f32.npz \    
	--test_reference resnet18_top_outputs.npz \   
	--tolerance 0.85,0.45 \    
	--model resnet18_1684x_int8_sym.bmodel 

 6.3INT8非对称量化模型
$ model_deploy.py \
    --mlir resnet18.mlir \
    --quantize INT8 \
    --asymmetric \
    --calibration_table resnet18_cali_table \
    --chip bm1684x \
    --test_input resnet18_in_f32.npz \
    --test_reference resnet18_top_outputs.npz \
    --tolerance 0.90,0.55 \
    --model resnet18_1684x_int8_asym.bmodel

 7 测试

7.1 onnx模型测试

执行以下推理命令 

$ ./classify_resnet18.py --model_def model/resnet18.onnx --input images/cat.jpg --output outputs/cat_onnx.jpg  --category_file images/label.txt

./calssify_resnet18.py 执行当前目录下的py文件

--model_def  模型参数,输入模型的位置,可以是onnx,bmodel

--input 输入图片

--output 输出路径

--category_file label的路径

7.2 Fp32模型测试

执行推理命令:

./classify_resnet18.py --model_def workspace/resnet18_1684x_f32.bmodel --input images/cat.jpg --output outputs/cat_f32.jpg  --category_file images/label.txt
7.3 INT8 对称模型测试
./classify_resnet18.py --model_def workspace/resnet18_1684x_int8_sym.bmodel --input images/cat.jpg --output outputs/cat_int8.jpg  --category_file images/label.txt

8 结果对比

onnx结果

 F32结果

INT8 对称量化结果

 INT8 非对称量化结果

猜你喜欢

转载自blog.csdn.net/lily_19861986/article/details/131521330