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量化的模型。比如

https://storage.googleapis.com/download.tensorflow.org/models/tflite/model_zoo/upload_20180427/inception_v3_2018_04_27.tgz

下载后解压,得到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.精度结果

modelsizetflite-fp32mslite-fp32kl+bklmax+bmax
resnet_v2_101_29929976.80%77.10%0.07%0.06%0.06%0.10%
inception_v329977.90%77.91%42.81%44.62%77.69%77.62%
inception_v429980.10%80.06%45.52%49.27%0.11%0.13%
inception_resnet_v229977.50%77.88%16.65%6.31%77.39%77.44%
mobilenet_v1_1.0_22422471.00%71.23%67.23%67.21%71.03%70.82%
mobilenet_v2_1.0_22422471.80%71.48%70.55%69.98%71.16%70.48%
nasnet_mobile22473.90%74.08%51.59%66.37%24.59%27.28%
squeezenet22449.00%32.64%25.60%25.34%18.87%18.41%