6. 编译Caffe模型
本章以 mobilenet_v2_deploy.prototxt
和 mobilenet_v2.caffemodel
为例, 介绍如何编译迁移一个caffe模型至BM1684X TPU平台运行。
本章需要如下文件(其中xxxx对应实际的版本信息):
tpu-mlir_xxxx.tar.gz (tpu-mlir的发布包)
6.1. 加载tpu-mlir
以下操作需要在Docker容器中。关于Docker的使用, 请参考 启动Docker Container 。
1$ tar zxf tpu-mlir_xxxx.tar.gz
2$ source tpu-mlir_xxxx/envsetup.sh
envsetup.sh
会添加以下环境变量:
变量名 |
值 |
说明 |
---|---|---|
TPUC_ROOT |
tpu-mlir_xxx |
解压后SDK包的位置 |
MODEL_ZOO_PATH |
${TPUC_ROOT}/../model-zoo |
model-zoo文件夹位置, 与SDK在同一级目录 |
envsetup.sh
对环境变量的修改内容为:
1export PATH=${TPUC_ROOT}/bin:$PATH
2export PATH=${TPUC_ROOT}/python/tools:$PATH
3export PATH=${TPUC_ROOT}/python/utils:$PATH
4export PATH=${TPUC_ROOT}/python/test:$PATH
5export PATH=${TPUC_ROOT}/python/samples:$PATH
6export LD_LIBRARY_PATH=$TPUC_ROOT/lib:$LD_LIBRARY_PATH
7export PYTHONPATH=${TPUC_ROOT}/python:$PYTHONPATH
8export MODEL_ZOO_PATH=${TPUC_ROOT}/../model-zoo
9export REGRESSION_PATH=${TPUC_ROOT}/regression
6.2. 准备工作目录
建立 mobilenet_v2
目录, 注意是与tpu-mlir同级目录; 并把模型文件和图片文件都
放入 mobilenet_v2
目录中。
操作如下:
1$ mkdir mobilenet_v2 && cd mobilenet_v2
2$ cp $TPUC_ROOT/regression/model/mobilenet_v2_deploy.prototxt .
3$ cp $TPUC_ROOT/regression/model/mobilenet_v2.caffemodel .
4$ cp -rf $TPUC_ROOT/regression/dataset/ILSVRC2012 .
5$ cp -rf $TPUC_ROOT/regression/image .
6$ mkdir workspace && cd workspace
这里的 $TPUC_ROOT
是环境变量, 对应tpu-mlir_xxxx目录。
6.3. Caffe转MLIR
本例中的模型是 BGR 输入, mean和scale分别为 103.94,116.78,123.68
和 0.017,0.017,0.017
。
模型转换命令如下:
$ model_transform.py \
--model_name mobilenet_v2 \
--model_def ../mobilenet_v2_deploy.prototxt \
--model_data ../mobilenet_v2.caffemodel \
--input_shapes [[1,3,224,224]] \
--resize_dims=256,256 \
--mean 103.94,116.78,123.68 \
--scale 0.017,0.017,0.017 \
--pixel_format bgr \
--test_input ../image/cat.jpg \
--test_result mobilenet_v2_top_outputs.npz \
--mlir mobilenet_v2.mlir
转成mlir文件后, 会生成一个 ${model_name}_in_f32.npz
文件, 该文件是模型的输入文件。
6.4. MLIR转F32模型
将mlir文件转换成f32的bmodel, 操作方法如下:
$ model_deploy.py \
--mlir mobilenet_v2.mlir \
--quantize F32 \
--chip bm1684x \
--test_input mobilenet_v2_in_f32.npz \
--test_reference mobilenet_v2_top_outputs.npz \
--tolerance 0.99,0.99 \
--model mobilenet_v2_1684x_f32.bmodel
编译完成后, 会生成名为 ${model_name}_1684x_f32.bmodel
的文件。
6.5. MLIR转INT8模型
6.5.1. 生成校准表
转INT8模型前需要跑calibration, 得到校准表; 输入数据的数量根据情况准备100~1000张左右。
然后用校准表, 生成对称或非对称bmodel。如果对称符合需求, 一般不建议用非对称, 因为 非对称的性能会略差于对称模型。
这里用现有的100张来自ILSVRC2012的图片举例, 执行calibration:
$ run_calibration.py mobilenet_v2.mlir \
--dataset ../ILSVRC2012 \
--input_num 100 \
-o mobilenet_v2_cali_table
运行完成后会生成名为 ${model_name}_cali_table
的文件, 该文件用于后续编译INT8
模型的输入文件。
6.5.2. 编译为INT8对称量化模型
转成INT8对称量化模型, 执行如下命令:
$ model_deploy.py \
--mlir mobilenet_v2.mlir \
--quantize INT8 \
--calibration_table mobilenet_v2_cali_table \
--chip bm1684x \
--test_input mobilenet_v2_in_f32.npz \
--test_reference mobilenet_v2_top_outputs.npz \
--tolerance 0.96,0.70 \
--model mobilenet_v2_1684x_int8_sym.bmodel
编译完成后, 会生成名为 ${model_name}_1684x_int8_sym.bmodel
的文件。
6.5.3. 编译为INT8非对称量化模型
转成INT8非对称量化模型, 执行如下命令:
$ model_deploy.py \
--mlir mobilenet_v2.mlir \
--quantize INT8 \
--asymmetric \
--calibration_table mobilenet_v2_cali_table \
--chip bm1684x \
--test_input mobilenet_v2_in_f32.npz \
--test_reference mobilenet_v2_top_outputs.npz \
--tolerance 0.95,0.69 \
--model mobilenet_v2_1684x_int8_asym.bmodel
编译完成后, 会生成名为 ${model_name}_1684x_int8_asym.bmodel
的文件。