From 109fdbedbd94958481d6271e747937cac2113f42 Mon Sep 17 00:00:00 2001 From: Reuven <44209964+reuvenperetz@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:22:47 +0200 Subject: [PATCH] Update docsrc (#1339) * Update docsrc. * Fix comments that were parsed wrongly in docs. --------- Co-authored-by: reuvenp --- docsrc/images/tpc_diagram.png | Bin 0 -> 52824 bytes .../api_docs/classes/GradientPTQConfig.rst | 21 +++++++- .../modules/target_platform_capabilities.rst | 2 +- docsrc/source/diagrams/tpc.mermaid | 46 ++++++++++++++++++ .../quantization/quantization_config.py | 3 -- .../gptq/pytorch/quantization_facade.py | 1 + .../pytorch/quantizer/quantization_builder.py | 3 -- .../qat/pytorch/quantization_facade.py | 21 ++++---- 8 files changed, 77 insertions(+), 20 deletions(-) create mode 100644 docsrc/images/tpc_diagram.png create mode 100644 docsrc/source/diagrams/tpc.mermaid diff --git a/docsrc/images/tpc_diagram.png b/docsrc/images/tpc_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3f172b5e9a64822464254f75f3999eb3c6f26c32 GIT binary patch literal 52824 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 AQvd(} literal 0 HcmV?d00001 diff --git a/docsrc/source/api/api_docs/classes/GradientPTQConfig.rst b/docsrc/source/api/api_docs/classes/GradientPTQConfig.rst index c14ec1e7c..711c4f2d1 100644 --- a/docsrc/source/api/api_docs/classes/GradientPTQConfig.rst +++ b/docsrc/source/api/api_docs/classes/GradientPTQConfig.rst @@ -8,7 +8,7 @@ GradientPTQConfig Class ================================= -**The following API can be used to create a GradientPTQConfig instance which can be used for post training quantization using knowledge distillation from a teacher (float Keras model) to a student (the quantized Keras model)** +**The following API can be used to create a GradientPTQConfig instance which can be used for post training quantization using knowledge distillation from a teacher (float model) to a student (the quantized model)** .. autoclass:: model_compression_toolkit.gptq.GradientPTQConfig :members: @@ -30,3 +30,22 @@ RoundingType .. autoclass:: model_compression_toolkit.gptq.RoundingType :members: + + +===================================== +GradualActivationQuantizationConfig +===================================== + +**The following API can be used to configure the gradual activation quantization when using GPTQ.** + +.. autoclass:: model_compression_toolkit.gptq.GradualActivationQuantizationConfig + :members: + + +===================================== +QFractionLinearAnnealingConfig +===================================== + +.. autoclass:: model_compression_toolkit.gptq.QFractionLinearAnnealingConfig + :members: + diff --git a/docsrc/source/api/api_docs/modules/target_platform_capabilities.rst b/docsrc/source/api/api_docs/modules/target_platform_capabilities.rst index bbd025ff7..5e0dd9252 100644 --- a/docsrc/source/api/api_docs/modules/target_platform_capabilities.rst +++ b/docsrc/source/api/api_docs/modules/target_platform_capabilities.rst @@ -27,7 +27,7 @@ Models for IMX500, TFLite and qnnpack can be observed `here Kernel, Bias"] + + OQC1 -->|contains| AQC + OQC2 -->|contains| AQC + OQC3 -->|contains| AQC + end + + Mixed -->|contains| OQC1 + Mixed -->|contains| OQC2 + Mixed -->|contains| OQC3 + end + + subgraph OPS["Operators Sets"] + Conv["Conv, Conv Transpose,
Depthwise Conv"] + Act["ReLU, ReLU6,
Leaky ReLU, etc."] + NoQuantOps["Dropout, Flatten,
Reshape, etc."] + end + + subgraph FP["Fusing Patterns"] + FP1["Conv + Activation"] + end + + Mixed -->|attached to| Conv + Default -->|attached to| Act + NoQuant -->|attached to| NoQuantOps + + FP1 -.-> Conv + FP1 -.-> Act + end + + style TPC fill:#e6f3ff,stroke:#333 + style QCO fill:#e6ffe6,stroke:#333 + style OQC fill:#fff9e6,stroke:#333 + style OPS fill:#ffe6e6,stroke:#333 + style FP fill:#ffe6f0,stroke:#333 diff --git a/model_compression_toolkit/core/common/quantization/quantization_config.py b/model_compression_toolkit/core/common/quantization/quantization_config.py index 5c8df6b33..8591e6f13 100644 --- a/model_compression_toolkit/core/common/quantization/quantization_config.py +++ b/model_compression_toolkit/core/common/quantization/quantization_config.py @@ -78,9 +78,6 @@ class QuantizationConfig: >>> qc = mct.core.QuantizationConfig(activation_error_method=mct.core.QuantizationErrorMethod.NOCLIPPING, weights_error_method=mct.core.QuantizationErrorMethod.MSE, relu_bound_to_power_of_2=True, weights_bias_correction=True) - The QuantizationConfig instance can then be used in the quantization workflow, - such as with Keras in the function: :func:~model_compression_toolkit.ptq.keras_post_training_quantization`. - """ activation_error_method: QuantizationErrorMethod = QuantizationErrorMethod.MSE diff --git a/model_compression_toolkit/gptq/pytorch/quantization_facade.py b/model_compression_toolkit/gptq/pytorch/quantization_facade.py index c16ec0ab6..0ba7581a3 100644 --- a/model_compression_toolkit/gptq/pytorch/quantization_facade.py +++ b/model_compression_toolkit/gptq/pytorch/quantization_facade.py @@ -77,6 +77,7 @@ def get_pytorch_gptq_config(n_epochs: int, regularization_factor (float): A floating point number that defines the regularization factor. hessian_batch_size (int): Batch size for Hessian computation in Hessian-based weights GPTQ. use_hessian_sample_attention (bool): whether to use Sample-Layer Attention score for weighted loss. + gradual_activation_quantization (bool, GradualActivationQuantizationConfig): If False, GradualActivationQuantization is disabled. If True, GradualActivationQuantization is enabled with the default settings. GradualActivationQuantizationConfig object can be passed to use non-default settings. returns: a GradientPTQConfig object to use when fine-tuning the quantized model using gptq. diff --git a/model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py b/model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py index ba5e590c1..f68b72d0c 100644 --- a/model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py +++ b/model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py @@ -16,12 +16,9 @@ from model_compression_toolkit.gptq import GradientPTQConfig from model_compression_toolkit.core import common -from model_compression_toolkit.exporter.model_wrapper.pytorch.builder.node_to_quantizer import \ - get_activation_inferable_quantizer_kwargs from model_compression_toolkit.gptq.pytorch.quantizer.base_pytorch_gptq_quantizer import \ BasePytorchGPTQTrainableQuantizer from mct_quantizers import QuantizationTarget -from mct_quantizers.common.get_quantizers import get_inferable_quantizer_class from mct_quantizers.pytorch.quantizers import BasePyTorchInferableQuantizer from model_compression_toolkit.logger import Logger diff --git a/model_compression_toolkit/qat/pytorch/quantization_facade.py b/model_compression_toolkit/qat/pytorch/quantization_facade.py index 938471034..f58215ed7 100644 --- a/model_compression_toolkit/qat/pytorch/quantization_facade.py +++ b/model_compression_toolkit/qat/pytorch/quantization_facade.py @@ -110,7 +110,6 @@ def pytorch_quantization_aware_training_init_experimental(in_model: Module, User information that may be needed to handle the quantized model. Examples: - Import MCT: >>> import model_compression_toolkit as mct @@ -120,21 +119,19 @@ def pytorch_quantization_aware_training_init_experimental(in_model: Module, >>> from torchvision.models import mobilenet_v2 >>> model = mobilenet_v2(pretrained=True) - Create a random dataset generator, for required number of calibration iterations (num_calibration_batches): - In this example a random dataset of 10 batches each containing 4 images is used. + Create a random dataset generator, for required number of calibration iterations (num_calibration_batches). In this example, a random dataset of 10 batches each containing 4 images is used: - >>> import numpy as np - >>> num_calibration_batches = 10 - >>> def repr_datagen(): - >>> for _ in range(num_calibration_batches): - >>> yield [np.random.random((4, 3, 224, 224))] + >>> import numpy as np + >>> num_calibration_batches = 10 + >>> def repr_datagen(): + >>> for _ in range(num_calibration_batches): + >>> yield [np.random.random((4, 3, 224, 224))] Create a MCT core config, containing the quantization configuration: >>> config = mct.core.CoreConfig() - Pass the model, the representative dataset generator, the configuration and the target resource utilization to get a - quantized model. Now the model contains quantizer wrappers for fine tunning the weights: + Pass the model, the representative dataset generator, the configuration and the target resource utilization to get a quantized model. Now the model contains quantizer wrappers for fine tunning the weights: >>> quantized_model, quantization_info = mct.qat.pytorch_quantization_aware_training_init_experimental(model, repr_datagen, core_config=config) @@ -149,8 +146,8 @@ def pytorch_quantization_aware_training_init_experimental(in_model: Module, if core_config.is_mixed_precision_enabled: if not isinstance(core_config.mixed_precision_config, MixedPrecisionQuantizationConfig): Logger.critical("Given quantization config to mixed-precision facade is not of type " - "MixedPrecisionQuantizationConfig. Please use pytorch_post_training_quantization API," - "or pass a valid mixed precision configuration.") + "MixedPrecisionQuantizationConfig. Please use pytorch_post_training_quantization API," + "or pass a valid mixed precision configuration.") tb_w = init_tensorboard_writer(DEFAULT_PYTORCH_INFO) fw_impl = PytorchImplementation()