Post Training Quantization

Overview

Converting a trained float32 model into an int8 model through quantization after training can reduce the model size and improve the inference performance. In MindSpore Lite, this function is integrated into the model conversion tool converter_lite. You can add command line parameters to convert a model into a quantization model.

MindSpore Lite quantization after training is classified into two types:

  1. Weight quantization: quantizes a weight of a model and compresses only the model size. float32 inference is still performed during inference.

  2. Full quantization: quantizes the weight and activation value of a model. The int operation is performed during inference to improve the model inference speed and reduce power consumption.

Configuration Parameter

Post training quantization can be enabled by configuring configFile through Conversion Tool. The configuration file adopts the style of INI, For quantization, configurable parameters include common quantization parameter [common_quant_param], mixed bit weight quantization parameter [mixed_bit_weight_quant_param],full quantization parameter [full_quant_param], and data preprocess parameter [data_preprocess_param].

Common Quantization Parameter

common quantization parameters are the basic settings for post training quantization, mainly including quant_type, bit_num, min_quant_weight_size, and min_quant_weight_channel. The detailed description of the parameters is as follows:

Parameter

Attribute

Function Description

Parameter Type

Default Value

Value Range

quant_type

Mandatory

The quantization type. When set to WEIGHT_QUANT, weight quantization is enabled; when set to FULL_QUANT, full quantization is enabled; when set to DYNAMIC_QUANT, dynamic quantization is enabled.

String

-

WEIGHT_QUANT,
FULL_QUANT,
DYNAMIC_QUANT

bit_num

Optional

The number of quantized bits. Currently, weight quantization supports 0-16bit quantization. When it is set to 1-16bit, it is fixed-bit quantization. When it is set to 0bit, mixed-bit quantization is enabled. Full quantization and Dynamic quantization supports 8bit quantization.

Integer

8

WEIGHT_QUANT:[0,16]
FULL_QUANT: 8
DYNAMIC_QUANT:8

min_quant_weight_size

Optional

Set the threshold of the weight size for quantization. If the number of weights is greater than this value, the weight will be quantized.

Integer

0

[0, 65535]

min_quant_weight_channel

Optional

Set the threshold of the number of weight channels for quantization. If the number of weight channels is greater than this value, the weight will be quantized.

Integer

16

[0, 65535]

skip_quant_node

Optional

Set the name of the operator that does not need to be quantified, and use , to split between multiple operators.

String

-

-

debug_info_save_path

Optional

Set the folder path where the quantized debug information file is saved.

String

-

-

enable_encode

Optional

The enable switch of compression code for weight quantization.

Boolean

True

True, False

min_quant_weight_size and min_quant_weight_channel are only valid for weight quantization.

Recommendation: When the accuracy of full quantization is not satisfied, you can set debug_info_save_path to turn on the Debug mode to get the relevant statistical report, and set skip_quant_node for operators that are not suitable for quantization to not quantize them.

The common quantization parameter configuration is as follows:

[common_quant_param]
# Supports WEIGHT_QUANT or FULL_QUANT
quant_type=WEIGHT_QUANT
# Weight quantization support the number of bits [0,16], Set to 0 is mixed bit quantization, otherwise it is fixed bit quantization
# Full quantization support 8bit
bit_num=8
# Layers with size of weights exceeds threshold `min_quant_weight_size` will be quantized.
min_quant_weight_size=0
# Layers with channel size of weights exceeds threshold `min_quant_weight_channel` will be quantized.
min_quant_weight_channel=16
# Set the name of the operator that skips the quantization, and use `,` to split between multiple operators.
skip_quant_node=node_name1,node_name2,node_name3
# Set the folder path where the quantization debug information file is saved.
debug_info_save_path=/home/workspace/mindspore/debug_info_save_path
# Enable tensor compression for weight quantization. If parameter bit_num not equal to 8 or 16, it can not be set to false.
enable_encode = true

Mixed Bit Weight Quantization Parameter

The mixed bit weight quantization parameters include init_scale. When enable the mixed bit weight quantization, the optimal number of bits will be automatically searched for different layers. The detailed description of the parameters is as follows:

Parameter

Attribute

Function Description

Parameter Type

Default Value

Value Range

init_scale

Optional

Initialize the scale. The larger the value, the greater the compression rate, but it will also cause varying degrees of accuracy loss.

Float

0.02

(0 , 1)

auto_tune

Optional

Automatically search for the init_scale parameter. After setting, it will automatically search for a set of init_scale values whose cosine similarity of the model output Tensor is around 0.995.

Boolean

False

True,False

The mixed bit quantization parameter configuration is as follows:

