1-6步骤可以在云空间运行,也可以在本地运行;步骤7 在云空间运行。
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:$PATHexport PATH=${TPUC_ROOT}/python/tools:$PATHexport PATH=${TPUC_ROOT}/python/utils:$PATHexport PATH=${TPUC_ROOT}/python/test:$PATHexport PATH=${TPUC_ROOT}/python/samples:$PATHexport LD_LIBRARY_PATH=$TPUC_ROOT/lib:$LD_LIBRARY_PATHexport PYTHONPATH=${TPUC_ROOT}/python:$PYTHONPATHexport 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 | 否 | 图片类型, 可以是rgb、bgr、gray、rgbd四种情况 |
output_names | 否 | 指定输出的名称, 如果不指定, 则用模型的输出; 指定后用 该指定名称做输出 |
test_input | 否 | 指定输入文件用于验证, 可以是图片或npy或npz; 可以不 指定, 则不会正确性验证 |
test_result | 否 | 指定验证后的输出文件 |
excepts | 否 | 指定需要排除验证的网络层的名称, 多个用,隔开 |
mlir | 是 | 指定输出的mlir文件名称和路径 |
post_handle_type | 否 | 将后处理融合到模型中,指定后处理类型, 比如yolo、 ssd |
5 MLIR转F32模型
将mlir文件转换成f32的bmodel, 操作方法如下
$ 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.3转成INT8非对称量化模型
$ 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云空间使用
用户申请的云空间审批后,将鼠标移至“进⼊空间”上⽅,会在当前页面弹出⼀个⼩窗⼝。
7.2 文件传输
如果用户需要在云空间主机与本地之间进⾏⽂件传输,可以点击“云空间⽂件系统“链接,进⼊⽂件传输与管理工作台。⽂件管理⼯作台操作的云空间主机⽬录默认是在/tmp下⾯,工作台提供了新建、删除、剪切、复制文件或文件夹的功能。
将tpu-mlir的压缩包上传到云空间文件夹中
将转换好的模型和数据上传到云空间
7.3环境配置
以下操作需要在云空间平台中。
$ tar zxf tpu-mlir_xxxx.tar.gz$ source tpu-mlir_xxxx/envsetup.sh
envsetup.sh 对环境变量的修改内容为:
export PATH=${TPUC_ROOT}/bin:$PATHexport PATH=${TPUC_ROOT}/python/tools:$PATHexport PATH=${TPUC_ROOT}/python/utils:$PATHexport PATH=${TPUC_ROOT}/python/test:$PATHexport PATH=${TPUC_ROOT}/python/samples:$PATHexport LD_LIBRARY_PATH=$TPUC_ROOT/lib:$LD_LIBRARY_PATHexport PYTHONPATH=${TPUC_ROOT}/python:$PYTHONPATHexport MODEL_ZOO_PATH=${TPUC_ROOT}/../model-zoo
激活sophon-libsophon
激活导入sophon-libsophon环境
apt-get updateexport PATH=/opt/sophon/libsophon-current/bin:$PATHexport LD_LIBRARY_PATH=/opt/sophon/libsophon-current/lib:$LD_LIBRARY_PATHbm-smi
7.4 查看模型
cd /tmp/model_resnet18/workspace
使用bmrt_test –bmodel 命令查看f32模型的属性
cd /tmp/model_resnet18/workspace
使用bmrt_test –bmodel 命令查看INT8模型的属性
7.5测试
onnx模型测试
执行以下推理命令
python ./classify_resnet18.py --model_def model/resnet18.onnx --input images/cat.jpg --output outputs/cat_onnx.jpg --category_file images/label.txt
Fp32模型测试
执行推理命令:
python ./classify_resnet18.py --model_def workspace/resnet18_1684x_f32.bmodel --input images/cat.jpg --output outputs/cat_f32.jpg --category_file images/label.txt
INT8 对称模型测试
之后执行推理命令:
python ./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
INT8 非对称模型测试
之后执行推理命令:
python ./classify_resnet18.py --model_def workspace/resnet18_1684x_int8_asym.bmodel --input images/cat.jpg --output outputs/cat_int8a.jpg --category_file images/label.txt