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量化 | Integer | 8 | [1,16] |
--quantWeightSize=<QUANTWEIGHTSIZE> | 可选 | 设定参与权重量化的卷积核尺寸阈值,若卷积核尺寸大于该值,则对此权重进行量化;建议设置为500 | Integer | 0 | [0,+∞) |
--quantWeightChannel=<QUANTWEIGHTCHANNEL> | 可选 | 设定参与权重量化的卷积通道数阈值,若卷积通道数大于该值,则对此权重进行量化;建议设置为16 | Integer | 16 | [0,+∞) |
量化的比特数可选1-16,全量化且比特数小于等于8时运算操作数类型是int8,可以减少计算量降低功耗;只量化权重时,运算操作数类型是fp32,但可以减小模型文件大小。
量化算子列表
mindspore/lite/tools/converter/quantizer/quantize_util.cc
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
量化可选weight量化(只量化weight,为了缩小模型,计算时使用fp32),全int8量化(量化weight和activate,计算时使用int);
量化方法是非对称,分通道;
校准方法有KL,MAX_MIN和RemovalOutlier三种。
bias_correction
量化误差校正,对模型中的Conv2D和DwConv2D进行
一阶段采用常规线性量化手段对权重和激活值进行量化,二阶段对量化误差进行分析,利用统计学方法对量化模型进行校正,补偿因量化带来的精度损失。
mindspore lite在实现上比较复杂,算法上大致流程如下图
即在conv2d和dwconv2d层上分别用fp32和int8推理,计算输出的差距output_diff(分通道进行),最后把归一化的output_diff添加到算子bias上(分通道),output_diff绝对值过大的会限制在一定范围。
量化误差修正的效果如下表
mobilenet_v2 | ACC(On ImageNet) |
FP32 | 71.56% |
A8W8 | 71.16%(TF Lite官网后量化ACC:63.7%) |
A8W8(不做BiasCorrection) | 70.74% |
A8W7 | 71.06% |
A7W7 | 70.78% |
模型精度
官方给出的模型精度
模型 | 测试数据集 | method_x | FP32模型精度 | 全量化精度(8bit) | 说明 |
---|---|---|---|---|---|
Inception_V3 | ImageNet | KL | 77.60% | 77.40% | 校准数据集随机选择ImageNet Validation数据集中的100张 |
Mobilenet_V1_1.0_224 | ImageNet | KL | 70.96% | 70.31% | 校准数据集随机选择ImageNet Validation数据集中的100张 |
Mobilenet_V2_1.0_224 | ImageNet | MAX_MIN | 71.56% | 71.16% | 校准数据集随机选择ImageNet Validation数据集中的100张 |