[mixed_bit_weight_quant_param]
init_scale=0.02
auto_tune=false

Full Quantization Parameters

The full quantization parameters mainly include activation_quant_method, bias_correction and target_device. The detailed description of the parameters is as follows:

Parameter

Attribute

Function Description

Parameter Type

Default Value

Value Range

activation_quant_method

Optional

Activation quantization algorithm

String

MAX_MIN

KL, MAX_MIN, or RemovalOutlier.
KL: quantizes and calibrates the data range based on KL divergence.
MAX_MIN: data quantization parameter computed based on the maximum and minimum values.
RemovalOutlier: removes the maximum and minimum values of data based on a certain proportion and then calculates the quantization parameters.
If the calibration dataset is consistent with the input data during actual inference, MAX_MIN is recommended. If the noise of the calibration dataset is large, KL or RemovalOutlier is recommended.

bias_correction

Optional

Indicate whether to correct the quantization error.

Boolean

True

True or False. After this parameter is enabled, the accuracy of the converted model can be improved. You are advised to set this parameter to true.

per_channel

Optional

Select PerChannel or PerLayer quantization type.

Boolean

True

True or False. Set to false to enable Perlayer quantization.

target_device

Optional

Full quantization supports multiple hardware backends. After setting the specific hardware, the converted quantization model can execute the proprietry hardware quantization operator library. If not setting, universal quantization lib will be called.

String

-

NVGPU: The quantized model can perform quantitative inference on the NVIDIA GPU.
DSP: The quantized model can perform quantitative inference on the DSP devices.

The full quantization parameter (PerChannel quantization type) configuration is as follows:

[full_quant_param]
# Activation quantized method supports MAX_MIN or KL or REMOVAL_OUTLIER
activation_quant_method=MAX_MIN
# Whether to correct the quantization error. Recommended to set to true.
bias_correction=true
# If set to true, it will enable PerChannel quantization, or set to false to enable PerLayer quantization.
per_channel=true

The full quantization parameter (PerLayer quantization type) configuration is as follows:

[full_quant_param]
# Activation quantized method supports MAX_MIN or KL or REMOVAL_OUTLIER
activation_quant_method=MAX_MIN
# Whether to correct the quantization error. Recommended to set to true.
bias_correction=true
# If set to true, it will enable PerChannel quantization, or set to false to enable PerLayer quantization.
per_channel=false

NVIDIA GPU full quantization parameter configuration is as follows:

[full_quant_param]
# Activation quantized method supports MAX_MIN or KL or REMOVAL_OUTLIER
activation_quant_method=MAX_MIN
# Whether to correct the quantization error. Recommended to set to true.
bias_correction=true
# Whether to support PerChannel quantization strategy. Recommended to set to true.
per_channel=true
# Supports specific hardware backends
target_device=NVGPU

DSP full quantization parameter configuration is as follows:

[full_quant_param]
# Activation quantized method supports MAX_MIN or KL or REMOVAL_OUTLIER
activation_quant_method=MAX_MIN
# Whether to correct the quantization error.
bias_correction=false
# Supports specific hardware backends
target_device=DSP

Data Preprocessing

Full quantization needs to provide 100-500 calibration data sets for pre-inference, which is used to calculate the quantization parameters of full quantization activation values. If there are multiple input Tensors, the calibration dataset for each input Tensor needs to be saved in a separate folder.

For the BIN calibration dataset, the .bin file stores the input data buffer, and the format of the input data needs to be consistent with the format of the input data during inference. For 4D data, the default is NHWC. If the command parameter inputDataFormat of the converter tool is configured, the format of the input Buffer needs to be consistent.

For the image calibration dataset, post training quantization provides data preprocessing functions such as channel conversion, normalization, resize, and center crop.

Parameter

Attribute

Function Description

Parameter Type

Default Value

Value Range

calibrate_path

Mandatory

The directory where the calibration dataset is stored; if the model has multiple inputs, please fill in the directory where the corresponding data is located one by one, and separate the directory paths with ,

String

-

input_name_1:/mnt/image/input_1_dir,input_name_2:input_2_dir

calibrate_size

Mandatory

Calibration data size

Integer

-

[1, 65535]

input_type

Mandatory

Correction data file format type

String

-

IMAGE、BIN
IMAGE:image file data
BIN:binary .bin file data

image_to_format

Optional

Image format conversion

String

-

RGB、GRAY、BGR

normalize_mean

Optional

Normalized mean
dst = (src - mean) / std

Vector

-

Channel 3: [mean_1, mean_2, mean_3]
Channel 1: [mean_1]

normalize_std

Optional

