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

权重量化转换命令的一般形式为:

./converter_lite --fmk=ModelType --modelFile=ModelFilePath --outputFile=ConvertedModelPath --quantType=WeightQuant --bitNum=BitNumValue --quantWeightSize=ConvWeightQuantSizeThresholdValue --quantWeightChannel=ConvWeightQuantChannelThresholdValue

命令相关参数:

参数属性功能描述参数类型默认值取值范围
--quantType=<QUANTTYPE>必选设置为WeightQuant,启用权重量化String必须设置为WeightQuant
--bitNum=<BITNUM>可选设定权重量化的比特数,目前支持1bit~16bit量化Integer8[1,16]
--quantWeightSize=<QUANTWEIGHTSIZE>可选设定参与权重量化的卷积核尺寸阈值,若卷积核尺寸大于该值,则对此权重进行量化;建议设置为500Integer0[0,+∞)
--quantWeightChannel=<QUANTWEIGHTCHANNEL>可选设定参与权重量化的卷积通道数阈值,若卷积通道数大于该值,则对此权重进行量化;建议设置为16Integer16[0,+∞)

量化的比特数可选1-16,全量化且比特数小于等于8时运算操作数类型是int8,可以减少计算量降低功耗;只量化权重时,运算操作数类型是fp32,但可以减小模型文件大小。

量化算子列表

mindspore/lite/tools/converter/quantizer/quantize_util.cc

https://github.com/mindspore-ai/mindspore/blob/f31dfa129abccfc22b15d79cf9a9720b10668703/mindspore/lite/tools/converter/quantizer/quantize_util.cc#L91


static const std::vector<schema::PrimitiveType> int8OpList = {
    schema::PrimitiveType_Conv2D,
    schema::PrimitiveType_DepthwiseConv2D,
    schema::PrimitiveType_Add,
    schema::PrimitiveType_Mul,
    schema::PrimitiveType_Pooling,
    schema::PrimitiveType_Concat,
    schema::PrimitiveType_Split,
    schema::PrimitiveType_TupleGetItem,
    schema::PrimitiveType_Reshape,
    schema::PrimitiveType_FullConnection,
    schema::PrimitiveType_MatMul,
    schema::PrimitiveType_Crop,
    schema::PrimitiveType_DeDepthwiseConv2D,
    schema::PrimitiveType_DeConv2D,
    schema::PrimitiveType_Activation,
    schema::PrimitiveType_Transpose,
    schema::PrimitiveType_Eltwise,
    schema::PrimitiveType_Gather,
    schema::PrimitiveType_LayerNorm,
};

训练后量化(离线量化)方法

mindspore/lite/tools/converter/quantizer/post_training_quantizer.cc

https://github.com/mindspore-ai/mindspore/blob/f31dfa129abccfc22b15d79cf9a9720b10668703/mindspore/lite/tools/converter/quantizer/post_training_quantizer.cc#L99

量化可选weight量化(只量化weight,为了缩小模型,计算时使用fp32),全int8量化(量化weight和activate,计算时使用int);

量化方法是非对称,分通道;

校准方法有KL,MAX_MIN和RemovalOutlier三种。

bias_correction

https://github.com/mindspore-ai/mindspore/blob/696c67d06d3a823fb317cdbc8225a004713d9d74/mindspore/lite/tools/converter/quantizer/post_training_quantizer.cc#L1119

量化误差校正,对模型中的Conv2D和DwConv2D进行

一阶段采用常规线性量化手段对权重和激活值进行量化,二阶段对量化误差进行分析,利用统计学方法对量化模型进行校正,补偿因量化带来的精度损失。

mindspore lite在实现上比较复杂,算法上大致流程如下图

即在conv2d和dwconv2d层上分别用fp32和int8推理,计算输出的差距output_diff(分通道进行),最后把归一化的output_diff添加到算子bias上(分通道),output_diff绝对值过大的会限制在一定范围。


量化误差修正的效果如下表

mobilenet_v2ACC(On ImageNet)
FP3271.56%
A8W871.16%(TF Lite官网后量化ACC:63.7%)
A8W8(不做BiasCorrection)70.74%
A8W771.06%
A7W770.78%

模型精度

官方给出的模型精度

模型测试数据集method_xFP32模型精度全量化精度(8bit)说明
Inception_V3ImageNetKL77.60%77.40%校准数据集随机选择ImageNet Validation数据集中的100张
Mobilenet_V1_1.0_224ImageNetKL70.96%70.31%校准数据集随机选择ImageNet Validation数据集中的100张
Mobilenet_V2_1.0_224ImageNetMAX_MIN71.56%71.16%校准数据集随机选择ImageNet Validation数据集中的100张