MindSpore是端边云全场景按需协同的华为自研AI计算框架
MindSporeLite是MindSpore全场景AI框架的端侧引擎
https://www.mindspore.cn/tutorial/lite/zh-CN/master/index.html
其中MindSporeLite提供了模型转换工具进行离线量化校准
https://www.mindspore.cn/tutorial/lite/zh-CN/master/quick_start/quick_start.html#id4
下面给出使用mindsporelite的converter转换tflite的图像分类模型;用训练后量化量化;最后在imagenet数据集上推理的详细过程。
1.下载tflite模型
https://www.tensorflow.org/lite/guide/hosted_models
因为要用mslite的量化,需要下tflite的浮点模型而不是tflite量化的模型。比如
下载后解压,得到tflite,pb等文件。
注意tflite的模型图像尺寸不同,有的是224,有的是299。
2.制作校准集
mslite量化工具不能自行预处理图像,因而不能给jpeg的图像,需要转成二进制浮点数据,且图像数据排布是n,h,w,c。数组是行优先(c/c++)。
这里用pytorch进行预处理:变形,裁剪,归一化。tflite模型的归一化都是0.5。
https://git.cyh.ac.cn/cyh/mindsporelite-image-classification/src/master/np.py
这里顺便把验证集也做成二进制的,方便推理时用。
这里用的imagenet数据集是按类分文件夹的。
3.转换模型,量化模型
以inception v3为例,转换浮点模型和量化模型
# float
converter_lite --fmk=TFLITE --modelFile=inception_v3.tflite --outputFile=inception_v3.float
# quant
converter_lite --fmk=TFLITE --modelFile=inception_v3.tflite --outputFile=inception_v3.quant --quantType=PostTraining --configFile=config/kl_nobias.cfg --quantWeightChannel=0
配置文件
image_path=/data/calib_data_c_299
batch_count=100
method_x=KL
thread_num=4
bias_correction=false
转换完成得到inception_v3.float.ms和inception_v3.quant.ms两个模型。
4.编写推理程序
mslite似乎没有python的api,只有c++和java(Android)的。这里用c++写一个简单的推理。数据预处理也不在c++里写了。数据加载和推理按理可以用并发流水之类加速的,这里也不写了。但多线程还是得写一下,要不cpu推理50000张很慢。
https://git.cyh.ac.cn/cyh/mindsporelite-image-classification/src/master/infer.cc
编译命令
g++ infer.cc -I. -Llib -lmindspore-lite -lpthread -o classification -O3
5.运行推理
./classification msmodels/inception_v3.float.ms 50000 40 /data/val_data_c/%05d.bin
这里valpath是一个c格式化字符串
6.精度结果
model | size | tflite-fp32 | mslite-fp32 | kl+b | kl | max+b | max |
resnet_v2_101_299 | 299 | 76.80% | 77.10% | 0.07% | 0.06% | 0.06% | 0.10% |
inception_v3 | 299 | 77.90% | 77.91% | 42.81% | 44.62% | 77.69% | 77.62% |
inception_v4 | 299 | 80.10% | 80.06% | 45.52% | 49.27% | 0.11% | 0.13% |
inception_resnet_v2 | 299 | 77.50% | 77.88% | 16.65% | 6.31% | 77.39% | 77.44% |
mobilenet_v1_1.0_224 | 224 | 71.00% | 71.23% | 67.23% | 67.21% | 71.03% | 70.82% |
mobilenet_v2_1.0_224 | 224 | 71.80% | 71.48% | 70.55% | 69.98% | 71.16% | 70.48% |
nasnet_mobile | 224 | 73.90% | 74.08% | 51.59% | 66.37% | 24.59% | 27.28% |
squeezenet | 224 | 49.00% | 32.64% | 25.60% | 25.34% | 18.87% | 18.41% |