Normalized standard deviation
dst = (src - mean) / std

Vector

-

Channel 3: [std_1, std_2, std_3]
Channel 1: [std_1]

resize_width

Optional

Resize width

Integer

-

[1, 65535]

resize_height

Optional

Resize height

Integer

-

[1, 65535]

resize_method

Optional

Resize algorithm

String

-

LINEAR, NEAREST, CUBIC
LINEAR:Bilinear interpolation
NEARST:Nearest neighbor interpolation
CUBIC:Bicubic interpolation

center_crop_width

Optional

Center crop width

Integer

-

[1, 65535]

center_crop_height

Optional

Center crop height

Integer

-

[1, 65535]

The data preprocessing parameter configuration is as follows:

[data_preprocess_param]
# Calibration dataset path, the format is input_name_1:input_1_dir,input_name_2:input_2_dir
# Full quantification must provide correction dataset
calibrate_path=input_name_1:/mnt/image/input_1_dir,input_name_2:input_2_dir
# Calibration data size
calibrate_size=100
# Input type supports IMAGE or BIN
# When set to IMAGE, the image data will be read
# When set to BIN, the `.bin` binary file will be read
input_type=IMAGE
# The output format of the preprocessed image
# Supports RGB or GRAY or BGR
image_to_format=RGB
# Image normalization
# dst = (src - mean) / std
normalize_mean=[127.5, 127.5, 127.5]
normalize_std=[127.5, 127.5, 127.5]
# Image resize
resize_width=224
resize_height=224
# Resize method supports LINEAR or NEAREST or CUBIC
resize_method=LINEAR
# Image center crop
center_crop_width=224
center_crop_height=224

Weight Quantization

Weight quantization supports mixed bit quantization, as well as fixed bit quantization between 1 and 16. The lower the number of bits, the greater the model compression rate, but the accuracy loss is usually larger. The following describes how to use weight quantization and its effects.

Mixed Bit Weight Quantization

Currently, weight quantization supports mixed bit quantization. According to the distribution of model parameters and the initial value of init_scale set by the user, the number of bits that is most suitable for the current layer will be automatically searched out. When the bit_num of the configuration parameter is set to 0, mixed bit quantization will be enabled.

The general form of the mixed bit weight requantization command is:

./converter_lite --fmk=ModelType --modelFile=ModelFilePath --outputFile=ConvertedModelPath --quantType=WeightQuant --configFile=/mindspore/lite/tools/converter/quantizer/config/mixed_bit_weight_quant.cfg

The mixed bit weight quantification configuration file is as follows:

[common_quant_param]
quant_type=WEIGHT_QUANT
# Weight quantization support the number of bits [0,16], Set to 0 is mixed bit quantization, otherwise it is fixed bit quantization
bit_num=0
# Layers with size of weights exceeds threshold `min_quant_weight_size` will be quantized.
min_quant_weight_size=5000
# Layers with channel size of weights exceeds threshold `min_quant_weight_channel` will be quantized.
min_quant_weight_channel=5

[mixed_bit_weight_quant_param]
# Initialization scale in (0,1).
# A larger value can get a larger compression ratio, but it may also cause a larger error.
init_scale=0.02

Users can adjust the weighted parameters according to the model and their own needs.

The init_scale default value is 0.02, and the compression rate is equivalent to the compression effect of 6-7 fixed bits quantization.

Mixed bits need to search for the best bit, and the waiting time may be longer. If you need to view the log, you can set export GLOG_v=1 before the execution to print the relevant Info level log.

Fixed Bit Weight Quantization

Fixed-bit weighting supports fixed-bit quantization between 1 and 16, and users can adjust the weighting parameters according to the requirement.

The general form of the fixed bit weight quantization conversion command is:

./converter_lite --fmk=ModelType --modelFile=ModelFilePath --outputFile=ConvertedModelPath --configFile=/mindspore/lite/tools/converter/quantizer/config/fixed_bit_weight_quant.cfg

The fixed bit weight quantization configuration file is as follows:

[common_quant_param]
quant_type=WEIGHT_QUANT
# Weight quantization support the number of bits [0,16], Set to 0 is mixed bit quantization, otherwise it is fixed bit quantization
bit_num=8
# Layers with size of weights exceeds threshold `min_quant_weight_size` will be quantized.
min_quant_weight_size=0
# Layers with channel size of weights exceeds threshold `min_quant_weight_channel` will be quantized.
min_quant_weight_channel=16

Partial Model Accuracy Result

Model

Test Dataset

FP32 Model Accuracy

Weight Quantization Accuracy (8 bits)

Inception_V3

ImageNet

77.60%

77.53%

