From 27b76416228b900e7e7345dd096111646fd14772 Mon Sep 17 00:00:00 2001 From: "Tian, Feng" Date: Tue, 1 Nov 2022 13:27:29 +0800 Subject: [PATCH 1/3] Add new quantization document Signed-off-by: Tian, Feng --- docs/Quantization.md | 77 --------- docs/imgs/PTQ.png | Bin 11991 -> 0 bytes docs/imgs/QAT.png | Bin 13481 -> 0 bytes docs/imgs/accuracy_aware_tuning_flow.png | Bin 0 -> 76233 bytes docs/imgs/dynamic_quantization.png | Bin 9937 -> 0 bytes docs/quantization.md | 207 +++++++++++++++++++++++ 6 files changed, 207 insertions(+), 77 deletions(-) delete mode 100644 docs/Quantization.md delete mode 100644 docs/imgs/PTQ.png delete mode 100644 docs/imgs/QAT.png create mode 100644 docs/imgs/accuracy_aware_tuning_flow.png delete mode 100644 docs/imgs/dynamic_quantization.png create mode 100644 docs/quantization.md diff --git a/docs/Quantization.md b/docs/Quantization.md deleted file mode 100644 index dd3dbce3c7d..00000000000 --- a/docs/Quantization.md +++ /dev/null @@ -1,77 +0,0 @@ -# Quantization - -Quantization is a widely-used model compression technique that can reduce model size while also improving inference and training latency.
-The full precision data converts to low-precision, there is little degradation in model accuracy, but the inference performance of quantized model can gain higher performance by saving the memory bandwidth and accelerating computations with low precision instructions. Intel provided several lower precision instructions (ex: 8-bit or 16-bit multipliers), both training and inference can get benefits from them. -Refer to the Intel article on [lower numerical precision inference and training in deep learning](https://software.intel.com/content/www/us/en/develop/articles/lower-numerical-precision-deep-learning-inference-and-training.html). - -## Quantization Support Matrix - -Quantization methods include the following three types: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypesQuantizationDataset RequirementsFrameworkBackend
Post-Training Static Quantization (PTQ)weights and activationscalibrationPyTorchPyTorch Eager/PyTorch FX/IPEX
TensorFlowTensorFlow/Intel TensorFlow
ONNX RuntimeQLinearops/QDQ
Post-Training Dynamic QuantizationweightsnonePyTorchPyTorch eager mode/PyTorch fx mode/IPEX
ONNX RuntimeQIntegerops
Quantization-aware Training (QAT)weights and activationsfine-tuningPyTorchPyTorch eager mode/PyTorch fx mode/IPEX
TensorFlowTensorFlow/Intel TensorFlow
-
-
- - -### [Post-Training Static Quantization](./PTQ.md) performs quantization on already trained models, it requires an additional pass over the dataset to work, only activations do calibration. -PTQ -
- -### [Post-Training Dynamic Quantization](./dynamic_quantization.md) simply multiplies input values by a scaling factor, then rounds the result to the nearest, it determines the scale factor for activations dynamically based on the data range observed at runtime. Weights are quantized ahead of time but the activations are dynamically quantized during inference. -Dynamic Quantization -
- -### [Quantization-aware Training (QAT)](./QAT.md) quantizes models during training and typically provides higher accuracy comparing with post-training quantization, but QAT may require additional hyper-parameter tuning and it may take more time to deployment. -QAT - -## Examples of Quantization - -For Quantization related examples, please refer to [Quantization examples](/examples/README.md) diff --git a/docs/imgs/PTQ.png b/docs/imgs/PTQ.png deleted file mode 100644 index 9d6d8183409869dccb76f0f68e08e968f987f067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11991 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 G$o~V{%SpTd diff --git a/docs/imgs/QAT.png b/docs/imgs/QAT.png deleted file mode 100644 index 27c72efa583213f07df8511934ffb0ec44f375b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13481 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 z z<+QF2OM4k?-ZQv-^;~hr+XG2L4MIWx@jtp0B*qDzE7m51e}`+yN7w0p$ipp z6Bw;!`cmC-Xhe3(6v5RG9hW6RTTZeLxk`tHZ#Y;@px!Mr4qZI1lT{5$#Q=JI5UR(x z@s;l>3D5?#;Mi}X=(Iy_Kc>)fGjyIs?ibh?i53vlhsuQQ(2n(lo&KS(IlA(RpPu;k zziq6Jx?IqzDz2Zdk>vX^1r9G()6r1cI{s1-ARrPG>4XiV#{Oq8NCKpy>ho$jZroOE ztyBe1DhN$w5lzelDtp%=MG?yDT18^N`L;LO)lJ%03cVXh)p;siy4C9bPFtEZSkf~T z{zCh#rjinuQU@;rB{>%e`8RDU0R*T;?k{33phYGLCV>I9X*$JJ>LbwG$1V_P?U7Pj+aWxC zTmru+Xey1a*xeH>xwuJPE)L|x{O^cbM}X;gF-ftDwc8F8Ss6VJ~z^7bpcfQZV4$@eHoXPyU23vF1W;T;h6EL+`A zZ64HA+E*a2a{2ZGu-xw!{@hPgHUWHlv|PpEBrudt)bcwPHNSHVLz1REbo=yy=MP%( z*W!6fbymNeiLO7GGSNw>kM@{Nu$|R#21O4Cg|&a{$e$u1=2|&sg|rYWsPP%7_^QFi zG-0qme5K%WZL^4g?@b7PdJM$fTL&kAD*J=)kPu1@@652)SqQ8+@fMfqZ#P_i;yqV8 zp5&;h7Hm@{ODU>NDnW+HlQAu+Ux(t3YY1N>0RLzHrboOu#QUvK={xI?U zR^7AL%-T`jEXkXbU30YV_ci>15bnC?{eJf~TP|+eQz0()fi_j1X7;!WyV9!B8rdbB zw-d4t3Gs4A%usGP_)V|mp` z$hU@*eKM&ep7k5*mXV>ronXzobJ}kb&E?O&8z3N@osj z4d#xp(kf9Fx;4nP`&rM{3b)pz1Y@LDpc|bjQIT|6KoR(59x6PLjrfAsr(TMla}6;i zsx?;RkDOEX5nc1Ob9cKhUr$Re?zzp34u_;e#28XdmtbZ`x;~@+a1B}7lgvDuA4RYigms9PVw22AO`rI;L`9CVb1wUTuJy`l<8wo11`F0FR6)8)j!U6EXSE^IPzFWJ*R*~wyaeLr=+>CJtNV{i;Ji4s$bk{5id-j(*2cea z7FLYhIp=0qPXSJLP$an0x|l9l;#g$e5-5M8s?f7&#@#vE0s&XXt5rpm&`}w18#N+0 zy>n2tA_g7%IBqs+J#8IrHHFq+o%madND)L=#1=4Rfq6N2u5#rujnGbl7xKXv?3zLT6_c5QV1?D?+)^;GdSH}OAMa9DzNTbF+%P~U{J?3SZTG{N~b_9Tt#vU+Ih^`pelT%!* z?ER?jI1GfpjBnxbnCNY@8fTE-;S?iHKDh8+{{b$C`9mTL^d@|fH1ya5ECk=S$ay#h ztm*yk;^KFVo7jxu3S$G@vQJHbCEfS`N1s@7Y>@$A|9|4@Jw)D%)As=R-@l(YE+CH? amQ^EL*tyxE4~$Fu4|*QmSGxD)_x}dlfu$}0 literal 0 HcmV?d00001 diff --git a/docs/imgs/dynamic_quantization.png b/docs/imgs/dynamic_quantization.png deleted file mode 100644 index 2a71c0ea1eac15925b4d4f2c492f44d4da2aa276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9937 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 diff --git a/docs/quantization.md b/docs/quantization.md new file mode 100644 index 00000000000..46aea46d907 --- /dev/null +++ b/docs/quantization.md @@ -0,0 +1,207 @@ +Quantization +=============== + +1. [Quantization introduction](#quantization-introduction) +2. [Quantization fundamentals](#quantization-fundamentals) +3. [Accuracy aware tuning](#accuracy-aware-tuning) +4. [Supported feature matrix](#supported-feature-matrix) +5. [Get started](#get-started) +6. [Examples](#examples) + +## Quantization introduction + +Quantization is a very popular deep learning model optimization technique invented for improving the speed of inference. It minimizes the number of bits required by converting a set of real-valued numbers into the lower bit data representation, such as int8 and int4, mainly on inference phase with minimal to no loss in accuracy. This way reduces the memory requirement, cache miss rate, and computational cost of using neural networks and finally achieve the goal of higher inference performance. On Intel 3rd generation Xeon Scalable processor, user could expect up to 4x theoretical performance speedup. On Nvidia GPU, it could also bring significant inference performance speedup. + +## Quantization fundamentals + +`Affine quantization` and `Scale quantization` are two common range mapping techniques used in tensor conversion between different data types. + +The math equation is like: $X_{int8} = round(Scale \times X_{fp32} + ZeroPoint)$. + +**Affine Quantization** + +This is so-called `asymmetric quantization`, in which we map the min/max range in the float tensor to the integer range. Here int8 range is [-128, 127], uint8 range is [0, 255]. + +here: + +If INT8 is specified, $Scale = (|X_{f_{max}} - X_{f_{min}}|) / 127$ and $ZeroPoint = -128 - X_{f_{min}} / Scale$. + +or + +If UINT8 is specified, $Scale = (|X_{f_{max}} - X_{f_{min}}|) / 255$ and $ZeroPoint = - X_{f_{min}} / Scale$. + +**Scale Quantization** + +This is so-called `Symmetric quantization`, in which we use the maximum absolute value in the float tensor as float range and map to the corresponding integer range. + +The math equation is like: + +here: + +If INT8 is specified, $Scale = max(abs(X_{f_{max}}), abs(X_{f_{min}})) / 127$ and $ZeroPoint = 0$. + +or + +If UINT8 is specified, $Scale = max(abs(X_{f_{max}}), abs(X_{f_{min}})) / 255$ and $ZeroPoint = 128$. + +*NOTE* + +Sometimes the reduce_range feature, that's using 7 bit width (1 sign bit + 6 data bits) to represent int8 range, may be needed on some early Xeon platforms, it's because those platforms may have overflow issues due to fp16 intermediate calculation result when executing int8 dot product operation. After AVX512_VNNI instruction is introduced, this issue gets solved by supporting fp32 intermediate data. + +### Quantization approaches + +Quantization has three different approaches: 1) post training dynamic quantization 2) post training static quantization 3) quantization aware training. The first two approaches belong to optimization on inference. The last belongs to optimization during training. + +#### Post training dynamic quantization + +The weights of the neural network get quantized into int8 format from float32 format offline. The activations of the neural network is quantized as well with the min/max range collected during inference runtime. + +This approach is widely used in dynamic length neural networks, like NLP model. + +#### Post training static quantization + +Compared with `post training dynamic quantization`, the min/max range in weights and activations are collected offline on a so-called `calibration` dataset. This dataset should be able to represent the data distribution of those unseen inference dataset. The `calibration` process runs on the original fp32 model and dumps out all the tensor distributions for `Scale` and `ZeroPoint` calculations. Usually preparing 100 samples are enough for calibration. + +This approach is major quantization approach people should try because it could provide the better performance comparing with `post training dynamic quantization`. + +#### Quantization aware training + +Quantization aware training emulates inference-time quantization in the forward pass of the training process by inserting `fake quant` ops before those quantizable ops. With `quantization aware training`, all weights and activations are `fake quantized` during both the forward and backward passes of training: that is, float values are rounded to mimic int8 values, but all computations are still done with floating point numbers. Thus, all the weight adjustments during training are made while aware of the fact that the model will ultimately be quantized; after quantizing, therefore, this method will usually yield higher accuracy than either dynamic quantization or post-training static quantization. + +## Accuracy aware tuning + +Accuracy aware tuning is one of unique features provided by Intel(R) Neural Compressor, compared with other 3rd party model compression tools. This feature can be used to solve accuracy loss pain points brought by applying low precision quantization and other lossy optimization methods. + +This tuning algorithm creates a tuning space by querying framework quantization capability and model structure, selects the ops to be quantized by the tuning strategy, generates quantized graph, and evaluates the accuracy of this quantized graph. The optimal model will be yielded if the pre-defined accuracy goal is met. + +### Working flow + +Currently `accuracy aware tuning` supports `post training quantization`, `quantization aware training`, and `pruning`. Other during-training optimization tunings are under development. + +User could refer to below chart to understand the whole tuning flow. + +accuracy aware tuning working flow + +## Supported feature matrix + +Quantization methods include the following three types: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypesQuantizationDataset RequirementsFrameworkBackend
Post-Training Static Quantization (PTQ)weights and activationscalibrationPyTorchPyTorch Eager/PyTorch FX/IPEX
TensorFlowTensorFlow/Intel TensorFlow
ONNX RuntimeQLinearops/QDQ
Post-Training Dynamic QuantizationweightsnonePyTorchPyTorch eager mode/PyTorch fx mode/IPEX
ONNX RuntimeQIntegerops
Quantization-aware Training (QAT)weights and activationsfine-tuningPyTorchPyTorch eager mode/PyTorch fx mode/IPEX
TensorFlowTensorFlow/Intel TensorFlow
+
+
+ +## Get started + +The design philosophy of the quantization interface of Intel(R) Neural Compressor is easy-of-use. It requests user to provide `model`, `calibration dataloader`, and `evaluation function`. Those parameters would be used to quantize and tune the model. + +`model` is the framework model location or the framework model object. + +`calibration dataloader` is used to load the data samples for calibration phase. In most cases, it could be the partial samples of the evaluation dataset. + +`evaluation function` is a function used to evaluate model accuracy. This function should be same with how user makes evaluation on fp32 model, just taking `model` as input and returning a scalar value represented the evaluation accuracy. + +User could execute: + +1. Quantization without tuning + +This means user could leverage Intel(R) Neural Compressor to directly generate a fully quantized model without accuracy aware tuning. It's user responsibility to ensure the accuracy of the quantized model meets expectation. + +``` +# main.py + +# Original code +model = ResNet50() +val_dataset = ... +val_dataloader = torch.utils.data.Dataloader( + val_dataset, + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, ping_memory=True) + +# Quantization code +from neural_compressor import quantization +q_model = quantization.fit(model, calib_dataloader=val_dataloader) +q_model.save('./output') + +``` + +2. Quantization with accuracy aware tuning + +This means user could leverage the advance feature of Intel(R) Neural Compressor to tune out a best quantized model which has best accuracy and good performance. + +``` +# main.py + +# Original code +model = ResNet50() +val_dataset = ... +val_dataloader = torch.utils.data.Dataloader( + val_dataset, + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, ping_memory=True) +criterion = ... + +def validate(val_loader, model, criterion, args): + ... + return top1.avg + +# Quantization code +def eval_func(model): + return validate(val_dataloader, model, criterion, args) + +from neural_compressor import quantization +q_model = quantization.fit(model, calib_dataloader=val_dataloader, eval_func=eval_func) +q_model.save('./output') + +``` + +## Examples + +User could refer to [examples](https://github.com/intel/neural-compressor/blob/master/examples/README.md) on how to quantize a new model. From 6469610bd262a47cb1d408059567329f18cd964f Mon Sep 17 00:00:00 2001 From: "Tian, Feng" Date: Wed, 23 Nov 2022 10:40:34 +0800 Subject: [PATCH 2/3] Using capital letter for headlines Signed-off-by: Tian, Feng --- docs/quantization.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/quantization.md b/docs/quantization.md index 46aea46d907..84569beeead 100644 --- a/docs/quantization.md +++ b/docs/quantization.md @@ -8,11 +8,11 @@ Quantization 5. [Get started](#get-started) 6. [Examples](#examples) -## Quantization introduction +## Quantization Introduction Quantization is a very popular deep learning model optimization technique invented for improving the speed of inference. It minimizes the number of bits required by converting a set of real-valued numbers into the lower bit data representation, such as int8 and int4, mainly on inference phase with minimal to no loss in accuracy. This way reduces the memory requirement, cache miss rate, and computational cost of using neural networks and finally achieve the goal of higher inference performance. On Intel 3rd generation Xeon Scalable processor, user could expect up to 4x theoretical performance speedup. On Nvidia GPU, it could also bring significant inference performance speedup. -## Quantization fundamentals +## Quantization Fundamentals `Affine quantization` and `Scale quantization` are two common range mapping techniques used in tensor conversion between different data types. @@ -48,33 +48,33 @@ If UINT8 is specified, $Scale = max(abs(X_{f_{max}}), abs(X_{f_{min}})) / 255$ a Sometimes the reduce_range feature, that's using 7 bit width (1 sign bit + 6 data bits) to represent int8 range, may be needed on some early Xeon platforms, it's because those platforms may have overflow issues due to fp16 intermediate calculation result when executing int8 dot product operation. After AVX512_VNNI instruction is introduced, this issue gets solved by supporting fp32 intermediate data. -### Quantization approaches +### Quantization Approaches Quantization has three different approaches: 1) post training dynamic quantization 2) post training static quantization 3) quantization aware training. The first two approaches belong to optimization on inference. The last belongs to optimization during training. -#### Post training dynamic quantization +#### Post Training Dynamic Quantization The weights of the neural network get quantized into int8 format from float32 format offline. The activations of the neural network is quantized as well with the min/max range collected during inference runtime. This approach is widely used in dynamic length neural networks, like NLP model. -#### Post training static quantization +#### Post Training Static Quantization Compared with `post training dynamic quantization`, the min/max range in weights and activations are collected offline on a so-called `calibration` dataset. This dataset should be able to represent the data distribution of those unseen inference dataset. The `calibration` process runs on the original fp32 model and dumps out all the tensor distributions for `Scale` and `ZeroPoint` calculations. Usually preparing 100 samples are enough for calibration. This approach is major quantization approach people should try because it could provide the better performance comparing with `post training dynamic quantization`. -#### Quantization aware training +#### Quantization Aware Training Quantization aware training emulates inference-time quantization in the forward pass of the training process by inserting `fake quant` ops before those quantizable ops. With `quantization aware training`, all weights and activations are `fake quantized` during both the forward and backward passes of training: that is, float values are rounded to mimic int8 values, but all computations are still done with floating point numbers. Thus, all the weight adjustments during training are made while aware of the fact that the model will ultimately be quantized; after quantizing, therefore, this method will usually yield higher accuracy than either dynamic quantization or post-training static quantization. -## Accuracy aware tuning +## Accuracy Aware Tuning Accuracy aware tuning is one of unique features provided by Intel(R) Neural Compressor, compared with other 3rd party model compression tools. This feature can be used to solve accuracy loss pain points brought by applying low precision quantization and other lossy optimization methods. This tuning algorithm creates a tuning space by querying framework quantization capability and model structure, selects the ops to be quantized by the tuning strategy, generates quantized graph, and evaluates the accuracy of this quantized graph. The optimal model will be yielded if the pre-defined accuracy goal is met. -### Working flow +### Working Flow Currently `accuracy aware tuning` supports `post training quantization`, `quantization aware training`, and `pruning`. Other during-training optimization tunings are under development. @@ -82,7 +82,7 @@ User could refer to below chart to understand the whole tuning flow. accuracy aware tuning working flow -## Supported feature matrix +## Supported Feature Matrix Quantization methods include the following three types: @@ -138,7 +138,7 @@ Quantization methods include the following three types:

-## Get started +## Get Started The design philosophy of the quantization interface of Intel(R) Neural Compressor is easy-of-use. It requests user to provide `model`, `calibration dataloader`, and `evaluation function`. Those parameters would be used to quantize and tune the model. From e6b2bd4f1cda3dd2191ea13216f53b8f81fe09e6 Mon Sep 17 00:00:00 2001 From: "chen, suyue" Date: Wed, 23 Nov 2022 10:50:25 +0800 Subject: [PATCH 3/3] Update quantization.md --- docs/quantization.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/quantization.md b/docs/quantization.md index 84569beeead..951c6e4e5d1 100644 --- a/docs/quantization.md +++ b/docs/quantization.md @@ -1,11 +1,11 @@ Quantization =============== -1. [Quantization introduction](#quantization-introduction) -2. [Quantization fundamentals](#quantization-fundamentals) -3. [Accuracy aware tuning](#accuracy-aware-tuning) -4. [Supported feature matrix](#supported-feature-matrix) -5. [Get started](#get-started) +1. [Quantization Introduction](#quantization-introduction) +2. [Quantization Fundamentals](#quantization-fundamentals) +3. [Accuracy Aware Tuning](#accuracy-aware-tuning) +4. [Supported Feature Matrix](#supported-feature-matrix) +5. [Get Started](#get-started) 6. [Examples](#examples) ## Quantization Introduction