12. 附录03: BM168x使用指南
BM168x支持ONNX系列、pytorch模型、Caffe模型和TFLite模型。本章节以BM1684x为例,介绍BM168x系列bmodel文件的合并方法。
12.1. 合并bmodel模型文件
对于同一个模型,可以依据输入的batch size以及分辨率(不同的h和w)分别生成独立的bmodel文件。不过为了节省外存和运存,可以选择将这些相关的bmodel文件合并为一个bmodel文件,共享其权重部分。具体步骤如下:
12.1.1. 步骤0: 生成batch 1的bmodel
请参考前述章节,新建workspace目录,通过model_transform将yolov5s转换成mlir fp32模型。
注意 :
1.需要合并的bmodel使用同一个workspace目录,并且不要与不需要合并的bmodel 共用一个workspace;
2.步骤0、步骤1中 –merge_weight是必需选项。
$ model_transform \
--model_name yolov5s \
--model_def ../yolov5s.onnx \
--input_shapes [[1,3,640,640]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--output_names 350,498,646 \
--test_input ../image/dog.jpg \
--test_result yolov5s_top_outputs.npz \
--mlir yolov5s_bs1.mlir
使用前述章节生成的yolov5s_cali_table;如果没有,则通过run_calibration工具对yolov5s.mlir进行量化校验获得calibration table文件。 然后将模型量化并生成bmodel:
# 加上 --merge_weight参数
$ model_deploy \
--mlir yolov5s_bs1.mlir \
--quantize INT8 \
--calibration_table yolov5s_cali_table \
--processor bm1684x \
--test_input yolov5s_in_f32.npz \
--test_reference yolov5s_top_outputs.npz \
--tolerance 0.85,0.45 \
--merge_weight \
--model yolov5s_bm1684x_int8_sym_bs1.bmodel
12.1.2. 步骤1: 生成batch 2的bmodel
同步骤0,在同一个workspace中生成batch为2的mlir fp32文件:
$ model_transform \
--model_name yolov5s \
--model_def ../yolov5s.onnx \
--input_shapes [[2,3,640,640]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--output_names 350,498,646 \
--test_input ../image/dog.jpg \
--test_result yolov5s_top_outputs.npz \
--mlir yolov5s_bs2.mlir
# 加上 --merge_weight参数
$ model_deploy \
--mlir yolov5s_bs2.mlir \
--quantize INT8 \
--calibration_table yolov5s_cali_table \
--processor bm1684x \
--test_input yolov5s_in_f32.npz \
--test_reference yolov5s_top_outputs.npz \
--tolerance 0.85,0.45 \
--merge_weight \
--model yolov5s_bm1684x_int8_sym_bs2.bmodel
12.1.3. 步骤2: 合并batch 1和batch 2的bmodel
使用model_tool合并两个bmodel文件:
model_tool \
--combine \
yolov5s_bm1684x_int8_sym_bs1.bmodel \
yolov5s_bm1684x_int8_sym_bs2.bmodel \
-o yolov5s_bm1684x_int8_sym_bs1_bs2.bmodel
12.1.4. 综述: 合并过程
使用上面命令,不论是相同模型还是不同模型,均可以进行合并。 合并的原理是: 模型生成过程中,会叠加前面模型的weight(如果相同则共用)。
主要步骤在于:
用model_deploy生成模型时,加上–merge_weight参数
要合并的模型的生成目录必须是同一个,且在合并模型前不要清理任何中间文件(叠加前面模型weight通过中间文件_weight_map.csv实现)
用model_tool –combine 将多个bmodel合并