Quark ONNX Quantization Example for BFP#
This folder contains an example of quantizing a mobilenetv2_050.lamb_in1k model using the ONNX quantizer of Quark with BFP16. Int8 quantization performs poorly on the model, but BFP16 and ADAQUANT can significantly mitigate the quantization loss.
Block Floating Point (BFP) quantization computational complexity by grouping numbers to share a common exponent, preserving accuracy efficiently. BFP has both reduced storage requirements and high quantization precision.
The example has the following parts:
Pip requirements#
Install the necessary python packages:
python -m pip install -r ../utils/requirements.txt
Prepare model#
Export onnx model from mobilenetv2_050.lamb_in1k torch model:
mkdir models && python ../utils/export_onnx.py mobilenetv2_050.lamb_in1k
Prepare data#
ILSVRC 2012, commonly known as ‘ImageNet’. This dataset provides access to ImageNet (ILSVRC) 2012 which is the most commonly used subset of ImageNet. This dataset spans 1000 object classes and contains 50,000 validation images.
If you already have an ImageNet datasets, you can directly use your dataset path.
To prepare the test data, please check the download section of the main website: https://huggingface.co/datasets/imagenet-1k/tree/main/data. You need to register and download val_images.tar.gz.
Then, create the validation dataset and calibration dataset:
mkdir val_data && tar -xzf val_images.tar.gz -C val_data
python ../utils/prepare_data.py val_data calib_data
The storage format of the val_data of the ImageNet dataset organized as follows:
val_data
n01440764
ILSVRC2012_val_00000293.JPEG
ILSVRC2012_val_00002138.JPEG
…
n01443537
ILSVRC2012_val_00000236.JPEG
ILSVRC2012_val_00000262.JPEG
…
…
n15075141
ILSVRC2012_val_00001079.JPEG
ILSVRC2012_val_00002663.JPEG
…
The storage format of the calib_data of the ImageNet dataset organized as follows:
calib_data
n01440764
ILSVRC2012_val_00000293.JPEG
n01443537
ILSVRC2012_val_00000236.JPEG
…
n15075141
ILSVRC2012_val_00001079.JPEG
BFP16 Quantization#
The quantizer takes the float model and produce a BFP16 quantized model.
python quantize_model.py --model_name mobilenetv2_050.lamb_in1k \
--input_model_path models/mobilenetv2_050.lamb_in1k.onnx \
--output_model_path models/mobilenetv2_050.lamb_in1k_quantized.onnx \
--calibration_dataset_path calib_data \
--config BFP16
This command will generate a BFP16 quantized model under the models folder, which was quantized by BFP16 configuration.
BFP16 Quantization with ADAQUANT#
The quantizer takes the float model and produce a BFP16 quantized model with ADAQUANT.
Note: If the model has dynamic shapes, you need to convert the model to fixed shapes before performing ADAQUANT.
python -m quark.onnx.tools.convert_dynamic_to_fixed --fix_shapes 'input:[1,3,224,224]' models/mobilenetv2_050.lamb_in1k.onnx models/mobilenetv2_050.lamb_in1k_fix.onnx
python quantize_model.py --model_name mobilenetv2_050.lamb_in1k \
--input_model_path models/mobilenetv2_050.lamb_in1k_fix.onnx \
--output_model_path models/mobilenetv2_050.lamb_in1k_adaquant_quantized.onnx \
--calibration_dataset_path calib_data \
--config BFP16_ADAQUANT
This command will generate a BFP16 quantized model under the models folder, which was quantized by BFP16 configuration with ADAQUANT.
Evaluation#
Test the accuracy of the float model on ImageNet val dataset:
python ../utils/onnx_validate.py val_data --model-name mobilenetv2_050.lamb_in1k --batch-size 1 --onnx-input models/mobilenetv2_050.lamb_in1k.onnx
Test the accuracy of the BFP16 quantized model on ImageNet val dataset:
python ../utils/onnx_validate_with_custom_op.py val_data --model-name mobilenetv2_050.lamb_in1k --batch-size 1 --onnx-input models/mobilenetv2_050.lamb_in1k_quantized.onnx
If want to run faster with GPU support, you can also execute the following command:
python ../utils/onnx_validate_with_custom_op.py val_data --model-name mobilenetv2_050.lamb_in1k --batch-size 1 --onnx-input models/mobilenetv2_050.lamb_in1k_quantized.onnx --gpu
Test the accuracy of the BFP16 quantized model with ADAQUANT on ImageNet val dataset:
python ../utils/onnx_validate_with_custom_op.py val_data --model-name mobilenetv2_050.lamb_in1k --batch-size 1 --onnx-input models/mobilenetv2_050.lamb_in1k_adaquant_quantized.onnx
If want to run faster with GPU support, you can also execute the following command:
python ../utils/onnx_validate_with_custom_op.py val_data --model-name mobilenetv2_050.lamb_in1k --batch-size 1 --onnx-input models/mobilenetv2_050.lamb_in1k_adaquant_quantized.onnx --gpu
Float Model |
Quantized Model without ADAQUANT |
Quantized Model with ADAQUANT |
|
---|---|---|---|
Model Size |
8.7 MB |
8.4 MB |
8.4 MB |
P rec@1 |
65.424 % |
60.838% |
62.262 % |
P rec@5 |
85.788 % |
82.658% |
83.736 % |
Note: Different machine models can lead to minor variations in the accuracy of quantized model with adaquant.
License#
Copyright (C) 2024, Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: MIT