Mobilenet_V1_1.0_224

ImageNet

70.96%

70.56%

Mobilenet_V2_1.0_224

ImageNet

71.56%

71.53%

All the preceding results are obtained in the x86 environment.

Full Quantization

In CV scenarios where the model running speed needs to be improved and the model running power consumption needs to be reduced, the full quantization after training can be used. The following describes how to use full quantization and its effects.

To calculate a quantization parameter of an activation value, you need to provide a calibration dataset. It is recommended that the calibration dataset be obtained from the actual inference scenario and can represent the actual input of a model. The number of data records is about 100 - 500.

For image data, currently supports channel pack, normalization, resize, center crop processing. The user can set the corresponding parameter according to the preprocessing operation requirements.

Note:

  • The calibration dataset must have the same distribution as the training data. The calibration dataset is consistent with the format of the model inputs(e.g. NCHW、NHWC).

The general form of the full quantization conversion command is:

./converter_lite --fmk=ModelType --modelFile=ModelFilePath --outputFile=ConvertedModelPath --configFile=/mindspore/lite/tools/converter/quantizer/config/full_quant.cfg

The full quantization profile is as follows:

[common_quant_param]
quant_type=FULL_QUANT
# Full quantization support 8bit
bit_num=8

[data_preprocess_param]
# Calibration dataset path, the format is input_name_1:input_1_dir,input_name_2:input_2_dir
# Full quantification must provide correction dataset
calibrate_path=input_name_1:/mnt/image/input_1_dir,input_name_2:input_2_dir
# Calibration data size
calibrate_size=100
# Input type supports IMAGE or BIN
# When set to IMAGE, the image data will be read
# When set to BIN, the `.bin` binary file will be read
input_type=IMAGE
# The output format of the preprocessed image
# Supports RGB or GRAY or BGR
image_to_format=RGB
# Image normalization
# dst = (src - mean) / std
normalize_mean=[127.5, 127.5, 127.5]
normalize_std=[127.5, 127.5, 127.5]
# Image resize
resize_width=224
resize_height=224
# Resize method supports LINEAR or NEAREST or CUBIC
resize_method=LINEAR
# Image center crop
center_crop_width=224
center_crop_height=224

[full_quant_param]
# Activation quantized method supports MAX_MIN or KL or REMOVAL_OUTLIER
activation_quant_method=MAX_MIN
# Whether to correct the quantization error. Recommended to set to true.
bias_correction=true

Full quantification needs to perform inference, and the waiting time may be longer. If you need to view the log, you can set export GLOG_v=1 before the execution to print the relevant Info level log.

Partial Model Accuracy Result

Model

Test Dataset

quant_method

FP32 Model Accuracy

Full Quantization Accuracy (8 bits)

Description

Inception_V3

ImageNet

KL

77.60%

77.40%

Randomly select 100 images from the ImageNet Validation dataset as a calibration dataset.

Mobilenet_V1_1.0_224

ImageNet

KL

70.96%

70.31%

Randomly select 100 images from the ImageNet Validation dataset as a calibration dataset.

Mobilenet_V2_1.0_224

ImageNet

MAX_MIN

71.56%

71.16%

Randomly select 100 images from the ImageNet Validation dataset as a calibration dataset.

All the preceding results are obtained in the x86 environment.

Dynamic Quantization

In NLP scenarios where the model running speed needs to be improved and the model running power consumption needs to be reduced, the dynamic quantization after training can be used. The following describes how to use dynamic quantization and its effects.

In Dynamic quantization, the weights are quantized at the convert, and the activation are quantized at the runtime. Compared to static quantization, no calibration dataset is required.

The general form of the dynamic quantization conversion command is:

./converter_lite --fmk=ModelType --modelFile=ModelFilePath --outputFile=ConvertedModelPath --configFile=/mindspore/lite/tools/converter/quantizer/config/dynamic_quant.cfg

The dynamic quantization profile is as follows:

[common_quant_param]
quant_type=DYNAMIC_QUANT
bit_num=8

In order to ensure the quantization accuracy, the dynamic quantization does not support setting the FP16 mode .

The dynamic quantization will have a further acceleration effect on the ARM architecture that supports SDOT instructions.

Partial model performance results

  • tinybert_encoder

Model Type

Runtime Mode

Model Size(M)

RAM(K)

Latency(ms)

Cos-Similarity

Compression Ratio

Memory compared to FP32

Latency compared to FP32

FP32

FP32

20

29,029

9.916

1

FP32

FP16

20

18,208

5.75

0.99999

1

-37.28%

-42.01%

FP16

FP16

12

18,105

5.924

0.99999

1.66667

-37.63%

-40.26%

Weight Quant(8 Bit)

FP16

5.3

19,324

5.764

0.99994

3.77358

-33.43%

-41.87%

Dynamic Quant

INT8+FP32

5.2

15,709

4.517

0.99668

3.84615

-45.89%

-54.45%

  • tinybert_decoder

Model Type

Runtime Mode

Model Size(M)

RAM(K)

Latency(ms)

Cos-Similarity

Compression Ratio

Memory compared to FP32

Latency compared to FP32

FP32

FP32

43

51,355

4.161

1

FP32

FP16

43

29,462

2.184

0.99999

1

-42.63%

-47.51%

FP16

FP16

22

29,440

2.264

0.99999

1.95455

-42.67%

-45.59%

Weight Quant(8 Bit)

FP16

12

32,285

2.307

0.99998

3.58333

-37.13%

-44.56%

Dynamic Quant

INT8+FP32

12

22,181

2.074

0.9993

3.58333

-56.81%

-50.16%

Quantization Debug

Turn on the quantization Debug function, you can get the data distribution statistics report, which is used to evaluate the quantization error and assist the decision-making model (operator) whether it is suitable for quantization. For full quantification, N data distribution statistics reports will be generated according to the number of correction datasets provided, that is, one report will be generated for each round; for weighting, only one data distribution statistics report will be generated.

When setting the debug_info_save_path parameter, the relevant debug report will be generated in the /home/workspace/mindspore/debug_info_save_path folder:

[common_quant_param]
debug_info_save_path=/home/workspace/mindspore/debug_info_save_path

The quantized output summary report output_summary.csv contains the accuracy information of the output layer Tensor of the entire network. The related fields are as follows:

Type

Name

Round

The calibration training round

TensorName

The tensor name

CosineSimilarity

Cosine similarity compared with the original data

The data distribution statistics report report_*.csvwill count the original data distribution of each Tensor and the data distribution after dequantization of the quantized Tensor. The relevant fields of the data distribution statistics report are as follows:

Type

Name

NodeName

The node name

NodeType

The node type

TensorName

The tensor name

InOutFlag

The input or output tensor

DataTypeFlag

The data type, use Origin for original model, use Dequant for quantization model

TensorTypeFlag

The data types such as input and output, use Activation, and constants, etc., use Weight.

Min

The minimum value

Q1

The 25% quantile

Median

The median

Q3

The 75% quantile

MAX

The maximum

Mean

The mean

Var

The var

Sparsity

The sparsity

Clip

The Clip

CosineSimilarity

Cosine similarity compared with the original data

The quantization parameter report quant_param.csv contains the quantization parameter information of all quantized Tensors. The related fields of the quantization parameter are as follows:

Type

Name

NodeName

The node name

NodeType

The node type

TensorName

The tensor name

ElementsNum

The Tensor elements num

Dims

The tensor dims

Scale

The quantization parameter scale

ZeroPoint

The quantization parameter zeropoint

Bits

The number of quantization bits

CorrectionVar

Bias correction coefficient-variance

CorrectionMean

Bias correction coefficient-mean

Mixed bit quantization is non-standard quantization, the quantization parameter file may not exist.

Skip Quantization Node

Quantization is to convert the Float32 operator to the Int8 operator. The current quantization strategy is to quantify all the nodes contained in a certain type of operator that can be supported, but there are some nodes that are more sensitive and will cause larger errors after quantization. At the same time, the inference speed of some layers after quantization is much lower than that of Float16. It supports non-quantization of the specified layer, which can effectively improve the accuracy and inference speed.

Below is an example of conv2d_1 add_8 concat_1 without quantifying the three nodes:

[common_quant_param]
# Supports WEIGHT_QUANT or FULL_QUANT
quant_type=FULL_QUANT
# Weight quantization support the number of bits [0,16], Set to 0 is mixed bit quantization, otherwise it is fixed bit quantization
# Full quantization support 8bit
bit_num=8
# Set the name of the operator that skips the quantization, and use `,` to split between multiple operators.
skip_quant_node=conv2d_1,add_8,concat_1

Recommendations

  1. By filtering InOutFlag == Output && DataTypeFlag == Dequant, the output layer of all quantization operators can be filtered out, and the accuracy loss of the operator can be judged by looking at the quantized output CosineSimilarity, the closer to 1 the smaller the loss.

  2. For merging operators such as Add and Concat, if the distribution of min and max between different input Tensors is quite different, which is likely to cause large errors, you can set skip_quant_node to not quantize them.

  3. For operators with a higher cutoff rate Clip, you can set skip_quant_node to not quantize it.