From 9578f3c23fa16ea55c3a97a09e6128c5bbbb21e0 Mon Sep 17 00:00:00 2001 From: Reuven Peretz <44209964+reuvenperetz@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:53:53 +0200 Subject: [PATCH] Update docs for v2.3.0 (#1355) Co-authored-by: reuvenp --- docs/.buildinfo | 2 +- .../classes/GradientPTQConfig.rst.txt | 21 +- docs/_sources/api/api_docs/index.rst.txt | 6 +- .../get_target_platform_capabilities.rst.txt | 2 +- .../api_docs/modules/layer_filters.rst.txt | 14 +- .../api/api_docs/modules/qat_config.rst.txt | 5 +- ...t => target_platform_capabilities.rst.txt} | 59 +- .../modules/trainable_infrastructure.rst.txt | 13 +- .../api/api_docs/notes/tpc_note.rst.txt | 4 +- docs/api/api_docs/classes/BitWidthConfig.html | 8 +- .../classes/DataGenerationConfig.html | 6 +- docs/api/api_docs/classes/DefaultDict.html | 6 +- docs/api/api_docs/classes/FrameworkInfo.html | 8 +- .../api_docs/classes/GradientPTQConfig.html | 85 ++- .../MixedPrecisionQuantizationConfig.html | 8 +- .../api_docs/classes/MpDistanceWeighting.html | 6 +- docs/api/api_docs/classes/PruningConfig.html | 6 +- docs/api/api_docs/classes/PruningInfo.html | 6 +- .../api_docs/classes/QuantizationConfig.html | 43 +- .../classes/QuantizationErrorMethod.html | 6 +- .../api_docs/classes/ResourceUtilization.html | 22 +- docs/api/api_docs/classes/XQuantConfig.html | 6 +- docs/api/api_docs/index.html | 14 +- .../get_keras_data_generation_config.html | 6 +- .../methods/get_keras_gptq_config.html | 18 +- .../get_pytorch_data_generation_config.html | 6 +- .../methods/get_pytroch_gptq_config.html | 20 +- .../get_target_platform_capabilities.html | 30 +- .../keras_data_generation_experimental.html | 6 +- ...s_gradient_post_training_quantization.html | 8 +- docs/api/api_docs/methods/keras_kpi_data.html | 8 +- .../methods/keras_load_quantizad_model.html | 6 +- .../keras_post_training_quantization.html | 8 +- .../methods/keras_pruning_experimental.html | 8 +- ..._aware_training_finalize_experimental.html | 6 +- ...tion_aware_training_init_experimental.html | 8 +- .../pytorch_data_generation_experimental.html | 6 +- ...h_gradient_post_training_quantization.html | 10 +- .../api_docs/methods/pytorch_kpi_data.html | 8 +- .../pytorch_post_training_quantization.html | 10 +- .../methods/pytorch_pruning_experimental.html | 8 +- ..._aware_training_finalize_experimental.html | 6 +- ...tion_aware_training_init_experimental.html | 20 +- .../api/api_docs/methods/set_logger_path.html | 6 +- .../xquant_report_keras_experimental.html | 6 +- .../xquant_report_pytorch_experimental.html | 6 +- docs/api/api_docs/modules/core_config.html | 15 +- docs/api/api_docs/modules/debug_config.html | 12 +- docs/api/api_docs/modules/exporter.html | 6 +- docs/api/api_docs/modules/layer_filters.html | 34 +- docs/api/api_docs/modules/network_editor.html | 6 +- docs/api/api_docs/modules/qat_config.html | 21 +- .../api/api_docs/modules/target_platform.html | 350 ------------ .../modules/target_platform_capabilities.html | 504 ++++++++++++++++++ .../modules/trainable_infrastructure.html | 47 +- docs/api/api_docs/notes/tpc_note.html | 10 +- docs/genindex.html | 115 ++-- docs/guidelines/visualization.html | 6 +- docs/images/tpc.jpg | Bin 69512 -> 0 bytes docs/images/tpc_diagram.png | Bin 0 -> 52824 bytes docs/index.html | 6 +- docs/objects.inv | Bin 6069 -> 6328 bytes docs/search.html | 6 +- docs/searchindex.js | 2 +- docs/static/bizstyle.js | 2 +- docs/static/documentation_options.js | 2 +- 66 files changed, 973 insertions(+), 751 deletions(-) rename docs/_sources/api/api_docs/modules/{target_platform.rst.txt => target_platform_capabilities.rst.txt} (51%) delete mode 100644 docs/api/api_docs/modules/target_platform.html create mode 100644 docs/api/api_docs/modules/target_platform_capabilities.html delete mode 100644 docs/images/tpc.jpg create mode 100644 docs/images/tpc_diagram.png diff --git a/docs/.buildinfo b/docs/.buildinfo index eafc4f405..ee11fdd63 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 463b5d411b812fb296a8f7bff970d1cf +config: e8534f6a2f0b425ce862dbeb0800af00 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_sources/api/api_docs/classes/GradientPTQConfig.rst.txt b/docs/_sources/api/api_docs/classes/GradientPTQConfig.rst.txt index c14ec1e7c..711c4f2d1 100644 --- a/docs/_sources/api/api_docs/classes/GradientPTQConfig.rst.txt +++ b/docs/_sources/api/api_docs/classes/GradientPTQConfig.rst.txt @@ -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/docs/_sources/api/api_docs/index.rst.txt b/docs/_sources/api/api_docs/index.rst.txt index 0c4433163..cd78a4b5c 100644 --- a/docs/_sources/api/api_docs/index.rst.txt +++ b/docs/_sources/api/api_docs/index.rst.txt @@ -106,9 +106,9 @@ keras_load_quantized_model - :ref:`keras_load_quantized_model`: A function to load a quantized keras model. -target_platform -================ -- :ref:`target_platform`: Module to create and model hardware-related settings to optimize the model according to, by the hardware the optimized model will use during inference. +target_platform_capabilities +============================== +- :ref:`target_platform_capabilities`: Module to create and model hardware-related settings to optimize the model according to, by the hardware the optimized model will use during inference. - :ref:`get_target_platform_capabilities`: A function to get a target platform model for Tensorflow and Pytorch. - :ref:`DefaultDict`: Util class for creating a TargetPlatformCapabilities. diff --git a/docs/_sources/api/api_docs/methods/get_target_platform_capabilities.rst.txt b/docs/_sources/api/api_docs/methods/get_target_platform_capabilities.rst.txt index cc623b66a..e8346a359 100644 --- a/docs/_sources/api/api_docs/methods/get_target_platform_capabilities.rst.txt +++ b/docs/_sources/api/api_docs/methods/get_target_platform_capabilities.rst.txt @@ -4,7 +4,7 @@ ======================================= -Get TargetPlatformCapabilities +Get FrameworkQuantizationCapabilities ======================================= .. autofunction:: model_compression_toolkit.get_target_platform_capabilities diff --git a/docs/_sources/api/api_docs/modules/layer_filters.rst.txt b/docs/_sources/api/api_docs/modules/layer_filters.rst.txt index 2279e54b6..f21836e08 100644 --- a/docs/_sources/api/api_docs/modules/layer_filters.rst.txt +++ b/docs/_sources/api/api_docs/modules/layer_filters.rst.txt @@ -15,30 +15,30 @@ one may use the next filters to check if a layer configuration holds the created Attribute Filters ================== -.. autoclass:: model_compression_toolkit.target_platform.AttributeFilter +.. autoclass:: model_compression_toolkit.target_platform_capabilities.AttributeFilter | -.. autoclass:: model_compression_toolkit.target_platform.Eq +.. autoclass:: model_compression_toolkit.target_platform_capabilities.Eq | -.. autoclass:: model_compression_toolkit.target_platform.NotEq +.. autoclass:: model_compression_toolkit.target_platform_capabilities.NotEq | -.. autoclass:: model_compression_toolkit.target_platform.Greater +.. autoclass:: model_compression_toolkit.target_platform_capabilities.Greater | -.. autoclass:: model_compression_toolkit.target_platform.GreaterEq +.. autoclass:: model_compression_toolkit.target_platform_capabilities.GreaterEq | -.. autoclass:: model_compression_toolkit.target_platform.Smaller +.. autoclass:: model_compression_toolkit.target_platform_capabilities.Smaller | -.. autoclass:: model_compression_toolkit.target_platform.SmallerEq +.. autoclass:: model_compression_toolkit.target_platform_capabilities.SmallerEq diff --git a/docs/_sources/api/api_docs/modules/qat_config.rst.txt b/docs/_sources/api/api_docs/modules/qat_config.rst.txt index 9583aee88..c7dfcc9ea 100644 --- a/docs/_sources/api/api_docs/modules/qat_config.rst.txt +++ b/docs/_sources/api/api_docs/modules/qat_config.rst.txt @@ -10,10 +10,7 @@ qat_config Module TrainingMethod ================================ -**Select a QAT training method:** - -.. autoclass:: model_compression_toolkit.qat.TrainingMethod - +In order to select a training method, please visit the :ref:`trainable_infrastructure API.` | diff --git a/docs/_sources/api/api_docs/modules/target_platform.rst.txt b/docs/_sources/api/api_docs/modules/target_platform_capabilities.rst.txt similarity index 51% rename from docs/_sources/api/api_docs/modules/target_platform.rst.txt rename to docs/_sources/api/api_docs/modules/target_platform_capabilities.rst.txt index c393cb21a..5e0dd9252 100644 --- a/docs/_sources/api/api_docs/modules/target_platform.rst.txt +++ b/docs/_sources/api/api_docs/modules/target_platform_capabilities.rst.txt @@ -1,11 +1,11 @@ :orphan: -.. _ug-target_platform: +.. _ug-target_platform_capabilities: -================================= -target_platform Module -================================= +===================================== +target_platform_capabilities Module +===================================== MCT can be configured to quantize and optimize models for different hardware settings. For example, when using qnnpack backend for Pytorch model inference, Pytorch `quantization @@ -14,7 +14,7 @@ uses `per-tensor weights quantization `_. -This can be addressed in MCT by using the target_platform module, that can configure different +This can be addressed in MCT by using the target_platform_capabilities module, that can configure different parameters that are hardware-related, and the optimization process will use this to optimize the model accordingly. Models for IMX500, TFLite and qnnpack can be observed `here `_, and can be used using :ref:`get_target_platform_capabilities function`. @@ -27,7 +27,7 @@ Models for IMX500, TFLite and qnnpack can be observed `here `. - - -TargetPlatformCapabilities -============================= -.. autoclass:: model_compression_toolkit.target_platform.TargetPlatformCapabilities - - - +.. autoclass:: model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OperatorSetGroup diff --git a/docs/_sources/api/api_docs/modules/trainable_infrastructure.rst.txt b/docs/_sources/api/api_docs/modules/trainable_infrastructure.rst.txt index c514a3307..42541f22f 100644 --- a/docs/_sources/api/api_docs/modules/trainable_infrastructure.rst.txt +++ b/docs/_sources/api/api_docs/modules/trainable_infrastructure.rst.txt @@ -36,6 +36,15 @@ It adds to the base quantizer a get_config and from_config functions to enable l .. autoclass:: model_compression_toolkit.trainable_infrastructure.BasePytorchTrainableQuantizer + + +TrainingMethod +================================ +**Select a training method:** + +.. autoclass:: model_compression_toolkit.trainable_infrastructure.TrainingMethod + + TrainableQuantizerWeightsConfig ================================= This configuration object contains the necessary attributes for configuring a weights trainable quantizer. @@ -46,7 +55,7 @@ For example, we can set a trainable weights quantizer with the following configu .. code-block:: python - from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod + from model_compression_toolkit.target_platform_capabilities.target_platform_capabilities import QuantizationMethod from model_compression_toolkit.constants import THRESHOLD, MIN_THRESHOLD TrainableQuantizerWeightsConfig(weights_quantization_method=QuantizationMethod.SYMMETRIC, @@ -70,7 +79,7 @@ For example, we can set a trainable activation quantizer with the following conf .. code-block:: python - from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod + from model_compression_toolkit.target_platform_capabilities.target_platform_capabilities import QuantizationMethod from model_compression_toolkit.constants import THRESHOLD, MIN_THRESHOLD TrainableQuantizerActivationConfig(activation_quantization_method=QuantizationMethod.UNIFORM, diff --git a/docs/_sources/api/api_docs/notes/tpc_note.rst.txt b/docs/_sources/api/api_docs/notes/tpc_note.rst.txt index 39558f42a..7ced4a5d6 100644 --- a/docs/_sources/api/api_docs/notes/tpc_note.rst.txt +++ b/docs/_sources/api/api_docs/notes/tpc_note.rst.txt @@ -1,7 +1,7 @@ .. note:: - For now, some fields of :class:`~model_compression_toolkit.target_platform.OpQuantizationConfig` are ignored during + For now, some fields of :class:`~model_compression_toolkit.target_platform_capabilities.OpQuantizationConfig` are ignored during the optimization process such as quantization_preserving, fixed_scale, and fixed_zero_point. - - MCT will use more information from :class:`~model_compression_toolkit.target_platform.OpQuantizationConfig`, in the future. + - MCT will use more information from :class:`~model_compression_toolkit.target_platform_capabilities.OpQuantizationConfig`, in the future. diff --git a/docs/api/api_docs/classes/BitWidthConfig.html b/docs/api/api_docs/classes/BitWidthConfig.html index ffb941926..f69e01d18 100644 --- a/docs/api/api_docs/classes/BitWidthConfig.html +++ b/docs/api/api_docs/classes/BitWidthConfig.html @@ -7,7 +7,7 @@ - BitWidthConfig — MCT Documentation: ver 2.2.0 + BitWidthConfig — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

Navigation

  • index
  • - + @@ -45,7 +45,7 @@

    Navigation

    BitWidthConfig

    -class model_compression_toolkit.core.BitWidthConfig(manual_activation_bit_width_selection_list=None)
    +class model_compression_toolkit.core.BitWidthConfig(manual_activation_bit_width_selection_list=<factory>)

    Class to manage manual bit-width configurations.

    @@ -128,7 +128,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/DataGenerationConfig.html b/docs/api/api_docs/classes/DataGenerationConfig.html index 3f2a64060..190c2ba4c 100644 --- a/docs/api/api_docs/classes/DataGenerationConfig.html +++ b/docs/api/api_docs/classes/DataGenerationConfig.html @@ -7,7 +7,7 @@ - Data Generation Configuration — MCT Documentation: ver 2.2.0 + Data Generation Configuration — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -211,7 +211,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/DefaultDict.html b/docs/api/api_docs/classes/DefaultDict.html index a8805dda9..fd2892809 100644 --- a/docs/api/api_docs/classes/DefaultDict.html +++ b/docs/api/api_docs/classes/DefaultDict.html @@ -7,7 +7,7 @@ - DefaultDict Class — MCT Documentation: ver 2.2.0 + DefaultDict Class — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -114,7 +114,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/FrameworkInfo.html b/docs/api/api_docs/classes/FrameworkInfo.html index 517e94030..809cfecdd 100644 --- a/docs/api/api_docs/classes/FrameworkInfo.html +++ b/docs/api/api_docs/classes/FrameworkInfo.html @@ -7,7 +7,7 @@ - FrameworkInfo Class — MCT Documentation: ver 2.2.0 + FrameworkInfo Class — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -57,7 +57,7 @@

    Navigation

    Parameters:
      -
    • activation_quantizer_mapping (Dict[QuantizationMethod, Callable]) – A dictionary mapping from QuantizationMethod to a quantization function.

    • +
    • activation_quantizer_mapping (Dict[QuantizationMethod, Callable]) – A dictionary mapping from QuantizationMethod to a quantization function.

    • kernel_channels_mapping (DefaultDict) – Dictionary from a layer to a tuple of its kernel in/out channels indices.

    • activation_min_max_mapping (Dict[str, tuple]) – Dictionary from an activation function to its min/max output values.

    • layer_min_max_mapping (Dict[Any, tuple]) – Dictionary from a layer to its min/max output values.

    • @@ -144,7 +144,7 @@

      Navigation

    • index
    • - +
    diff --git a/docs/api/api_docs/classes/GradientPTQConfig.html b/docs/api/api_docs/classes/GradientPTQConfig.html index 75eae64d5..06761a630 100644 --- a/docs/api/api_docs/classes/GradientPTQConfig.html +++ b/docs/api/api_docs/classes/GradientPTQConfig.html @@ -7,7 +7,7 @@ - GradientPTQConfig Class — MCT Documentation: ver 2.2.0 + GradientPTQConfig Class — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -43,30 +43,28 @@

    Navigation

    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)

    -class model_compression_toolkit.gptq.GradientPTQConfig(n_epochs, optimizer, optimizer_rest=None, loss=None, log_function=None, train_bias=True, rounding_type=RoundingType.SoftQuantizer, use_hessian_based_weights=True, optimizer_quantization_parameter=None, optimizer_bias=None, regularization_factor=REG_DEFAULT, hessian_weights_config=GPTQHessianScoresConfig(), gptq_quantizer_params_override=None)
    +class model_compression_toolkit.gptq.GradientPTQConfig(n_epochs, loss, optimizer, optimizer_rest, train_bias, hessian_weights_config, gradual_activation_quantization_config, regularization_factor, rounding_type=RoundingType.SoftQuantizer, optimizer_quantization_parameter=None, optimizer_bias=None, log_function=None, gptq_quantizer_params_override=<factory>)

    Configuration to use for quantization with GradientPTQ.

    -

    Initialize a GradientPTQConfig.

    Parameters:
      -
    • n_epochs (int) – Number of representative dataset epochs to train.

    • -
    • optimizer (Any) – Optimizer to use.

    • -
    • optimizer_rest (Any) – Optimizer to use for bias and quantizer parameters.

    • -
    • loss (Callable) – The loss to use. should accept 6 lists of tensors. 1st list of quantized tensors, the 2nd list is the float tensors, -the 3rd is a list of quantized weights, the 4th is a list of float weights, the 5th and 6th lists are the mean and std of the tensors -accordingly. see example in multiple_tensors_mse_loss

    • -
    • log_function (Callable) – Function to log information about the GPTQ process.

    • -
    • train_bias (bool) – Whether to update the bias during the training or not.

    • -
    • rounding_type (RoundingType) – An enum that defines the rounding type.

    • -
    • use_hessian_based_weights (bool) – Whether to use Hessian-based weights for weighted average loss.

    • -
    • optimizer_quantization_parameter (Any) – Optimizer to override the rest optimizer for quantizer parameters.

    • -
    • optimizer_bias (Any) – Optimizer to override the rest optimizer for bias.

    • -
    • regularization_factor (float) – A floating point number that defines the regularization factor.

    • -
    • hessian_weights_config (GPTQHessianScoresConfig) – A configuration that include all necessary arguments to run a computation of Hessian scores for the GPTQ loss.

    • -
    • gptq_quantizer_params_override (dict) – A dictionary of parameters to override in GPTQ quantizer instantiation. Defaults to None (no parameters).

    • +
    • n_epochs – Number of representative dataset epochs to train.

    • +
    • loss – The loss to use. See ‘multiple_tensors_mse_loss’ for the expected interface.

    • +
    • optimizer – Optimizer to use.

    • +
    • optimizer_rest – Default optimizer to use for bias and quantizer parameters.

    • +
    • train_bias – Whether to update the bias during the training or not.

    • +
    • hessian_weights_config – A configuration that include all necessary arguments to run a computation of +Hessian scores for the GPTQ loss.

    • +
    • gradual_activation_quantization_config – A configuration for Gradual Activation Quantization.

    • +
    • regularization_factor – A floating point number that defines the regularization factor.

    • +
    • rounding_type – An enum that defines the rounding type.

    • +
    • optimizer_quantization_parameter – Optimizer to override the rest optimizer for quantizer parameters.

    • +
    • optimizer_bias – Optimizer to override the rest optimizer for bias.

    • +
    • log_function – Function to log information about the GPTQ process.

    • +
    • gptq_quantizer_params_override – A dictionary of parameters to override in GPTQ quantizer instantiation.

    @@ -78,13 +76,14 @@

    GPTQHessianScoresConfig Class
    -class model_compression_toolkit.gptq.GPTQHessianScoresConfig(hessians_num_samples=GPTQ_HESSIAN_NUM_SAMPLES, norm_scores=True, log_norm=True, scale_log_norm=False, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE)
    +class model_compression_toolkit.gptq.GPTQHessianScoresConfig(per_sample, hessians_num_samples, norm_scores=None, log_norm=None, scale_log_norm=False, hessian_batch_size=32)

    Configuration to use for computing the Hessian-based scores for GPTQ loss metric.

    -

    Initialize a GPTQHessianWeightsConfig.

    Parameters:
      -
    • hessians_num_samples (int) – Number of samples to use for computing the Hessian-based scores.

    • +
    • per_sample (bool) – Whether to use per sample attention score.

    • +
    • hessians_num_samples (int|None) – Number of samples to use for computing the Hessian-based scores. +If None, compute Hessian for all images.

    • norm_scores (bool) – Whether to normalize the returned scores of the weighted loss function (to get values between 0 and 1).

    • log_norm (bool) – Whether to use log normalization for the GPTQ Hessian-based scores.

    • scale_log_norm (bool) – Whether to scale the final vector of the Hessian-based scores.

    • @@ -105,6 +104,42 @@

      RoundingType +

      GradualActivationQuantizationConfig

      +

      The following API can be used to configure the gradual activation quantization when using GPTQ.

      +
      +
      +class model_compression_toolkit.gptq.GradualActivationQuantizationConfig(q_fraction_scheduler_policy=<factory>)
      +

      Configuration for Gradual Activation Quantization.

      +

      By default, the quantized fraction increases linearly from 0 to 1 throughout the training.

      +
      +
      Parameters:
      +

      q_fraction_scheduler_policy – config for the scheduling of the quantized fraction. +Only linear annealing is currently supported.

      +
      +
      +
      + + +
      +

      QFractionLinearAnnealingConfig

      +
      +
      +class model_compression_toolkit.gptq.QFractionLinearAnnealingConfig(initial_q_fraction, target_q_fraction, start_step, end_step)
      +

      Config for the quantized fraction linear scheduler of Gradual Activation Quantization.

      +
      +
      Parameters:
      +
        +
      • initial_q_fraction – initial quantized fraction

      • +
      • target_q_fraction – target quantized fraction

      • +
      • start_step – gradient step to begin annealing

      • +
      • end_step – gradient step to complete annealing. None means last step.

      • +
      +
      +
      +
      +
      @@ -120,6 +155,8 @@

      Table of Contents

    • GradientPTQConfig Class
    • GPTQHessianScoresConfig Class
    • RoundingType
    • +
    • GradualActivationQuantizationConfig
    • +
    • QFractionLinearAnnealingConfig
    @@ -143,7 +180,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/MixedPrecisionQuantizationConfig.html b/docs/api/api_docs/classes/MixedPrecisionQuantizationConfig.html index 43bc8cce8..97f983f85 100644 --- a/docs/api/api_docs/classes/MixedPrecisionQuantizationConfig.html +++ b/docs/api/api_docs/classes/MixedPrecisionQuantizationConfig.html @@ -7,7 +7,7 @@ - MixedPrecisionQuantizationConfig — MCT Documentation: ver 2.2.0 + MixedPrecisionQuantizationConfig — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -46,7 +46,7 @@

    Navigation

    Class to configure the quantization process of the model when quantizing in mixed-precision:

    -class model_compression_toolkit.core.MixedPrecisionQuantizationConfig(compute_distance_fn=None, distance_weighting_method=MpDistanceWeighting.AVG, num_of_images=MP_DEFAULT_NUM_SAMPLES, configuration_overwrite=None, num_interest_points_factor=1.0, use_hessian_based_scores=False, norm_scores=True, refine_mp_solution=True, metric_normalization_threshold=1e10, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE)
    +class model_compression_toolkit.core.MixedPrecisionQuantizationConfig(compute_distance_fn=None, distance_weighting_method=MpDistanceWeighting.AVG, num_of_images=32, configuration_overwrite=None, num_interest_points_factor=1.0, use_hessian_based_scores=False, norm_scores=True, refine_mp_solution=True, metric_normalization_threshold=10000000000.0, hessian_batch_size=32)

    Class with mixed precision parameters to quantize the input model.

    Parameters:
    @@ -95,7 +95,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/MpDistanceWeighting.html b/docs/api/api_docs/classes/MpDistanceWeighting.html index ac03fdcef..18227dd98 100644 --- a/docs/api/api_docs/classes/MpDistanceWeighting.html +++ b/docs/api/api_docs/classes/MpDistanceWeighting.html @@ -7,7 +7,7 @@ - MpDistanceWeighting — MCT Documentation: ver 2.2.0 + MpDistanceWeighting — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -83,7 +83,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/PruningConfig.html b/docs/api/api_docs/classes/PruningConfig.html index 47ff68d96..a11882d5a 100644 --- a/docs/api/api_docs/classes/PruningConfig.html +++ b/docs/api/api_docs/classes/PruningConfig.html @@ -7,7 +7,7 @@ - Pruning Configuration — MCT Documentation: ver 2.2.0 + Pruning Configuration — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -159,7 +159,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/PruningInfo.html b/docs/api/api_docs/classes/PruningInfo.html index 0516ddc4c..dd494387b 100644 --- a/docs/api/api_docs/classes/PruningInfo.html +++ b/docs/api/api_docs/classes/PruningInfo.html @@ -7,7 +7,7 @@ - Pruning Information — MCT Documentation: ver 2.2.0 + Pruning Information — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -122,7 +122,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/QuantizationConfig.html b/docs/api/api_docs/classes/QuantizationConfig.html index 227aa69d1..d06827331 100644 --- a/docs/api/api_docs/classes/QuantizationConfig.html +++ b/docs/api/api_docs/classes/QuantizationConfig.html @@ -7,7 +7,7 @@ - QuantizationConfig — MCT Documentation: ver 2.2.0 + QuantizationConfig — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -46,42 +46,17 @@

    Navigation

    Class to configure the quantization process of the model:

    -class model_compression_toolkit.core.QuantizationConfig(activation_error_method=QuantizationErrorMethod.MSE, weights_error_method=QuantizationErrorMethod.MSE, relu_bound_to_power_of_2=False, weights_bias_correction=True, weights_second_moment_correction=False, input_scaling=False, softmax_shift=False, shift_negative_activation_correction=True, activation_channel_equalization=False, z_threshold=math.inf, min_threshold=MIN_THRESHOLD, l_p_value=2, linear_collapsing=True, residual_collapsing=True, shift_negative_ratio=0.05, shift_negative_threshold_recalculation=False, shift_negative_params_search=False, concat_threshold_update=False)
    -

    Class to wrap all different parameters the library quantize the input model according to.

    -
    -
    Parameters:
    -
      -
    • activation_error_method (QuantizationErrorMethod) – Which method to use from QuantizationErrorMethod for activation quantization threshold selection.

    • -
    • weights_error_method (QuantizationErrorMethod) – Which method to use from QuantizationErrorMethod for activation quantization threshold selection.

    • -
    • relu_bound_to_power_of_2 (bool) – Whether to use relu to power of 2 scaling correction or not.

    • -
    • weights_bias_correction (bool) – Whether to use weights bias correction or not.

    • -
    • weights_second_moment_correction (bool) – Whether to use weights second_moment correction or not.

    • -
    • input_scaling (bool) – Whether to use input scaling or not.

    • -
    • softmax_shift (bool) – Whether to use softmax shift or not.

    • -
    • shift_negative_activation_correction (bool) – Whether to use shifting negative activation correction or not.

    • -
    • activation_channel_equalization (bool) – Whether to use activation channel equalization correction or not.

    • -
    • z_threshold (float) – Value of z score for outliers removal.

    • -
    • min_threshold (float) – Minimum threshold to use during thresholds selection.

    • -
    • l_p_value (int) – The p value of L_p norm threshold selection.

    • -
    • block_collapsing (bool) – Whether to collapse block one to another in the input network

    • -
    • shift_negative_ratio (float) – Value for the ratio between the minimal negative value of a non-linearity output to its activation threshold, which above it - shifting negative activation should occur if enabled.

    • -
    • shift_negative_threshold_recalculation (bool) – Whether or not to recompute the threshold after shifting negative activation.

    • -
    • shift_negative_params_search (bool) – Whether to search for optimal shift and threshold in shift negative activation.

    • -
    -
    -
    +class model_compression_toolkit.core.QuantizationConfig(activation_error_method=QuantizationErrorMethod.MSE, weights_error_method=QuantizationErrorMethod.MSE, relu_bound_to_power_of_2=False, weights_bias_correction=True, weights_second_moment_correction=False, input_scaling=False, softmax_shift=False, shift_negative_activation_correction=True, activation_channel_equalization=False, z_threshold=inf, min_threshold=1.52587890625e-05, l_p_value=2, linear_collapsing=True, residual_collapsing=True, shift_negative_ratio=0.05, shift_negative_threshold_recalculation=False, shift_negative_params_search=False, concat_threshold_update=False, activation_bias_correction=False, activation_bias_correction_threshold=0.0, custom_tpc_opset_to_layer=None) +

    A class that encapsulates all the different parameters used by the library to quantize a model.

    Examples

    -

    One may create a quantization configuration to quantize a model according to. -For example, to quantize a model’s weights and activation using thresholds, such that -weights threshold selection is done using MSE, activation threshold selection is done using NOCLIPPING (min/max), -enabling relu_bound_to_power_of_2, weights_bias_correction, -one can instantiate a quantization configuration:

    +

    You can create a quantization configuration to apply to a model. For example, to quantize a model’s weights and +activations using thresholds, with weight threshold selection based on MSE and activation threshold selection +using NOCLIPPING (min/max), while enabling relu_bound_to_power_of_2 and weights_bias_correction, +you can instantiate a quantization configuration like this:

    >>> import model_compression_toolkit as mct
     >>> 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 instanse can then be passed to -keras_post_training_quantization()

    @@ -113,7 +88,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/QuantizationErrorMethod.html b/docs/api/api_docs/classes/QuantizationErrorMethod.html index e2c40702a..c7ffe60a4 100644 --- a/docs/api/api_docs/classes/QuantizationErrorMethod.html +++ b/docs/api/api_docs/classes/QuantizationErrorMethod.html @@ -7,7 +7,7 @@ - QuantizationErrorMethod — MCT Documentation: ver 2.2.0 + QuantizationErrorMethod — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -85,7 +85,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/ResourceUtilization.html b/docs/api/api_docs/classes/ResourceUtilization.html index 54f03591f..f291d6675 100644 --- a/docs/api/api_docs/classes/ResourceUtilization.html +++ b/docs/api/api_docs/classes/ResourceUtilization.html @@ -7,7 +7,7 @@ - ResourceUtilization — MCT Documentation: ver 2.2.0 + ResourceUtilization — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -46,18 +46,12 @@

    Navigation

    Object to configure resources to use when searching for a configuration for the optimized model (such as in mixed-precision, pruning, etc.):

    -class model_compression_toolkit.core.ResourceUtilization(weights_memory=np.inf, activation_memory=np.inf, total_memory=np.inf, bops=np.inf)
    +class model_compression_toolkit.core.ResourceUtilization(weights_memory=inf, activation_memory=inf, total_memory=inf, bops=inf)

    Class to represent measurements of performance.

    -
    -
    Parameters:
    -
      -
    • weights_memory – Memory of a model’s weights in bytes. Note that this includes only coefficients that should be quantized (for example, the kernel of Conv2D in Keras will be affected by this value, while the bias will not).

    • -
    • activation_memory – Memory of a model’s activation in bytes, according to the given activation resource utilization metric.

    • -
    • total_memory – The sum of model’s activation and weights memory in bytes, according to the given total resource utilization metric.

    • -
    • bops – The total bit-operations in the model.

    • -
    -
    -
    +

    weights_memory: Memory of a model’s weights in bytes. +activation_memory: Memory of a model’s activation in bytes. +total_memory: The sum of model’s activation and weights memory in bytes. +bops: The total bit-operations in the model.

    @@ -89,7 +83,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/classes/XQuantConfig.html b/docs/api/api_docs/classes/XQuantConfig.html index 2375020ec..c86704052 100644 --- a/docs/api/api_docs/classes/XQuantConfig.html +++ b/docs/api/api_docs/classes/XQuantConfig.html @@ -7,7 +7,7 @@ - XQuant Configuration — MCT Documentation: ver 2.2.0 + XQuant Configuration — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -89,7 +89,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/index.html b/docs/api/api_docs/index.html index 292fc010a..facf42521 100644 --- a/docs/api/api_docs/index.html +++ b/docs/api/api_docs/index.html @@ -7,7 +7,7 @@ - API Docs — MCT Documentation: ver 2.2.0 + API Docs — MCT Documentation: ver 2.3.0 @@ -35,7 +35,7 @@

    Navigation

  • previous |
  • - + @@ -147,10 +147,10 @@

    keras_load_quantized_modelkeras_load_quantized_model: A function to load a quantized keras model.

    -
    -

    target_platform

    +
    +

    target_platform_capabilities

      -
    • target_platform: Module to create and model hardware-related settings to optimize the model according to, by the hardware the optimized model will use during inference.

    • +
    • target_platform_capabilities: Module to create and model hardware-related settings to optimize the model according to, by the hardware the optimized model will use during inference.

    • get_target_platform_capabilities: A function to get a target platform model for Tensorflow and Pytorch.

    • DefaultDict: Util class for creating a TargetPlatformCapabilities.

    @@ -191,7 +191,7 @@

    Table of Contents

  • trainable_infrastructure
  • set_log_folder
  • keras_load_quantized_model
  • -
  • target_platform
  • +
  • target_platform_capabilities
  • Indices and tables
  • @@ -226,7 +226,7 @@

    Navigation

  • previous |
  • - + diff --git a/docs/api/api_docs/methods/get_keras_data_generation_config.html b/docs/api/api_docs/methods/get_keras_data_generation_config.html index acacb952d..098ecf3e0 100644 --- a/docs/api/api_docs/methods/get_keras_data_generation_config.html +++ b/docs/api/api_docs/methods/get_keras_data_generation_config.html @@ -7,7 +7,7 @@ - Get DataGenerationConfig for Keras Models — MCT Documentation: ver 2.2.0 + Get DataGenerationConfig for Keras Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -109,7 +109,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/get_keras_gptq_config.html b/docs/api/api_docs/methods/get_keras_gptq_config.html index 37cbf9274..43b773633 100644 --- a/docs/api/api_docs/methods/get_keras_gptq_config.html +++ b/docs/api/api_docs/methods/get_keras_gptq_config.html @@ -7,7 +7,7 @@ - Get GradientPTQConfig for Keras Models — MCT Documentation: ver 2.2.0 + Get GradientPTQConfig for Keras Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -45,8 +45,8 @@

    Navigation

    Get GradientPTQConfig for Keras Models

    -model_compression_toolkit.gptq.get_keras_gptq_config(n_epochs, optimizer=tf.keras.optimizers.Adam(learning_rate=LR_DEFAULT), optimizer_rest=tf.keras.optimizers.Adam(learning_rate=LR_REST_DEFAULT), loss=GPTQMultipleTensorsLoss(), log_function=None, use_hessian_based_weights=True, regularization_factor=REG_DEFAULT, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE)
    -

    Create a GradientPTQConfigV2 instance for Keras models.

    +model_compression_toolkit.gptq.get_keras_gptq_config(n_epochs, optimizer=None, optimizer_rest=None, loss=None, log_function=None, use_hessian_based_weights=True, regularization_factor=None, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE, use_hessian_sample_attention=True, gradual_activation_quantization=True) +

    Create a GradientPTQConfig instance for Keras models.

    Parameters:
      @@ -58,10 +58,12 @@

      Navigation

    • use_hessian_based_weights (bool) – Whether to use Hessian-based weights for weighted average loss.

    • 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 GradientPTQConfigV2 object to use when fine-tuning the quantized model using gptq.

    +

    a GradientPTQConfig object to use when fine-tuning the quantized model using gptq.

    Examples

    @@ -70,7 +72,7 @@

    Navigation

    >>> import tensorflow as tf -

    Create a GradientPTQConfigV2 to run for 5 epochs:

    +

    Create a GradientPTQConfig to run for 5 epochs:

    >>> gptq_conf = mct.gptq.get_keras_gptq_config(n_epochs=5)
     
    @@ -78,7 +80,7 @@

    Navigation

    >>> gptq_conf = mct.gptq.get_keras_gptq_config(n_epochs=3, optimizer=tf.keras.optimizers.Nadam())
     
    -

    The configuration can be passed to keras_post_training_quantization() in order to quantize a keras model using gptq.

    +

    The configuration can be passed to keras_gradient_post_training_quantization() in order to quantize a keras model using gptq.

    Return type:

    GradientPTQConfig

    @@ -115,7 +117,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/get_pytorch_data_generation_config.html b/docs/api/api_docs/methods/get_pytorch_data_generation_config.html index 0edeab3fb..7a9381d26 100644 --- a/docs/api/api_docs/methods/get_pytorch_data_generation_config.html +++ b/docs/api/api_docs/methods/get_pytorch_data_generation_config.html @@ -7,7 +7,7 @@ - Get DataGenerationConfig for Pytorch Models — MCT Documentation: ver 2.2.0 + Get DataGenerationConfig for Pytorch Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -110,7 +110,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/get_pytroch_gptq_config.html b/docs/api/api_docs/methods/get_pytroch_gptq_config.html index 72de25f28..61c799f13 100644 --- a/docs/api/api_docs/methods/get_pytroch_gptq_config.html +++ b/docs/api/api_docs/methods/get_pytroch_gptq_config.html @@ -7,7 +7,7 @@ - Get GradientPTQConfig for Pytorch Models — MCT Documentation: ver 2.2.0 + Get GradientPTQConfig for Pytorch Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -45,27 +45,29 @@

    Navigation

    Get GradientPTQConfig for Pytorch Models

    -model_compression_toolkit.gptq.get_pytorch_gptq_config(n_epochs, optimizer=Adam([torch.Tensor([])], lr=LR_DEFAULT), optimizer_rest=Adam([torch.Tensor([])], lr=LR_REST_DEFAULT), loss=multiple_tensors_mse_loss, log_function=None, use_hessian_based_weights=True, regularization_factor=REG_DEFAULT, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE)
    -

    Create a GradientPTQConfigV2 instance for Pytorch models.

    +model_compression_toolkit.gptq.get_pytorch_gptq_config(n_epochs, optimizer=None, optimizer_rest=None, loss=None, log_function=None, use_hessian_based_weights=True, regularization_factor=None, hessian_batch_size=ACT_HESSIAN_DEFAULT_BATCH_SIZE, use_hessian_sample_attention=True, gradual_activation_quantization=True) +

    Create a GradientPTQConfig instance for Pytorch models.

    Parameters:
    • n_epochs (int) – Number of epochs for running the representative dataset for fine-tuning.

    • optimizer (Optimizer) – Pytorch optimizer to use for fine-tuning for auxiliry variable.

    • optimizer_rest (Optimizer) – Pytorch optimizer to use for fine-tuning of the bias variable.

    • -
    • loss (Callable) – loss to use during fine-tuning. should accept 4 lists of tensors. 1st list of quantized tensors, the 2nd list is the float tensors, the 3rd is a list of quantized weights and the 4th is a list of float weights.

    • +
    • loss (Callable) – loss to use during fine-tuning. See the default loss function for the exact interface.

    • log_function (Callable) – Function to log information about the gptq process.

    • use_hessian_based_weights (bool) – Whether to use Hessian-based weights for weighted average loss.

    • 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 GradientPTQConfigV2 object to use when fine-tuning the quantized model using gptq.

    +

    a GradientPTQConfig object to use when fine-tuning the quantized model using gptq.

    Examples

    -

    Import MCT and Create a GradientPTQConfigV2 to run for 5 epochs:

    +

    Import MCT and Create a GradientPTQConfig to run for 5 epochs:

    >>> import model_compression_toolkit as mct
     >>> gptq_conf = mct.gptq.get_pytorch_gptq_config(n_epochs=5)
     
    @@ -75,7 +77,7 @@

    Navigation

    >>> gptq_conf = mct.gptq.get_pytorch_gptq_config(n_epochs=3, optimizer=torch.optim.Adam([torch.Tensor(1)]))
    -

    The configuration can be passed to pytorch_post_training_quantization() in order to quantize a pytorch model using gptq.

    +

    The configuration can be passed to pytorch_gradient_post_training_quantization() in order to quantize a pytorch model using gptq.

    Return type:

    GradientPTQConfig

    @@ -112,7 +114,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/get_target_platform_capabilities.html b/docs/api/api_docs/methods/get_target_platform_capabilities.html index 5fe03a901..eb3d990ef 100644 --- a/docs/api/api_docs/methods/get_target_platform_capabilities.html +++ b/docs/api/api_docs/methods/get_target_platform_capabilities.html @@ -7,7 +7,7 @@ - Get TargetPlatformCapabilities — MCT Documentation: ver 2.2.0 + Get FrameworkQuantizationCapabilities — MCT Documentation: ver 2.3.0 @@ -31,8 +31,8 @@

    Navigation

  • index
  • - - + + @@ -41,38 +41,36 @@

    Navigation

    -
    -

    Get TargetPlatformCapabilities

    +
    +

    Get FrameworkQuantizationCapabilities

    model_compression_toolkit.get_target_platform_capabilities(fw_name, target_platform_name, target_platform_version=None)
    -

    Get a TargetPlatformCapabilities by the target platform model name and the framework name. -For now, it supports frameworks ‘tensorflow’ and ‘pytorch’. For both of them -the target platform model can be ‘default’, ‘imx500’, ‘tflite’, or ‘qnnpack’.

    +

    This is a degenerated function that only returns the MCT default TargetPlatformCapabilities object, to comply with the +existing TPC API.

    Parameters:
      -
    • fw_name – Framework name of the TargetPlatformCapabilities.

    • +
    • fw_name – Framework name of the FrameworkQuantizationCapabilities.

    • target_platform_name – Target platform model name the model will use for inference.

    • target_platform_version – Target platform capabilities version.

    Returns:
    -

    A TargetPlatformCapabilities object that models the hardware and attaches -a framework information to it.

    +

    A default TargetPlatformCapabilities object.

    Return type:
    -

    TargetPlatformCapabilities

    +

    TargetPlatformCapabilities

    Note

    -

    For now, some fields of OpQuantizationConfig are ignored during +

    For now, some fields of OpQuantizationConfig are ignored during the optimization process such as quantization_preserving, fixed_scale, and fixed_zero_point.

      -
    • MCT will use more information from OpQuantizationConfig, in the future.

    • +
    • MCT will use more information from OpQuantizationConfig, in the future.

    @@ -104,8 +102,8 @@

    Navigation

  • index
  • - - + +
    @@ -122,7 +122,7 @@

    Navigation

  • index
  • - +
    diff --git a/docs/api/api_docs/methods/keras_gradient_post_training_quantization.html b/docs/api/api_docs/methods/keras_gradient_post_training_quantization.html index 62eb33a89..5c2492cae 100644 --- a/docs/api/api_docs/methods/keras_gradient_post_training_quantization.html +++ b/docs/api/api_docs/methods/keras_gradient_post_training_quantization.html @@ -7,7 +7,7 @@ - Keras Gradient Based Post Training Quantization — MCT Documentation: ver 2.2.0 + Keras Gradient Based Post Training Quantization — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -69,7 +69,7 @@

    Navigation

  • gptq_representative_data_gen (Callable) – Dataset used for GPTQ training. If None defaults to representative_data_gen

  • target_resource_utilization (ResourceUtilization) – ResourceUtilization object to limit the search of the mixed-precision configuration as desired.

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the Keras model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the Keras model according to.

  • Returns:
    @@ -152,7 +152,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_kpi_data.html b/docs/api/api_docs/methods/keras_kpi_data.html index e39322e8c..e31bb0dee 100644 --- a/docs/api/api_docs/methods/keras_kpi_data.html +++ b/docs/api/api_docs/methods/keras_kpi_data.html @@ -7,7 +7,7 @@ - Get Resource Utilization information for Keras Models — MCT Documentation: ver 2.2.0 + Get Resource Utilization information for Keras Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -56,7 +56,7 @@

    Navigation

  • in_model (Model) – Keras model to quantize.

  • representative_data_gen (Callable) – Dataset used for calibration.

  • core_config (CoreConfig) – CoreConfig containing parameters for quantization and mixed precision of how the model should be quantized.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the Keras model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – FrameworkQuantizationCapabilities to optimize the Keras model according to.

  • Returns:
    @@ -115,7 +115,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_load_quantizad_model.html b/docs/api/api_docs/methods/keras_load_quantizad_model.html index db16f181a..7969d8414 100644 --- a/docs/api/api_docs/methods/keras_load_quantizad_model.html +++ b/docs/api/api_docs/methods/keras_load_quantizad_model.html @@ -7,7 +7,7 @@ - Load Quantized Keras Model — MCT Documentation: ver 2.2.0 + Load Quantized Keras Model — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -89,7 +89,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_post_training_quantization.html b/docs/api/api_docs/methods/keras_post_training_quantization.html index 9cc04bf05..023c8a43e 100644 --- a/docs/api/api_docs/methods/keras_post_training_quantization.html +++ b/docs/api/api_docs/methods/keras_post_training_quantization.html @@ -7,7 +7,7 @@ - Keras Post Training Quantization — MCT Documentation: ver 2.2.0 + Keras Post Training Quantization — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -64,7 +64,7 @@

    Navigation

  • representative_data_gen (Callable) – Dataset used for calibration.

  • target_resource_utilization (ResourceUtilization) – ResourceUtilization object to limit the search of the mixed-precision configuration as desired.

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the Keras model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the Keras model according to.

  • Returns:
    @@ -144,7 +144,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_pruning_experimental.html b/docs/api/api_docs/methods/keras_pruning_experimental.html index 0574b4a2e..1374f953f 100644 --- a/docs/api/api_docs/methods/keras_pruning_experimental.html +++ b/docs/api/api_docs/methods/keras_pruning_experimental.html @@ -7,7 +7,7 @@ - Keras Structured Pruning — MCT Documentation: ver 2.2.0 + Keras Structured Pruning — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -62,7 +62,7 @@

    Navigation

  • target_resource_utilization (ResourceUtilization) – The target Key Performance Indicators to be achieved through pruning.

  • representative_data_gen (Callable) – A function to generate representative data for pruning analysis.

  • pruning_config (PruningConfig) – Configuration settings for the pruning process. Defaults to standard config.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – Platform-specific constraints and capabilities. Defaults to DEFAULT_KERAS_TPC.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – Platform-specific constraints and capabilities. Defaults to DEFAULT_KERAS_TPC.

  • Returns:
    @@ -145,7 +145,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.html b/docs/api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.html index f19e24b23..11d911a65 100644 --- a/docs/api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.html +++ b/docs/api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.html @@ -7,7 +7,7 @@ - Keras Quantization Aware Training Model Finalize — MCT Documentation: ver 2.2.0 + Keras Quantization Aware Training Model Finalize — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -132,7 +132,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/keras_quantization_aware_training_init_experimental.html b/docs/api/api_docs/methods/keras_quantization_aware_training_init_experimental.html index b5a47c72a..54ee5b454 100644 --- a/docs/api/api_docs/methods/keras_quantization_aware_training_init_experimental.html +++ b/docs/api/api_docs/methods/keras_quantization_aware_training_init_experimental.html @@ -7,7 +7,7 @@ - Keras Quantization Aware Training Model Init — MCT Documentation: ver 2.2.0 + Keras Quantization Aware Training Model Init — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -67,7 +67,7 @@

    Navigation

  • target_resource_utilization (ResourceUtilization) – ResourceUtilization object to limit the search of the mixed-precision configuration as desired.

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • qat_config (QATConfig) – QAT configuration

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the Keras model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the Keras model according to.

  • Returns:
    @@ -152,7 +152,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_data_generation_experimental.html b/docs/api/api_docs/methods/pytorch_data_generation_experimental.html index 14fc9f215..0fcbf10f1 100644 --- a/docs/api/api_docs/methods/pytorch_data_generation_experimental.html +++ b/docs/api/api_docs/methods/pytorch_data_generation_experimental.html @@ -7,7 +7,7 @@ - Pytorch Data Generation — MCT Documentation: ver 2.2.0 + Pytorch Data Generation — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -122,7 +122,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_gradient_post_training_quantization.html b/docs/api/api_docs/methods/pytorch_gradient_post_training_quantization.html index 3db8f08ed..5d41c6976 100644 --- a/docs/api/api_docs/methods/pytorch_gradient_post_training_quantization.html +++ b/docs/api/api_docs/methods/pytorch_gradient_post_training_quantization.html @@ -7,7 +7,7 @@ - Pytorch Gradient Based Post Training Quantization — MCT Documentation: ver 2.2.0 + Pytorch Gradient Based Post Training Quantization — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -48,7 +48,7 @@

    Navigation

    model_compression_toolkit.gptq.pytorch_gradient_post_training_quantization(model, representative_data_gen, target_resource_utilization=None, core_config=CoreConfig(), gptq_config=None, gptq_representative_data_gen=None, target_platform_capabilities=DEFAULT_PYTORCH_TPC)

    Quantize a trained Pytorch module using post-training quantization. By default, the module is quantized using a symmetric constraint quantization thresholds -(power of two) as defined in the default TargetPlatformCapabilities. +(power of two) as defined in the default FrameworkQuantizationCapabilities. The module is first optimized using several transformations (e.g. BatchNormalization folding to preceding layers). Then, using a given dataset, statistics (e.g. min/max, histogram, etc.) are being collected for each layer’s output (and input, depends on the quantization configuration). @@ -69,7 +69,7 @@

    Navigation

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • gptq_config (GradientPTQConfig) – Configuration for using gptq (e.g. optimizer).

  • gptq_representative_data_gen (Callable) – Dataset used for GPTQ training. If None defaults to representative_data_gen

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the PyTorch model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the PyTorch model according to.

  • Returns:
    @@ -134,7 +134,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_kpi_data.html b/docs/api/api_docs/methods/pytorch_kpi_data.html index 6913f0e11..f7a639a62 100644 --- a/docs/api/api_docs/methods/pytorch_kpi_data.html +++ b/docs/api/api_docs/methods/pytorch_kpi_data.html @@ -7,7 +7,7 @@ - Get Resource Utilization information for PyTorch Models — MCT Documentation: ver 2.2.0 + Get Resource Utilization information for PyTorch Models — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -54,7 +54,7 @@

    Navigation

  • in_model (Model) – PyTorch model to quantize.

  • representative_data_gen (Callable) – Dataset used for calibration.

  • core_config (CoreConfig) – CoreConfig containing parameters for quantization and mixed precision

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the PyTorch model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – FrameworkQuantizationCapabilities to optimize the PyTorch model according to.

  • Returns:
    @@ -113,7 +113,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_post_training_quantization.html b/docs/api/api_docs/methods/pytorch_post_training_quantization.html index d69365f83..8604a672e 100644 --- a/docs/api/api_docs/methods/pytorch_post_training_quantization.html +++ b/docs/api/api_docs/methods/pytorch_post_training_quantization.html @@ -7,7 +7,7 @@ - Pytorch Post Training Quantization — MCT Documentation: ver 2.2.0 + Pytorch Post Training Quantization — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -48,7 +48,7 @@

    Navigation

    model_compression_toolkit.ptq.pytorch_post_training_quantization(in_module, representative_data_gen, target_resource_utilization=None, core_config=CoreConfig(), target_platform_capabilities=DEFAULT_PYTORCH_TPC)

    Quantize a trained Pytorch module using post-training quantization. By default, the module is quantized using a symmetric constraint quantization thresholds -(power of two) as defined in the default TargetPlatformCapabilities. +(power of two) as defined in the default FrameworkQuantizationCapabilities. The module is first optimized using several transformations (e.g. BatchNormalization folding to preceding layers). Then, using a given dataset, statistics (e.g. min/max, histogram, etc.) are being collected for each layer’s output (and input, depends on the quantization configuration). @@ -64,7 +64,7 @@

    Navigation

  • representative_data_gen (Callable) – Dataset used for calibration.

  • target_resource_utilization (ResourceUtilization) – ResourceUtilization object to limit the search of the mixed-precision configuration as desired.

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the PyTorch model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the PyTorch model according to.

  • Returns:
    @@ -123,7 +123,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_pruning_experimental.html b/docs/api/api_docs/methods/pytorch_pruning_experimental.html index c2eee01ab..e51687d15 100644 --- a/docs/api/api_docs/methods/pytorch_pruning_experimental.html +++ b/docs/api/api_docs/methods/pytorch_pruning_experimental.html @@ -7,7 +7,7 @@ - Pytorch Structured Pruning — MCT Documentation: ver 2.2.0 + Pytorch Structured Pruning — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -62,7 +62,7 @@

    Navigation

  • target_resource_utilization (ResourceUtilization) – Key Performance Indicators specifying the pruning targets.

  • representative_data_gen (Callable) – A function to generate representative data for pruning analysis.

  • pruning_config (PruningConfig) – Configuration settings for the pruning process. Defaults to standard config.

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – Platform-specific constraints and capabilities. +

  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – Platform-specific constraints and capabilities. Defaults to DEFAULT_PYTORCH_TPC.

  • @@ -146,7 +146,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.html b/docs/api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.html index 7fb23e0f1..177aab5d8 100644 --- a/docs/api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.html +++ b/docs/api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.html @@ -7,7 +7,7 @@ - PyTorch Quantization Aware Training Model Finalize — MCT Documentation: ver 2.2.0 + PyTorch Quantization Aware Training Model Finalize — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -115,7 +115,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.html b/docs/api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.html index 2263184a6..a969e130d 100644 --- a/docs/api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.html +++ b/docs/api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.html @@ -7,7 +7,7 @@ - PyTorch Quantization Aware Training Model Init — MCT Documentation: ver 2.2.0 + PyTorch Quantization Aware Training Model Init — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -67,7 +67,7 @@

    Navigation

  • target_resource_utilization (ResourceUtilization) – ResourceUtilization object to limit the search of the mixed-precision configuration as desired.

  • core_config (CoreConfig) – Configuration object containing parameters of how the model should be quantized, including mixed precision parameters.

  • qat_config (QATConfig) – QAT configuration

  • -
  • target_platform_capabilities (TargetPlatformCapabilities) – TargetPlatformCapabilities to optimize the Pytorch model according to.

  • +
  • target_platform_capabilities (Union[TargetPlatformCapabilities, str]) – TargetPlatformCapabilities to optimize the Pytorch model according to.

  • Returns:
    @@ -85,9 +85,7 @@

    Navigation

    >>> 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():
    @@ -95,19 +93,15 @@ 

    Navigation

    >>> yield [np.random.random((4, 3, 224, 224))]
    -
    -

    Create a MCT core config, containing the quantization configuration:

    +

    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)
     

    For more configuration options, please take a look at our API documentation.

    -
    -
    @@ -139,7 +133,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/set_logger_path.html b/docs/api/api_docs/methods/set_logger_path.html index 46bc672ee..e342d53ea 100644 --- a/docs/api/api_docs/methods/set_logger_path.html +++ b/docs/api/api_docs/methods/set_logger_path.html @@ -7,7 +7,7 @@ - Enable a Logger — MCT Documentation: ver 2.2.0 + Enable a Logger — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -86,7 +86,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/xquant_report_keras_experimental.html b/docs/api/api_docs/methods/xquant_report_keras_experimental.html index 6a019e06a..e24f6ec96 100644 --- a/docs/api/api_docs/methods/xquant_report_keras_experimental.html +++ b/docs/api/api_docs/methods/xquant_report_keras_experimental.html @@ -7,7 +7,7 @@ - XQuant Report Keras — MCT Documentation: ver 2.2.0 + XQuant Report Keras — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -98,7 +98,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/methods/xquant_report_pytorch_experimental.html b/docs/api/api_docs/methods/xquant_report_pytorch_experimental.html index cf0cb52c4..b2f2c2071 100644 --- a/docs/api/api_docs/methods/xquant_report_pytorch_experimental.html +++ b/docs/api/api_docs/methods/xquant_report_pytorch_experimental.html @@ -7,7 +7,7 @@ - XQuant Report Pytorch — MCT Documentation: ver 2.2.0 + XQuant Report Pytorch — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -95,7 +95,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/core_config.html b/docs/api/api_docs/modules/core_config.html index 1560526f9..58ff2ca64 100644 --- a/docs/api/api_docs/modules/core_config.html +++ b/docs/api/api_docs/modules/core_config.html @@ -7,7 +7,7 @@ - CoreConfig — MCT Documentation: ver 2.2.0 + CoreConfig — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -46,15 +46,14 @@

    Navigation

    Class to configure the optimization process of the model:

    -class model_compression_toolkit.core.CoreConfig(quantization_config=None, mixed_precision_config=None, bit_width_config=None, debug_config=None)
    -

    A class to hold the configurations classes of the MCT-core.

    +class model_compression_toolkit.core.CoreConfig(quantization_config=<factory>, mixed_precision_config=<factory>, bit_width_config=<factory>, debug_config=<factory>) +

    A dataclass to hold the configurations classes of the MCT-core.

    Parameters:
    • quantization_config (QuantizationConfig) – Config for quantization.

    • -
    • mixed_precision_config (MixedPrecisionQuantizationConfig) – Config for mixed precision quantization.

    • -
    • None (If) –

    • -
    • used. (a default MixedPrecisionQuantizationConfig is) –

    • +
    • mixed_precision_config (MixedPrecisionQuantizationConfig) – Config for mixed precision quantization. +If None, a default MixedPrecisionQuantizationConfig is used.

    • bit_width_config (BitWidthConfig) – Config for manual bit-width selection.

    • debug_config (DebugConfig) – Config for debugging and editing the network quantization process.

    @@ -91,7 +90,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/debug_config.html b/docs/api/api_docs/modules/debug_config.html index faf43f328..3c000d400 100644 --- a/docs/api/api_docs/modules/debug_config.html +++ b/docs/api/api_docs/modules/debug_config.html @@ -7,7 +7,7 @@ - debug_config Module — MCT Documentation: ver 2.2.0 + debug_config Module — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -48,15 +48,15 @@

    DebugConfig
    -class model_compression_toolkit.core.DebugConfig(analyze_similarity=False, network_editor=[], simulate_scheduler=False)
    -

    A class for MCT core debug information.

    +class model_compression_toolkit.core.DebugConfig(analyze_similarity=False, network_editor=<factory>, simulate_scheduler=False) +

    A dataclass for MCT core debug information.

    Parameters:
    • analyze_similarity (bool) – Whether to plot similarity figures within TensorBoard (when logger is enabled) or not. Can be used to pinpoint problematic layers in the quantization process.

    • network_editor (List[EditRule]) – A list of rules and actions to edit the network for quantization.

    • -
    • simulate_scheduler (bool) – Simulate scheduler behaviour to compute operators order and cuts.

    • +
    • simulate_scheduler (bool) – Simulate scheduler behavior to compute operators’ order and cuts.

    @@ -102,7 +102,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/exporter.html b/docs/api/api_docs/modules/exporter.html index 8c98c0976..c40ec04bb 100644 --- a/docs/api/api_docs/modules/exporter.html +++ b/docs/api/api_docs/modules/exporter.html @@ -7,7 +7,7 @@ - exporter Module — MCT Documentation: ver 2.2.0 + exporter Module — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -318,7 +318,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/layer_filters.html b/docs/api/api_docs/modules/layer_filters.html index 659abc0f2..d39f15b10 100644 --- a/docs/api/api_docs/modules/layer_filters.html +++ b/docs/api/api_docs/modules/layer_filters.html @@ -7,7 +7,7 @@ - Layer Attributes Filters — MCT Documentation: ver 2.2.0 + Layer Attributes Filters — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -48,8 +48,8 @@

    Navigation

    Attribute Filters

    -
    -class model_compression_toolkit.target_platform.AttributeFilter(attr, value, op)
    +
    +class model_compression_toolkit.target_platform_capabilities.AttributeFilter(attr, value, op)

    Wrap a key, value and an operation to filter a layer’s configuration according to. If the layer’s configuration has the key, and its’ value matches when applying the operator, the configuration matches the AttributeFilter.

    @@ -68,8 +68,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.Eq(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.Eq(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that equals to the value that Eq holds.

    Parameters:
    @@ -86,8 +86,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.NotEq(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.NotEq(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that is not equal to the value that NotEq holds.

    Parameters:
    @@ -104,8 +104,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.Greater(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.Greater(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that is greater than the value that Greater holds.

    @@ -123,8 +123,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.GreaterEq(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.GreaterEq(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that is greater or equal than the value that GreaterEq holds.

    @@ -142,8 +142,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.Smaller(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.Smaller(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that is smaller than the value that Smaller holds.

    Parameters:
    @@ -160,8 +160,8 @@

    Attribute Filters
    -
    -class model_compression_toolkit.target_platform.SmallerEq(attr, value)
    +
    +class model_compression_toolkit.target_platform_capabilities.SmallerEq(attr, value)

    Filter configurations such that it matches configurations that have an attribute with a value that is smaller or equal than the value that SmallerEq holds.

    Parameters:
    @@ -214,7 +214,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/network_editor.html b/docs/api/api_docs/modules/network_editor.html index 4d12299f3..1886428e9 100644 --- a/docs/api/api_docs/modules/network_editor.html +++ b/docs/api/api_docs/modules/network_editor.html @@ -7,7 +7,7 @@ - network_editor Module — MCT Documentation: ver 2.2.0 + network_editor Module — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -283,7 +283,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/qat_config.html b/docs/api/api_docs/modules/qat_config.html index 787a31493..f7742d5f6 100644 --- a/docs/api/api_docs/modules/qat_config.html +++ b/docs/api/api_docs/modules/qat_config.html @@ -7,7 +7,7 @@ - qat_config Module — MCT Documentation: ver 2.2.0 + qat_config Module — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -45,16 +45,7 @@

    Navigation

    qat_config Module

    TrainingMethod

    -

    Select a QAT training method:

    -
    -
    -class model_compression_toolkit.qat.TrainingMethod(value)
    -

    An enum for selecting a QAT training method

    -

    STE - Standard straight-through estimator. Includes PowerOfTwo, symmetric & uniform quantizers

    -

    DQA - DNN Quantization with Attention. Includes a smooth quantization introduces by DQA method

    -

    LSQ - Learned Step size Quantization. Includes PowerOfTwo, symmetric & uniform quantizers: https://arxiv.org/pdf/1902.08153.pdf

    -
    - +

    In order to select a training method, please visit the trainable_infrastructure API.


    @@ -69,8 +60,8 @@

    QATConfig
    Parameters:
      -
    • weight_training_method (TrainingMethod) – Training method for weight quantizers

    • -
    • activation_training_method (TrainingMethod) – Training method for activation quantizers:

    • +
    • weight_training_method (TrainingMethod) – Training method for weight quantizers

    • +
    • activation_training_method (TrainingMethod) – Training method for activation quantizers:

    • weight_quantizer_params_override – A dictionary of parameters to override in weight quantization quantizer instantiation. Defaults to None (no parameters)

    • activation_quantizer_params_override – A dictionary of parameters to override in activation quantization quantizer instantiation. Defaults to None (no parameters)

    @@ -119,7 +110,7 @@

    Navigation

  • index
  • - + diff --git a/docs/api/api_docs/modules/target_platform.html b/docs/api/api_docs/modules/target_platform.html deleted file mode 100644 index 4f799584a..000000000 --- a/docs/api/api_docs/modules/target_platform.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - target_platform Module — MCT Documentation: ver 2.2.0 - - - - - - - - - - - - - - - - - -
    -
    -
    -
    - -
    -

    target_platform Module

    -

    MCT can be configured to quantize and optimize models for different hardware settings. -For example, when using qnnpack backend for Pytorch model inference, Pytorch quantization -configuration -uses per-tensor weights quantization -for Conv2d, while when using tflite modeling, Tensorflow uses per-channel weights quantization for -Conv2D.

    -

    This can be addressed in MCT by using the target_platform module, that can configure different -parameters that are hardware-related, and the optimization process will use this to optimize the model accordingly. -Models for IMX500, TFLite and qnnpack can be observed here, and can be used using get_target_platform_capabilities function.

    -
    -

    -
    -
    -

    Note

    -

    For now, some fields of OpQuantizationConfig are ignored during -the optimization process such as quantization_preserving, fixed_scale, and fixed_zero_point.

    - -
    -
    -

    -
    -

    The object MCT should get called TargetPlatformCapabilities (or shortly TPC). -This diagram demonstrates the main components:

    -../../../images/tpc.jpg -

    Now, we will detail about the different components.

    -
    -

    QuantizationMethod

    -
    -
    -class model_compression_toolkit.target_platform.QuantizationMethod(value)
    -

    Method for quantization function selection:

    -

    POWER_OF_TWO - Symmetric, uniform, threshold is power of two quantization.

    -

    LUT_POT_QUANTIZER - quantization using a lookup table and power of 2 threshold.

    -

    SYMMETRIC - Symmetric, uniform, quantization.

    -

    UNIFORM - uniform quantization,

    -

    LUT_SYM_QUANTIZER - quantization using a lookup table and symmetric threshold.

    -
    - -
    -
    -

    OpQuantizationConfig

    -
    -
    -class model_compression_toolkit.target_platform.OpQuantizationConfig(default_weight_attr_config, attr_weights_configs_mapping, activation_quantization_method, activation_n_bits, supported_input_activation_n_bits, enable_activation_quantization, quantization_preserving, fixed_scale, fixed_zero_point, simd_size, signedness)
    -

    OpQuantizationConfig is a class to configure the quantization parameters of an operator.

    -
    -
    Parameters:
    -
      -
    • default_weight_attr_config (AttributeQuantizationConfig) – A default attribute quantization configuration for the operation.

    • -
    • attr_weights_configs_mapping (Dict[str, AttributeQuantizationConfig]) – A mapping between an op attribute name and its quantization configuration.

    • -
    • activation_quantization_method (QuantizationMethod) – Which method to use from QuantizationMethod for activation quantization.

    • -
    • activation_n_bits (int) – Number of bits to quantize the activations.

    • -
    • supported_input_activation_n_bits (int or Tuple[int]) – Number of bits that operator accepts as input.

    • -
    • enable_activation_quantization (bool) – Whether to quantize the model activations or not.

    • -
    • quantization_preserving (bool) – Whether quantization parameters should be the same for an operator’s input and output.

    • -
    • fixed_scale (float) – Scale to use for an operator quantization parameters.

    • -
    • fixed_zero_point (int) – Zero-point to use for an operator quantization parameters.

    • -
    • simd_size (int) – Per op integer representing the Single Instruction, Multiple Data (SIMD) width of an operator. It indicates the number of data elements that can be fetched and processed simultaneously in a single instruction.

    • -
    • signedness (bool) – Set activation quantization signedness.

    • -
    -
    -
    -
    - -
    -
    -

    AttributeQuantizationConfig

    -
    -
    -class model_compression_toolkit.target_platform.AttributeQuantizationConfig(weights_quantization_method=QuantizationMethod.POWER_OF_TWO, weights_n_bits=FLOAT_BITWIDTH, weights_per_channel_threshold=False, enable_weights_quantization=False, lut_values_bitwidth=None)
    -

    Hold the quantization configuration of a weight attribute of a layer.

    -

    Initializes an attribute quantization config.

    -
    -
    Parameters:
    -
      -
    • weights_quantization_method (QuantizationMethod) – Which method to use from QuantizationMethod for weights quantization.

    • -
    • weights_n_bits (int) – Number of bits to quantize the coefficients.

    • -
    • weights_per_channel_threshold (bool) – Whether to quantize the weights per-channel or not (per-tensor).

    • -
    • enable_weights_quantization (bool) – Whether to quantize the model weights or not.

    • -
    • lut_values_bitwidth (int) – Number of bits to use when quantizing in look-up-table.

    • -
    -
    -
    -
    - -
    -
    -

    QuantizationConfigOptions

    -
    -
    -class model_compression_toolkit.target_platform.QuantizationConfigOptions(quantization_config_list, base_config=None)
    -

    Wrap a set of quantization configurations to consider during the quantization -of an operator.

    -
    -
    Parameters:
    -
      -
    • quantization_config_list (List[OpQuantizationConfig]) – List of possible OpQuantizationConfig to gather.

    • -
    • base_config (OpQuantizationConfig) – Fallback OpQuantizationConfig to use when optimizing the model in a non mixed-precision manner.

    • -
    -
    -
    -
    - -
    -
    -

    TargetPlatformModel

    -
    -
    -class model_compression_toolkit.target_platform.TargetPlatformModel(default_qco, add_metadata=False, name='default_tp_model')
    -

    Modeling of the hardware the quantized model will use during inference. -The model contains definition of operators, quantization configurations of them, and -fusing patterns so that multiple operators will be combined into a single operator.

    -
    -
    Parameters:
    -
      -
    • default_qco (QuantizationConfigOptions) – Default QuantizationConfigOptions to use for operators that their QuantizationConfigOptions are not defined in the model.

    • -
    • add_metadata (bool) – Whether to add metadata to the model or not.

    • -
    • name (str) – Name of the model.

    • -
    -
    -
    -
    - -
    -
    -

    OperatorsSet

    -
    -
    -class model_compression_toolkit.target_platform.OperatorsSet(name, qc_options=None)
    -

    Set of operators that are represented by a unique label.

    -
    -
    Parameters:
    -
      -
    • name (str) – Set’s label (must be unique in a TargetPlatformModel).

    • -
    • qc_options (QuantizationConfigOptions) – Configuration options to use for this set of operations.

    • -
    -
    -
    -
    - -
    -
    -

    Fusing

    -
    -
    -class model_compression_toolkit.target_platform.Fusing(operator_groups_list, name=None)
    -

    Fusing defines a list of operators that should be combined and treated as a single operator, -hence no quantization is applied between them.

    -
    -
    Parameters:
    -
      -
    • operator_groups_list (List[Union[OperatorsSet, OperatorSetConcat]]) – A list of operator groups, each being either an OperatorSetConcat or an OperatorsSet.

    • -
    • name (str) – The name for the Fusing instance. If not provided, it’s generated from the operator groups’ names.

    • -
    -
    -
    -
    - -
    -
    -

    OperatorSetConcat

    -
    -
    -class model_compression_toolkit.target_platform.OperatorSetConcat(*opsets)
    -

    Concatenate a list of operator sets to treat them similarly in different places (like fusing).

    -

    Group a list of operation sets.

    -
    -
    Parameters:
    -

    *opsets (OperatorsSet) – List of operator sets to group.

    -
    -
    -
    - -
    -
    -

    OperationsToLayers

    -
    -
    -class model_compression_toolkit.target_platform.OperationsToLayers(op_sets_to_layers=None)
    -

    Gather multiple OperationsSetToLayers to represent mapping of framework’s layers to TargetPlatformModel OperatorsSet.

    -
    -
    Parameters:
    -

    op_sets_to_layers (List[OperationsSetToLayers]) – List of OperationsSetToLayers where each of them maps an OperatorsSet name to a list of layers that represents the OperatorsSet.

    -
    -
    -
    - -
    -
    -

    OperationsSetToLayers

    -
    -
    -class model_compression_toolkit.target_platform.OperationsSetToLayers(op_set_name, layers, attr_mapping=None)
    -

    Associate an OperatorsSet to a list of framework’s layers.

    -
    -
    Parameters:
    -
      -
    • op_set_name (str) – Name of OperatorsSet to associate with layers.

    • -
    • layers (List[Any]) – List of layers/FilterLayerParams to associate with OperatorsSet.

    • -
    • attr_mapping (Dict[str, DefaultDict]) – A mapping between a general attribute name to a DefaultDict that maps a layer type to the layer’s framework name of this attribute.

    • -
    -
    -
    -
    - -
    -
    -

    LayerFilterParams

    -
    -
    -class model_compression_toolkit.target_platform.LayerFilterParams(layer, *conditions, **kwargs)
    -

    Wrap a layer with filters to filter framework’s layers by their attributes.

    -
    -
    Parameters:
    -
      -
    • layer – Layer to match when filtering.

    • -
    • *conditions (AttributeFilter) – List of conditions to satisfy.

    • -
    • **kwargs – Keyword arguments to filter layers according to.

    • -
    -
    -
    -
    - -

    More filters and usage examples are detailed here.

    -
    -
    -

    TargetPlatformCapabilities

    -
    -
    -class model_compression_toolkit.target_platform.TargetPlatformCapabilities(tp_model, name='base', version=None)
    -

    Attach framework information to a modeled hardware.

    -
    -
    Parameters:
    -
      -
    • tp_model (TargetPlatformModel) – Modeled hardware to attach framework information to.

    • -
    • name (str) – Name of the TargetPlatformCapabilities.

    • -
    • version (str) – TPC version.

    • -
    -
    -
    -
    - -
    -
    - - -
    -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/docs/api/api_docs/modules/target_platform_capabilities.html b/docs/api/api_docs/modules/target_platform_capabilities.html new file mode 100644 index 000000000..a611c34dd --- /dev/null +++ b/docs/api/api_docs/modules/target_platform_capabilities.html @@ -0,0 +1,504 @@ + + + + + + + + + + target_platform_capabilities Module — MCT Documentation: ver 2.3.0 + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    target_platform_capabilities Module

    +

    MCT can be configured to quantize and optimize models for different hardware settings. +For example, when using qnnpack backend for Pytorch model inference, Pytorch quantization +configuration +uses per-tensor weights quantization +for Conv2d, while when using tflite modeling, Tensorflow uses per-channel weights quantization for +Conv2D.

    +

    This can be addressed in MCT by using the target_platform_capabilities module, that can configure different +parameters that are hardware-related, and the optimization process will use this to optimize the model accordingly. +Models for IMX500, TFLite and qnnpack can be observed here, and can be used using get_target_platform_capabilities function.

    +
    +

    +
    +
    +

    Note

    +

    For now, some fields of OpQuantizationConfig are ignored during +the optimization process such as quantization_preserving, fixed_scale, and fixed_zero_point.

    +
      +
    • MCT will use more information from OpQuantizationConfig, in the future.

    • +
    +
    +
    +

    +
    +

    The object MCT should get called TargetPlatformCapabilities (or shortly TPC). +This diagram demonstrates the main components:

    +../../../images/tpc_diagram.png +

    Now, we will detail about the different components.

    +
    +

    QuantizationMethod

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.QuantizationMethod(value)
    +

    Method for quantization function selection:

    +

    POWER_OF_TWO - Symmetric, uniform, threshold is power of two quantization.

    +

    LUT_POT_QUANTIZER - quantization using a lookup table and power of 2 threshold.

    +

    SYMMETRIC - Symmetric, uniform, quantization.

    +

    UNIFORM - uniform quantization,

    +

    LUT_SYM_QUANTIZER - quantization using a lookup table and symmetric threshold.

    +
    + +
    +
    +

    OpQuantizationConfig

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OpQuantizationConfig(**data)
    +

    OpQuantizationConfig is a class to configure the quantization parameters of an operator.

    +
    +
    Parameters:
    +
      +
    • default_weight_attr_config (AttributeQuantizationConfig) – A default attribute quantization configuration for the operation.

    • +
    • attr_weights_configs_mapping (Dict[str, AttributeQuantizationConfig]) – A mapping between an op attribute name and its quantization configuration.

    • +
    • activation_quantization_method (QuantizationMethod) – Which method to use from QuantizationMethod for activation quantization.

    • +
    • activation_n_bits (int) – Number of bits to quantize the activations.

    • +
    • supported_input_activation_n_bits (Union[int, Tuple[int, ...]]) – Number of bits that operator accepts as input.

    • +
    • enable_activation_quantization (bool) – Whether to quantize the model activations or not.

    • +
    • quantization_preserving (bool) – Whether quantization parameters should be the same for an operator’s input and output.

    • +
    • fixed_scale (Optional[float]) – Scale to use for an operator quantization parameters.

    • +
    • fixed_zero_point (Optional[int]) – Zero-point to use for an operator quantization parameters.

    • +
    • simd_size (Optional[int]) – Per op integer representing the Single Instruction, Multiple Data (SIMD) width of an operator. It indicates the number of data elements that can be fetched and processed simultaneously in a single instruction.

    • +
    • signedness (Signedness) – Set activation quantization signedness.

    • +
    +
    +
    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    AttributeQuantizationConfig

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.AttributeQuantizationConfig(**data)
    +

    Holds the quantization configuration of a weight attribute of a layer.

    +
    +
    +weights_quantization_method
    +

    The method to use from QuantizationMethod for weights quantization.

    +
    +
    Type:
    +

    QuantizationMethod

    +
    +
    +
    + +
    +
    +weights_n_bits
    +

    Number of bits to quantize the coefficients.

    +
    +
    Type:
    +

    int

    +
    +
    +
    + +
    +
    +weights_per_channel_threshold
    +

    Indicates whether to quantize the weights per-channel or per-tensor.

    +
    +
    Type:
    +

    bool

    +
    +
    +
    + +
    +
    +enable_weights_quantization
    +

    Indicates whether to quantize the model weights or not.

    +
    +
    Type:
    +

    bool

    +
    +
    +
    + +
    +
    +lut_values_bitwidth
    +

    Number of bits to use when quantizing in a look-up table. +If None, defaults to 8 in hptq; otherwise, it uses the provided value.

    +
    +
    Type:
    +

    Optional[int]

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    QuantizationConfigOptions

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.QuantizationConfigOptions(**data)
    +

    QuantizationConfigOptions wraps a set of quantization configurations to consider during the quantization of an operator.

    +
    +
    +quantization_configurations
    +

    Tuple of possible OpQuantizationConfig to gather.

    +
    +
    Type:
    +

    Tuple[OpQuantizationConfig, …]

    +
    +
    +
    + +
    +
    +base_config
    +

    Fallback OpQuantizationConfig to use when optimizing the model in a non-mixed-precision manner.

    +
    +
    Type:
    +

    Optional[OpQuantizationConfig]

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    TargetPlatformCapabilities

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.TargetPlatformCapabilities(**data)
    +

    Represents the hardware configuration used for quantized model inference.

    +
    +
    +default_qco
    +

    Default quantization configuration options for the model.

    +
    +
    Type:
    +

    QuantizationConfigOptions

    +
    +
    +
    + +
    +
    +operator_set
    +

    Tuple of operator sets within the model.

    +
    +
    Type:
    +

    Optional[Tuple[OperatorsSet, …]]

    +
    +
    +
    + +
    +
    +fusing_patterns
    +

    Tuple of fusing patterns for the model.

    +
    +
    Type:
    +

    Optional[Tuple[Fusing, …]]

    +
    +
    +
    + +
    +
    +tpc_minor_version
    +

    Minor version of the Target Platform Configuration.

    +
    +
    Type:
    +

    Optional[int]

    +
    +
    +
    + +
    +
    +tpc_patch_version
    +

    Patch version of the Target Platform Configuration.

    +
    +
    Type:
    +

    Optional[int]

    +
    +
    +
    + +
    +
    +tpc_platform_type
    +

    Type of the platform for the Target Platform Configuration.

    +
    +
    Type:
    +

    Optional[str]

    +
    +
    +
    + +
    +
    +add_metadata
    +

    Flag to determine if metadata should be added.

    +
    +
    Type:
    +

    bool

    +
    +
    +
    + +
    +
    +name
    +

    Name of the Target Platform Model.

    +
    +
    Type:
    +

    str

    +
    +
    +
    + +
    +
    +is_simd_padding
    +

    Indicates if SIMD padding is applied.

    +
    +
    Type:
    +

    bool

    +
    +
    +
    + +
    +
    +SCHEMA_VERSION
    +

    Version of the schema for the Target Platform Model.

    +
    +
    Type:
    +

    int

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    OperatorsSet

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OperatorsSet(**data)
    +

    Set of operators that are represented by a unique label.

    +
    +
    +name
    +

    The set’s label (must be unique within a TargetPlatformCapabilities).

    +
    +
    Type:
    +

    Union[str, OperatorSetNames]

    +
    +
    +
    + +
    +
    +qc_options
    +

    Configuration options to use for this set of operations. +If None, it represents a fusing set.

    +
    +
    Type:
    +

    Optional[QuantizationConfigOptions]

    +
    +
    +
    + +
    +
    +type
    +

    Fixed type identifier.

    +
    +
    Type:
    +

    Literal[“OperatorsSet”]

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    Fusing

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.Fusing(**data)
    +

    Fusing defines a tuple of operators that should be combined and treated as a single operator, +hence no quantization is applied between them.

    +
    +
    +operator_groups
    +

    A tuple of operator groups, +each being either an OperatorSetGroup or an OperatorsSet.

    +
    +
    Type:
    +

    Tuple[Union[OperatorsSet, OperatorSetGroup], …]

    +
    +
    +
    + +
    +
    +name
    +

    The name for the Fusing instance. If not provided, it is generated from the operator groups’ names.

    +
    +
    Type:
    +

    Optional[str]

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    +

    OperatorSetGroup

    +
    +
    +class model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OperatorSetGroup(**data)
    +

    Concatenate a tuple of operator sets to treat them similarly in different places (like fusing).

    +
    +
    +operators_set
    +

    Tuple of operator sets to group.

    +
    +
    Type:
    +

    Tuple[OperatorsSet, …]

    +
    +
    +
    + +
    +
    +name
    +

    Concatenated name generated from the names of the operator sets.

    +
    +
    Type:
    +

    Optional[str]

    +
    +
    +
    + +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises ValidationError if the input data cannot be parsed to form a valid model.

    +
    + +
    +
    + + +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/docs/api/api_docs/modules/trainable_infrastructure.html b/docs/api/api_docs/modules/trainable_infrastructure.html index 27074f6e2..08de2f7f7 100644 --- a/docs/api/api_docs/modules/trainable_infrastructure.html +++ b/docs/api/api_docs/modules/trainable_infrastructure.html @@ -7,7 +7,7 @@ - trainable_infrastructure Module — MCT Documentation: ver 2.2.0 + trainable_infrastructure Module — MCT Documentation: ver 2.3.0 @@ -31,7 +31,7 @@

    Navigation

  • index
  • - + @@ -60,12 +60,16 @@

    BaseKerasTrainableQuantizer
    -class model_compression_toolkit.trainable_infrastructure.BaseKerasTrainableQuantizer(quantization_config)
    +class model_compression_toolkit.trainable_infrastructure.BaseKerasTrainableQuantizer(quantization_config, freeze_quant_params=False)

    This class is a base quantizer which validates provided quantization config and defines an abstract function which any quantizer needs to implement. This class adds to the base quantizer a get_config and from_config functions to enable loading and saving the keras model.

    +

    This class is a base quantizer which validates the provided quantization config and defines an abstract function which any quantizer needs to implment.

    Parameters:
    -

    quantization_config – quantizer config class contains all the information about a quantizer configuration.

    +
      +
    • quantization_config – quantizer config class contains all the information about the quantizer configuration.

    • +
    • freeze_quant_params – whether to freeze all learnable quantization parameters during training.

    • +

    @@ -77,16 +81,32 @@

    BasePytorchTrainableQuantizer
    -class model_compression_toolkit.trainable_infrastructure.BasePytorchTrainableQuantizer(quantization_config)
    -

    This class is a base Pytorch quantizer which validates the provided quantization config and defines an -abstract function which any quantizer needs to implement.

    +class model_compression_toolkit.trainable_infrastructure.BasePytorchTrainableQuantizer(quantization_config, freeze_quant_params=False) +

    Base class for PyTorch trainable quantizers

    +

    This class is a base quantizer which validates the provided quantization config and defines an abstract function which any quantizer needs to implment.

    Parameters:
    -

    quantization_config – quantizer config class contains all the information about the quantizer configuration.

    +
      +
    • quantization_config – quantizer config class contains all the information about the quantizer configuration.

    • +
    • freeze_quant_params – whether to freeze all learnable quantization parameters during training.

    • +

    +

    +
    +

    TrainingMethod

    +

    Select a training method:

    +
    +
    +class model_compression_toolkit.trainable_infrastructure.TrainingMethod(value)
    +

    An enum for selecting a training method

    +

    STE - Standard straight-through estimator. Includes PowerOfTwo, symmetric & uniform quantizers

    +

    DQA - DNN Quantization with Attention. Includes a smooth quantization introduces by DQA method

    +

    LSQ - Learned Step size Quantization. Includes PowerOfTwo, symmetric & uniform quantizers: https://arxiv.org/pdf/1902.08153.pdf

    +
    +

    TrainableQuantizerWeightsConfig

    @@ -98,7 +118,7 @@

    TrainableQuantizerWeightsConfig
    Parameters:
    @@ -43,10 +43,10 @@

    Navigation

    Note

    -

    For now, some fields of OpQuantizationConfig are ignored during +

    For now, some fields of OpQuantizationConfig are ignored during the optimization process such as quantization_preserving, fixed_scale, and fixed_zero_point.

      -
    • MCT will use more information from OpQuantizationConfig, in the future.

    • +
    • MCT will use more information from OpQuantizationConfig, in the future.

    @@ -77,7 +77,7 @@

    Navigation

  • index
  • - + diff --git a/docs/genindex.html b/docs/genindex.html index 4382c5f92..b838d1785 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -6,7 +6,7 @@ - Index — MCT Documentation: ver 2.2.0 + Index — MCT Documentation: ver 2.3.0 @@ -30,7 +30,7 @@

    Navigation

  • index
  • - + @@ -62,17 +62,20 @@

    Index

    | R | S | T + | W | X

    A

    @@ -80,14 +83,16 @@

    A

    B

    @@ -161,12 +170,14 @@

    F

    @@ -192,9 +203,11 @@

    G

  • GradientPTQConfig (class in model_compression_toolkit.gptq)
  • -
  • Greater (class in model_compression_toolkit.target_platform) +
  • GradualActivationQuantizationConfig (class in model_compression_toolkit.gptq)
  • -
  • GreaterEq (class in model_compression_toolkit.target_platform) +
  • Greater (class in model_compression_toolkit.target_platform_capabilities) +
  • +
  • GreaterEq (class in model_compression_toolkit.target_platform_capabilities)
  • @@ -215,6 +228,8 @@

    I

  • importance_scores (model_compression_toolkit.pruning.PruningInfo property)
  • ImportanceMetric (class in model_compression_toolkit.pruning) +
  • +
  • is_simd_padding (model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.TargetPlatformCapabilities attribute)
  • @@ -252,7 +267,7 @@

    K

    L

    @@ -276,15 +291,25 @@

    M

    N

    @@ -394,9 +429,13 @@

    S

    T

    +
    + +

    W

    + + +
    @@ -451,7 +506,7 @@

    Navigation

  • index
  • - + diff --git a/docs/guidelines/visualization.html b/docs/guidelines/visualization.html index 7d43406fc..e3d690ae0 100644 --- a/docs/guidelines/visualization.html +++ b/docs/guidelines/visualization.html @@ -7,7 +7,7 @@ - Visualization within TensorBoard — MCT Documentation: ver 2.2.0 + Visualization within TensorBoard — MCT Documentation: ver 2.3.0 @@ -39,7 +39,7 @@

    Navigation

  • previous |
  • - + @@ -186,7 +186,7 @@

    Navigation

  • previous |
  • - + diff --git a/docs/images/tpc.jpg b/docs/images/tpc.jpg deleted file mode 100644 index 3bbd863986e4ef7a3151b3be0c547aa070b4f902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69512 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�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

    (TwN8Q8Q{3hsXb<`1X~Utigr|+P1r;0j3wvA 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 AQvd(} literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index 0c9e7fd19..3556d8917 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,7 +7,7 @@ - Model Compression Toolkit User Guide — MCT Documentation: ver 2.2.0 + Model Compression Toolkit User Guide — MCT Documentation: ver 2.3.0 @@ -35,7 +35,7 @@

    Navigation

  • next |
  • - + @@ -181,7 +181,7 @@

    Navigation

  • next |
  • - + diff --git a/docs/objects.inv b/docs/objects.inv index 01caa131710fabb7a7535f4de1f2175d42fa6968..d44eb99ca748f5675d5967da3940d6cd9343eef6 100644 GIT binary patch delta 6270 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 delta 6009 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 npzRSxYlwE5u;&p@DPqZnl!rl!yx - Search — MCT Documentation: ver 2.2.0 + Search — MCT Documentation: ver 2.3.0 @@ -36,7 +36,7 @@

    Navigation

  • index
  • - + @@ -93,7 +93,7 @@

    Navigation

  • index
  • - + diff --git a/docs/searchindex.js b/docs/searchindex.js index 6bb933530..e151d20f1 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api/api_docs/classes/BitWidthConfig", "api/api_docs/classes/DataGenerationConfig", "api/api_docs/classes/DefaultDict", "api/api_docs/classes/FrameworkInfo", "api/api_docs/classes/GradientPTQConfig", "api/api_docs/classes/MixedPrecisionQuantizationConfig", "api/api_docs/classes/MpDistanceWeighting", "api/api_docs/classes/PruningConfig", "api/api_docs/classes/PruningInfo", "api/api_docs/classes/QuantizationConfig", "api/api_docs/classes/QuantizationErrorMethod", "api/api_docs/classes/ResourceUtilization", "api/api_docs/classes/XQuantConfig", "api/api_docs/index", "api/api_docs/methods/get_keras_data_generation_config", "api/api_docs/methods/get_keras_gptq_config", "api/api_docs/methods/get_pytorch_data_generation_config", "api/api_docs/methods/get_pytroch_gptq_config", "api/api_docs/methods/get_target_platform_capabilities", "api/api_docs/methods/keras_data_generation_experimental", "api/api_docs/methods/keras_gradient_post_training_quantization", "api/api_docs/methods/keras_kpi_data", "api/api_docs/methods/keras_load_quantizad_model", "api/api_docs/methods/keras_post_training_quantization", "api/api_docs/methods/keras_pruning_experimental", "api/api_docs/methods/keras_quantization_aware_training_finalize_experimental", "api/api_docs/methods/keras_quantization_aware_training_init_experimental", "api/api_docs/methods/pytorch_data_generation_experimental", "api/api_docs/methods/pytorch_gradient_post_training_quantization", "api/api_docs/methods/pytorch_kpi_data", "api/api_docs/methods/pytorch_post_training_quantization", "api/api_docs/methods/pytorch_pruning_experimental", "api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental", "api/api_docs/methods/pytorch_quantization_aware_training_init_experimental", "api/api_docs/methods/set_logger_path", "api/api_docs/methods/xquant_report_keras_experimental", "api/api_docs/methods/xquant_report_pytorch_experimental", "api/api_docs/modules/core_config", "api/api_docs/modules/debug_config", "api/api_docs/modules/exporter", "api/api_docs/modules/layer_filters", "api/api_docs/modules/network_editor", "api/api_docs/modules/qat_config", "api/api_docs/modules/target_platform", "api/api_docs/modules/trainable_infrastructure", "api/api_docs/notes/tpc_note", "guidelines/visualization", "index"], "filenames": ["api/api_docs/classes/BitWidthConfig.rst", "api/api_docs/classes/DataGenerationConfig.rst", "api/api_docs/classes/DefaultDict.rst", "api/api_docs/classes/FrameworkInfo.rst", "api/api_docs/classes/GradientPTQConfig.rst", "api/api_docs/classes/MixedPrecisionQuantizationConfig.rst", "api/api_docs/classes/MpDistanceWeighting.rst", "api/api_docs/classes/PruningConfig.rst", "api/api_docs/classes/PruningInfo.rst", "api/api_docs/classes/QuantizationConfig.rst", "api/api_docs/classes/QuantizationErrorMethod.rst", "api/api_docs/classes/ResourceUtilization.rst", "api/api_docs/classes/XQuantConfig.rst", "api/api_docs/index.rst", "api/api_docs/methods/get_keras_data_generation_config.rst", "api/api_docs/methods/get_keras_gptq_config.rst", "api/api_docs/methods/get_pytorch_data_generation_config.rst", "api/api_docs/methods/get_pytroch_gptq_config.rst", "api/api_docs/methods/get_target_platform_capabilities.rst", "api/api_docs/methods/keras_data_generation_experimental.rst", "api/api_docs/methods/keras_gradient_post_training_quantization.rst", "api/api_docs/methods/keras_kpi_data.rst", "api/api_docs/methods/keras_load_quantizad_model.rst", "api/api_docs/methods/keras_post_training_quantization.rst", "api/api_docs/methods/keras_pruning_experimental.rst", "api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.rst", "api/api_docs/methods/keras_quantization_aware_training_init_experimental.rst", "api/api_docs/methods/pytorch_data_generation_experimental.rst", "api/api_docs/methods/pytorch_gradient_post_training_quantization.rst", "api/api_docs/methods/pytorch_kpi_data.rst", "api/api_docs/methods/pytorch_post_training_quantization.rst", "api/api_docs/methods/pytorch_pruning_experimental.rst", "api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.rst", "api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.rst", "api/api_docs/methods/set_logger_path.rst", "api/api_docs/methods/xquant_report_keras_experimental.rst", "api/api_docs/methods/xquant_report_pytorch_experimental.rst", "api/api_docs/modules/core_config.rst", "api/api_docs/modules/debug_config.rst", "api/api_docs/modules/exporter.rst", "api/api_docs/modules/layer_filters.rst", "api/api_docs/modules/network_editor.rst", "api/api_docs/modules/qat_config.rst", "api/api_docs/modules/target_platform.rst", "api/api_docs/modules/trainable_infrastructure.rst", "api/api_docs/notes/tpc_note.rst", "guidelines/visualization.rst", "index.rst"], "titles": ["BitWidthConfig", "Data Generation Configuration", "DefaultDict Class", "FrameworkInfo Class", "GradientPTQConfig Class", "MixedPrecisionQuantizationConfig", "MpDistanceWeighting", "Pruning Configuration", "Pruning Information", "QuantizationConfig", "QuantizationErrorMethod", "ResourceUtilization", "XQuant Configuration", "API Docs", "Get DataGenerationConfig for Keras Models", "Get GradientPTQConfig for Keras Models", "Get DataGenerationConfig for Pytorch Models", "Get GradientPTQConfig for Pytorch Models", "Get TargetPlatformCapabilities", "Keras Data Generation", "Keras Gradient Based Post Training Quantization", "Get Resource Utilization information for Keras Models", "Load Quantized Keras Model", "Keras Post Training Quantization", "Keras Structured Pruning", "Keras Quantization Aware Training Model Finalize", "Keras Quantization Aware Training Model Init", "Pytorch Data Generation", "Pytorch Gradient Based Post Training Quantization", "Get Resource Utilization information for PyTorch Models", "Pytorch Post Training Quantization", "Pytorch Structured Pruning", "PyTorch Quantization Aware Training Model Finalize", "PyTorch Quantization Aware Training Model Init", "Enable a Logger", "XQuant Report Keras", "XQuant Report Pytorch", "CoreConfig", "debug_config Module", "exporter Module", "Layer Attributes Filters", "network_editor Module", "qat_config Module", "target_platform Module", "trainable_infrastructure Module", "<no title>", "Visualization within TensorBoard", "Model Compression Toolkit User Guide"], "terms": {"class": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 37, 38, 39, 40, 41, 42, 43, 44], "model_compression_toolkit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46], "core": [0, 3, 5, 6, 9, 10, 11, 20, 21, 23, 24, 25, 26, 28, 29, 31, 32, 33, 37, 38, 41], "manual_activation_bit_width_selection_list": 0, "none": [0, 1, 2, 4, 5, 12, 15, 17, 18, 20, 22, 23, 26, 28, 30, 33, 37, 39, 41, 42, 43, 44], "manag": 0, "manual": [0, 13, 37], "bit": [0, 5, 11, 13, 20, 23, 25, 26, 33, 37, 39, 41, 43, 44, 47], "width": [0, 5, 13, 20, 23, 26, 27, 33, 37, 43, 47], "configur": [0, 4, 5, 9, 11, 13, 14, 15, 16, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43, 44, 47], "A": [0, 3, 4, 5, 8, 13, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 42, 43, 47], "list": [0, 1, 3, 4, 5, 14, 15, 16, 17, 19, 27, 38, 41, 43, 47], "object": [0, 3, 4, 5, 7, 11, 14, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 28, 29, 30, 33, 39, 41, 43, 44], "defin": [0, 4, 5, 6, 15, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 43, 44], "type": [0, 1, 2, 4, 5, 7, 8, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 27, 29, 31, 35, 36, 39, 41, 43], "common": [0, 12], "quantiz": [0, 3, 4, 5, 9, 10, 11, 12, 13, 15, 17, 19, 21, 27, 29, 35, 36, 37, 38, 41, 42, 43, 44, 46, 47], "bit_width_config": [0, 37], "filter": [0, 1, 7, 43], "bit_width": 0, "encapsul": 0, "select": [0, 3, 7, 9, 10, 13, 37, 39, 42, 43, 44], "specif": [0, 3, 24, 31, 41, 46], "The": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 35, 36, 39, 41, 43, 44, 46], "us": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47], "node": [0, 26, 33, 41, 44, 46], "manipul": [0, 1], "basenodematch": 0, "appli": [0, 1, 13, 39, 40, 41, 43], "int": [0, 1, 4, 5, 7, 9, 14, 15, 16, 17, 19, 27, 43, 44], "data_gener": [1, 14, 16, 19, 27], "datagenerationconfig": [1, 13, 19, 27], "n_iter": [1, 14, 16, 19, 27], "optim": [1, 3, 4, 9, 11, 13, 14, 15, 16, 17, 18, 20, 21, 23, 26, 28, 29, 30, 33, 37, 43, 44, 45, 47], "data_gen_batch_s": [1, 14, 16, 19, 27], "initial_lr": [1, 14, 16], "output_loss_multipli": [1, 14, 16], "image_granular": [1, 14, 16], "allimag": [1, 16], "scheduler_typ": [1, 14, 16], "bn_alignment_loss_typ": [1, 14, 16], "output_loss_typ": [1, 14, 16], "data_init_typ": [1, 14, 16], "layer_weighting_typ": [1, 14, 16], "image_pipeline_typ": [1, 14, 16], "image_normalization_typ": [1, 14, 16], "extra_pixel": [1, 14, 16], "0": [1, 3, 4, 5, 8, 9, 14, 15, 16, 20, 23, 24, 25, 26, 31, 39, 44], "bn_layer_typ": [1, 14, 16], "last_layer_typ": [1, 16], "image_clip": [1, 14, 16], "true": [1, 4, 5, 9, 15, 16, 17, 22, 32, 33, 44], "initi": [1, 2, 4, 7, 12, 14, 16, 26, 33, 43, 44], "paramet": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "number": [1, 4, 5, 7, 14, 15, 16, 17, 19, 20, 23, 24, 26, 27, 28, 30, 31, 33, 43, 44], "iter": [1, 14, 16, 19, 20, 23, 26, 27, 28, 30, 33], "ani": [1, 2, 3, 4, 35, 36, 39, 40, 43, 44], "batch": [1, 4, 5, 14, 15, 16, 17, 19, 20, 23, 26, 27, 28, 30, 33], "size": [1, 4, 5, 14, 15, 16, 17, 19, 20, 23, 25, 26, 27, 33, 39, 42], "float": [1, 4, 5, 9, 14, 15, 16, 17, 20, 26, 28, 30, 33, 35, 36, 39, 43, 44, 46], "learn": [1, 14, 15, 16, 42], "rate": [1, 14, 15, 16], "multipli": [1, 14, 16], "output": [1, 3, 6, 9, 14, 16, 19, 20, 23, 26, 27, 28, 30, 32, 33, 43, 46, 47], "loss": [1, 4, 14, 15, 16, 17, 20, 24, 28, 30, 31], "granular": [1, 14, 16], "imag": [1, 5, 14, 16, 19, 20, 23, 26, 27, 28, 30, 33, 46], "default": [1, 2, 4, 7, 14, 15, 16, 18, 20, 23, 24, 28, 30, 31, 37, 39, 42, 43, 46], "schedul": [1, 14, 16, 38], "batchnorm": [1, 14, 16, 19, 20, 23, 26, 28, 30, 33], "align": [1, 14, 16], "layer": [1, 3, 5, 6, 8, 14, 16, 19, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 38, 39, 41, 43, 44, 46], "weight": [1, 3, 4, 5, 6, 9, 11, 13, 14, 15, 16, 17, 20, 21, 24, 26, 28, 29, 30, 31, 32, 33, 39, 41, 42, 43, 44, 46], "pipelin": [1, 14, 16], "normal": [1, 4, 5, 14, 16], "union": [1, 14, 16, 19, 27, 43], "tupl": [1, 3, 14, 16, 19, 20, 24, 27, 31, 41, 43], "extra": [1, 14, 16], "pixel": [1, 14, 16], "add": [1, 3, 12, 14, 16, 22, 43, 44], "input": [1, 5, 9, 14, 16, 20, 23, 26, 28, 30, 33, 43], "bool": [1, 4, 5, 9, 14, 15, 16, 17, 38, 43, 44], "flag": 1, "enabl": [1, 5, 9, 13, 38, 44, 47], "clip": [1, 14, 16], "valu": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 20, 23, 24, 25, 26, 31, 39, 40, 41, 42, 43], "an": [1, 2, 3, 4, 8, 13, 20, 23, 26, 33, 35, 36, 39, 40, 41, 42, 43, 44, 47], "enum": [1, 3, 4, 5, 6, 7, 10, 42], "choos": [1, 4, 39], "depend": [1, 20, 23, 26, 28, 30, 33], "when": [1, 2, 3, 5, 7, 10, 11, 13, 15, 17, 20, 23, 25, 26, 38, 40, 42, 43, 44, 46], "imagewis": 1, "batchwis": [1, 14], "reduce_on_plateau": [1, 14], "reduceonplateau": 1, "step": [1, 42], "l2_squar": [1, 14, 16], "l2": 1, "squar": [1, 10], "No": 1, "negative_min_max_diff": [1, 16], "mean": [1, 4, 10, 46], "neg": [1, 9], "min": [1, 3, 9, 10, 20, 23, 26, 28, 30, 33, 46], "max": [1, 3, 9, 10, 20, 21, 23, 26, 28, 29, 30, 33, 46], "differ": [1, 5, 9, 13, 20, 23, 25, 26, 39, 43, 46], "inverse_min_max_diff": 1, "1": [1, 3, 4, 5, 8, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 39, 47], "regularized_min_max_diff": [1, 14], "regular": [1, 4, 15, 17], "gaussian": [1, 14, 16], "divers": 1, "averag": [1, 4, 5, 6, 14, 15, 16, 17], "same": [1, 39, 43], "per": [1, 3, 20, 23, 26, 33, 43, 44, 46], "first_layer_multipli": 1, "first": [1, 20, 23, 26, 28, 30, 33, 39, 46], "all": [1, 3, 4, 6, 9, 41, 44, 46], "other": [1, 15, 17], "grad": 1, "gradient": [1, 13, 30, 47], "base": [1, 4, 5, 10, 13, 15, 17, 19, 24, 27, 30, 31, 43, 44, 47], "smoothing_and_augment": [1, 14, 16], "smooth": [1, 42], "crop": 1, "flip": 1, "ident": 1, "do": [1, 46], "transform": [1, 20, 23, 26, 28, 30, 33], "torchvis": [1, 16, 28, 29, 30, 31, 32, 33, 39], "keras_appl": [1, 14], "imagenet": 1, "no_norm": 1, "known_dict": 2, "default_valu": 2, "dictionari": [2, 3, 4, 12, 25, 26, 35, 36, 39, 41, 42, 44], "It": [2, 12, 43, 44], "wrap": [2, 3, 9, 22, 26, 33, 40, 43, 44], "given": [2, 11, 20, 21, 23, 26, 28, 29, 30, 33], "return": [2, 4, 5, 8, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 39], "its": [2, 3, 9, 22, 24, 31, 40, 43, 46], "request": 2, "If": [2, 3, 5, 20, 23, 25, 26, 28, 30, 37, 39, 40, 43], "kei": [2, 6, 12, 24, 31, 40], "present": [2, 46], "pass": [2, 3, 9, 15, 17, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 41], "gener": [2, 12, 13, 14, 16, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 43, 46, 47], "provid": [2, 5, 19, 24, 27, 31, 39, 43, 44, 46], "empti": 2, "get": [2, 3, 4, 5, 13, 20, 23, 25, 26, 28, 30, 32, 33, 43, 46], "inner": 2, "default_factori": 2, "exist": [2, 41], "wa": [2, 39], "follow": [3, 4, 44, 46], "api": [3, 4, 23, 26, 33], "can": [3, 4, 6, 9, 13, 15, 17, 18, 19, 21, 24, 27, 29, 31, 38, 39, 41, 43, 44, 46, 47], "mct": [3, 9, 13, 15, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 45, 46, 47], "framework": [3, 18, 43, 44], "relat": [3, 8, 13, 43], "inform": [3, 4, 13, 15, 17, 18, 20, 23, 24, 26, 28, 30, 31, 33, 38, 43, 44, 45], "network": [3, 7, 9, 32, 37, 38, 41, 46, 47], "activation_quantizer_map": 3, "kernel_channels_map": 3, "activation_min_max_map": 3, "layer_min_max_map": 3, "kernel_ops_attributes_map": 3, "out_channel_axis_map": 3, "about": [3, 4, 8, 13, 15, 17, 20, 23, 25, 26, 39, 43, 44], "librari": [3, 9], "need": [3, 20, 23, 26, 28, 30, 33, 39, 40, 44], "model": [3, 4, 5, 8, 9, 11, 12, 13, 18, 19, 20, 23, 24, 27, 28, 30, 31, 35, 36, 37, 41, 42, 43, 44, 46], "hold": [3, 37, 40, 43], "how": [3, 7, 20, 21, 23, 26, 28, 30, 33, 39, 44, 47], "thei": 3, "should": [3, 4, 7, 9, 11, 15, 17, 20, 21, 23, 24, 25, 26, 28, 30, 31, 33, 39, 43, 46], "multipl": [3, 5, 43], "map": [3, 43], "kernel": [3, 11, 20, 23, 25, 26, 41, 44], "channel": [3, 7, 8, 9, 13, 24, 31, 43, 44, 46], "indic": [3, 8, 24, 31, 43], "etc": [3, 11, 13, 20, 23, 26, 28, 30, 33, 46], "ar": [3, 4, 12, 18, 20, 23, 24, 26, 28, 30, 31, 33, 39, 43, 44, 45, 46], "divid": 3, "three": 3, "group": [3, 7, 24, 31, 43], "kernel_op": 3, "have": [3, 39, 40, 46], "coeffici": [3, 11, 20, 23, 25, 26, 28, 30, 43, 44], "e": [3, 20, 23, 26, 28, 30, 33, 47], "g": [3, 20, 23, 26, 28, 30, 33], "conv2d": [3, 11, 19, 20, 23, 25, 26, 27, 41, 43], "dens": [3, 19], "activation_op": 3, "relu": [3, 9], "no_quantization_op": 3, "reshap": [3, 19], "transpos": 3, "dict": [3, 4, 8, 12, 35, 36, 39, 43, 44], "quantizationmethod": [3, 44], "callabl": [3, 4, 5, 12, 15, 17, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 35, 36, 39, 40], "from": [3, 4, 9, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 41, 43, 44, 45, 46, 47], "function": [3, 4, 5, 6, 13, 14, 15, 16, 17, 19, 22, 24, 27, 31, 41, 43, 44], "defaultdict": [3, 13, 43], "out": [3, 7], "str": [3, 12, 35, 36, 39, 40, 43], "activ": [3, 9, 11, 20, 21, 23, 26, 28, 29, 30, 33, 39, 41, 42, 43, 44, 46], "oper": [3, 11, 38, 40, 43], "attirbut": 3, "s": [3, 7, 9, 11, 20, 23, 24, 25, 26, 28, 30, 31, 33, 39, 40, 41, 43, 44, 47], "comput": [3, 4, 5, 6, 10, 12, 13, 15, 17, 21, 29, 35, 38, 46], "statist": [3, 20, 23, 26, 28, 30, 33, 46], "exampl": [3, 4, 9, 11, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 41, 43, 44, 47], "kera": [3, 4, 11, 13, 41, 44, 47], "we": [3, 19, 20, 23, 24, 26, 27, 31, 33, 39, 41, 43, 44, 46], "want": 3, "onli": [3, 4, 5, 6, 7, 11, 20, 23, 25, 26, 39], "set": [3, 6, 12, 13, 15, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 41, 43, 44, 46], "know": 3, "3": [3, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 44], "2": [3, 9, 15, 19, 27, 43, 44, 47], "respectivli": 3, "import": [3, 7, 8, 9, 13, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 41, 44, 46], "tensorflow": [3, 13, 15, 18, 19, 20, 21, 23, 24, 25, 26, 39, 41, 43, 47], "tf": [3, 15, 19, 22, 25, 26], "Then": [3, 20, 23, 26, 28, 30, 33, 41, 46], "creat": [3, 4, 9, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 40, 41], "rang": [3, 20, 23, 26, 28, 30, 33], "advanc": 3, "save": [3, 12, 26, 34, 39, 44], "collect": [3, 20, 23, 26, 28, 30, 33, 35, 36, 46], "time": [3, 7, 44], "For": [3, 9, 18, 19, 20, 23, 25, 26, 27, 33, 39, 43, 44, 45, 46, 47], "softmax": [3, 9], "format": [3, 13], "index": [3, 13], "axi": [3, 44], "nhwc": 3, "last": [3, 6], "nchw": 3, "instanc": [4, 13, 15, 17, 41, 43, 46], "which": [4, 7, 9, 39, 40, 41, 43, 44], "post": [4, 13, 24, 26, 31, 33, 47], "train": [4, 13, 42, 44, 47], "knowledg": [4, 47], "distil": [4, 47], "teacher": 4, "student": 4, "gptq": [4, 15, 17, 20, 28], "n_epoch": [4, 15, 17, 20], "optimizer_rest": [4, 15, 17], "log_funct": [4, 15, 17], "train_bia": 4, "rounding_typ": 4, "softquant": 4, "use_hessian_based_weight": [4, 15, 17], "optimizer_quantization_paramet": 4, "optimizer_bia": 4, "regularization_factor": [4, 15, 17], "reg_default": [4, 15, 17], "hessian_weights_config": 4, "gptq_quantizer_params_overrid": 4, "gradientptq": [4, 13], "repres": [4, 5, 11, 15, 17, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 35, 36, 39, 41, 43, 46], "dataset": [4, 15, 17, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 39, 46], "epoch": [4, 15, 17], "bia": [4, 9, 11, 15, 17, 20, 23, 25, 26], "accept": [4, 15, 17, 43], "6": [4, 27], "tensor": [4, 5, 12, 15, 17, 19, 21, 27, 29, 43, 44, 46, 47], "1st": [4, 15, 17], "2nd": [4, 15, 17], "3rd": [4, 15, 17], "4th": [4, 15, 17], "5th": 4, "6th": 4, "std": 4, "accordingli": [4, 43], "see": [4, 47], "multiple_tensors_mse_loss": [4, 17], "log": [4, 12, 13, 15, 17, 34, 46], "process": [4, 5, 9, 13, 14, 15, 16, 17, 18, 19, 24, 27, 31, 37, 38, 41, 42, 43, 45, 46], "whether": [4, 5, 8, 9, 14, 15, 16, 17, 22, 38, 39, 43, 44], "updat": 4, "dure": [4, 9, 13, 14, 15, 16, 17, 18, 35, 36, 39, 41, 43, 44, 45, 46], "round": 4, "hessian": [4, 5, 7, 10, 15, 17, 24, 31, 47], "overrid": [4, 42], "rest": 4, "point": [4, 5, 15, 17, 20, 28, 30, 35, 36, 43, 46], "factor": [4, 5, 10, 15, 17], "includ": [4, 8, 11, 20, 23, 26, 28, 30, 33, 42], "necessari": [4, 39, 44], "argument": [4, 6, 43], "run": [4, 15, 17, 39, 46], "score": [4, 5, 7, 8, 9, 10, 24, 31], "instanti": [4, 9, 42], "hessians_num_sampl": 4, "gptq_hessian_num_sampl": 4, "norm_scor": [4, 5], "log_norm": 4, "scale_log_norm": 4, "fals": [4, 5, 9, 14, 38, 43], "hessian_batch_s": [4, 5, 15, 17], "act_hessian_default_batch_s": [4, 5, 15, 17], "metric": [4, 5, 6, 7, 11, 12, 13, 35, 36], "gptqhessianweightsconfig": 4, "sampl": [4, 46], "between": [4, 5, 9, 12, 20, 28, 30, 43, 46], "scale": [4, 5, 9, 43], "final": [4, 5, 13, 19, 27, 41, 46, 47], "vector": [4, 46], "method": [4, 5, 6, 7, 9, 10, 13, 24, 31, 39, 41, 42, 43, 44], "ste": [4, 42], "straight": [4, 42], "through": [4, 19, 24, 27, 42], "estim": [4, 42], "mix": [5, 6, 11, 13, 20, 21, 23, 25, 26, 28, 29, 30, 33, 37, 43, 47], "precis": [5, 6, 11, 13, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 33, 37, 43, 47], "compute_distance_fn": 5, "distance_weighting_method": 5, "mpdistanceweight": [5, 13], "avg": [5, 6], "num_of_imag": [5, 20, 23], "mp_default_num_sampl": 5, "configuration_overwrit": 5, "num_interest_points_factor": 5, "use_hessian_based_scor": 5, "refine_mp_solut": 5, "metric_normalization_threshold": 5, "1e10": 5, "distanc": [5, 6, 13], "two": [5, 12, 20, 23, 26, 28, 30, 33, 39, 43, 46], "pre": 5, "each": [5, 7, 8, 20, 23, 24, 26, 28, 30, 31, 33, 41, 43, 44, 46], "among": 5, "sensit": [5, 7, 24, 31], "evalu": [5, 35, 36], "compar": [5, 20, 28, 30, 46], "integ": [5, 39, 43], "overwrit": 5, "predefin": [5, 7], "one": [5, 9, 40, 46], "zero": [5, 43], "percentag": 5, "reduc": [5, 24, 31], "interest": 5, "calcul": [5, 7, 13, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33], "try": 5, "improv": [5, 24, 31], "greedi": [5, 7], "algorithm": 5, "search": [5, 9, 11, 13, 20, 23, 26, 28, 30, 33], "increas": 5, "threshold": [5, 9, 10, 20, 23, 26, 28, 30, 33, 43, 44], "check": [5, 39, 40, 41], "In": [5, 19, 20, 23, 26, 27, 28, 30, 33, 39, 40], "case": 5, "larger": 5, "than": [5, 40], "thi": [5, 8, 10, 11, 13, 19, 20, 22, 23, 24, 25, 26, 27, 28, 30, 31, 33, 39, 43, 44, 47], "prevent": 5, "numer": 5, "issu": [5, 39], "call": [6, 21, 29, 43, 46], "take": [6, 23, 26, 33, 47], "last_lay": 6, "pruningconfig": [7, 13, 24, 31], "num_score_approxim": [7, 24, 31], "pruning_num_score_approxim": 7, "importance_metr": 7, "lfh": [7, 24, 31], "channels_filtering_strategi": 7, "specifi": [7, 14, 16, 19, 22, 24, 27, 31, 39], "neural": [7, 47], "approxim": [7, 24, 31], "perform": [7, 11, 19, 24, 27, 31], "strategi": [7, 24, 31], "constant": [7, 41, 44], "label": [7, 24, 31, 43, 47], "free": [7, 19, 24, 27, 31, 47], "approach": 7, "determin": [7, 24, 31], "info": [7, 34], "measur": [7, 11, 12, 46], "least": 7, "up": [7, 19, 27, 43, 46], "allow": [7, 12, 19, 27, 39], "resourc": [7, 11, 13, 20, 23, 24, 25, 26, 31, 32, 33, 46], "util": [7, 11, 13, 20, 23, 24, 25, 26, 31, 32, 33, 44], "limit": [7, 20, 23, 25, 26, 28, 30, 33], "now": [7, 18, 33, 39, 43, 44, 45, 46], "weights_memori": [7, 11, 20, 23, 24, 26, 31, 33], "consid": [7, 14, 16, 24, 31, 43], "pruninginfo": [8, 13, 24, 31], "pruning_mask": 8, "importance_scor": 8, "store": [8, 44], "mask": 8, "act": 8, "contain": [8, 13, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 43, 44], "access": 8, "metadata": [8, 43], "basenod": 8, "np": [8, 11, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "ndarrai": 8, "arrai": 8, "where": [8, 12, 39, 41, 43, 46], "element": [8, 43], "correspond": 8, "neuron": 8, "ha": [8, 39, 40, 41], "been": 8, "kept": [8, 26, 33], "quantifi": [8, 46], "signific": 8, "properti": 8, "activation_error_method": 9, "quantizationerrormethod": [9, 13], "mse": [9, 10, 46], "weights_error_method": 9, "relu_bound_to_power_of_2": 9, "weights_bias_correct": 9, "weights_second_moment_correct": 9, "input_sc": 9, "softmax_shift": 9, "shift_negative_activation_correct": 9, "activation_channel_equ": 9, "z_threshold": 9, "math": 9, "inf": [9, 11], "min_threshold": [9, 44], "l_p_valu": 9, "linear_collaps": 9, "residual_collaps": 9, "shift_negative_ratio": 9, "05": 9, "shift_negative_threshold_recalcul": 9, "shift_negative_params_search": 9, "concat_threshold_upd": 9, "accord": [9, 11, 13, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 39, 40, 43], "power": [9, 20, 23, 26, 28, 30, 33, 43], "correct": 9, "second_mo": 9, "shift": 9, "equal": [9, 40], "z": 9, "outlier": 9, "remov": [9, 24, 31, 32], "minimum": [9, 44], "p": [9, 31], "l_p": 9, "norm": [9, 10, 46], "block_collaps": 9, "collaps": 9, "block": [9, 44, 46], "anoth": 9, "ratio": 9, "minim": [9, 10, 20, 24, 28, 30, 31], "non": [9, 43], "linear": [9, 27], "abov": 9, "occur": 9, "recomput": 9, "after": [9, 13, 20, 22, 23, 26, 33, 47], "One": [9, 46], "mai": [9, 19, 20, 23, 26, 27, 28, 30, 33, 40, 46], "done": [9, 46], "noclip": [9, 10], "qc": 9, "instans": 9, "keras_post_training_quant": [9, 13, 15, 23, 39, 41, 46], "error": 10, "nois": 10, "mae": [10, 46], "absolut": 10, "kl": [10, 46], "diverg": [10, 46], "make": 10, "signal": 10, "distribut": 10, "similar": [10, 12, 35, 36, 38, 47], "possibl": [10, 20, 23, 26, 33, 43, 46], "lp": 10, "hmse": 10, "more": [10, 18, 23, 24, 26, 31, 33, 39, 43, 45, 46], "valuabl": 10, "induc": 10, "prune": [11, 47], "activation_memori": 11, "total_memori": 11, "bop": 11, "memori": [11, 24, 31, 46], "byte": [11, 20, 23, 24, 26, 31, 33, 46], "note": [11, 20, 23, 25, 26], "affect": [11, 20, 23, 25, 26], "while": [11, 20, 23, 25, 26, 33, 43], "sum": [11, 21, 24, 29, 31], "total": [11, 21, 29], "xquant_config": [12, 35, 36], "xquantconfig": [12, 13, 35, 36], "report_dir": 12, "custom_similarity_metr": 12, "report": [12, 13], "dir": [12, 46], "explain": [12, 13, 35, 36, 44], "directori": [12, 13, 34], "custom": [12, 19, 22, 26, 27, 39], "name": [12, 18, 39, 41, 43, 46], "implement": [12, 44], "init": [13, 41, 47], "modul": [13, 27, 28, 29, 30, 31, 36], "pytorch_post_training_quant": [13, 17, 30, 39], "pytorch": [13, 18, 43, 44, 47], "pytorch_gradient_post_training_quant": [13, 28], "get_pytorch_gptq_config": [13, 17], "gradientptqconfig": [13, 20, 28], "keras_gradient_post_training_quant": [13, 20], "get_keras_gptq_config": [13, 15, 20], "option": [13, 22, 23, 24, 26, 28, 31, 33, 39, 43], "pytorch_quantization_aware_training_init_experiment": [13, 32, 33], "prepar": [13, 26, 33], "awar": [13, 42, 44, 47], "experiment": [13, 19, 27, 47], "pytorch_quantization_aware_training_finalize_experiment": [13, 32], "without": 13, "quantizewrapp": [13, 26, 32, 33], "keras_quantization_aware_training_init_experiment": [13, 25, 26], "keras_quantization_aware_training_finalize_experiment": [13, 25], "qat_config": [13, 26, 33], "coreconfig": [13, 20, 21, 23, 25, 26, 28, 29, 30, 32, 33], "entir": 13, "quantizationconfig": [13, 37], "mixedprecisionquantizationconfig": [13, 20, 21, 23, 25, 26, 37], "bitwidthconfig": [13, 37], "resourceutil": [13, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 33], "network_editor": [13, 38], "modifi": [13, 41], "troubleshoot": 13, "pytorch_resource_utilization_data": [13, 29], "data": [13, 14, 16, 21, 24, 29, 31, 35, 36, 39, 43, 46, 47], "desir": [13, 20, 21, 23, 25, 26, 28, 29, 30, 33], "target": [13, 18, 20, 21, 23, 24, 25, 26, 29, 31, 32, 33], "keras_resource_utilization_data": [13, 21], "pytorch_data_generation_experiment": [13, 27], "get_pytorch_data_generation_config": [13, 16, 27], "load": [13, 25, 26, 39, 44], "keras_data_generation_experiment": [13, 19], "get_keras_data_generation_config": [13, 14, 19], "pytorch_pruning_experiment": [13, 31], "structur": [13, 47], "keras_pruning_experiment": [13, 24], "xquant_report_pytorch_experiment": [13, 36], "xquant_report_keras_experiment": [13, 35], "serial": 13, "abstract": [13, 44], "hardwar": [13, 18, 24, 31, 43, 44, 47], "orient": [13, 44], "tool": [13, 44], "logger": [13, 38, 46], "path": [13, 22, 34, 39, 46], "infer": [13, 18, 25, 32, 43, 44], "get_target_platform_cap": [13, 18, 43], "platform": [13, 18, 20, 23, 24, 25, 26, 29, 31], "targetplatformcap": [13, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33], "page": 13, "document": [13, 23, 26, 33], "auto": 13, "sphinx": 13, "default_n_it": [14, 16], "adam": [14, 15, 17], "default_data_gen_b": [14, 16], "default_keras_initial_lr": 14, "default_keras_output_loss_multipli": 14, "schedulertyp": [14, 16], "batchnormalignemntlosstyp": [14, 16], "outputlosstyp": [14, 16], "datainittyp": [14, 16], "bnlayerweightingtyp": [14, 16], "imagegranular": [14, 16], "imagepipelinetyp": [14, 16], "imagenormalizationtyp": [14, 16], "default_keras_extra_pixel": 14, "learning_r": 15, "lr_default": [15, 17], "lr_rest_default": [15, 17], "gptqmultipletensorsloss": 15, "gradientptqconfigv2": [15, 17], "fine": [15, 17, 24, 25, 26, 31, 32, 33], "tune": [15, 17, 24, 25, 26, 31, 32], "optimizerv2": 15, "auxiliri": [15, 17], "variabl": [15, 17], "4": [15, 17, 19, 20, 23, 24, 26, 27, 28, 30, 31, 33], "5": [15, 17, 24, 31], "gptq_conf": [15, 17, 28], "nadam": 15, "order": [15, 17, 20, 23, 26, 33, 38, 39, 40], "radam": 16, "default_pytorch_initial_lr": 16, "default_pytorch_output_loss_multipli": 16, "reduce_on_plateau_with_reset": 16, "default_pytorch_extra_pixel": 16, "default_pytorch_bn_layer_typ": 16, "default_pytorch_last_layer_typ": 16, "torch": [17, 27, 36, 39, 47], "lr": 17, "dummi": 17, "param": [17, 38, 41, 44], "fw_name": 18, "target_platform_nam": 18, "target_platform_vers": 18, "support": [18, 39], "both": [18, 20, 23, 28, 30, 32, 44, 46], "them": [18, 43, 46], "imx500": [18, 39, 43], "tflite": [18, 39, 43], "qnnpack": [18, 43], "capabl": [18, 24, 29, 31], "version": [18, 19, 27, 43, 47], "attach": [18, 43], "some": [18, 19, 27, 39, 43, 45, 46], "field": [18, 40, 43, 45], "opquantizationconfig": [18, 45], "ignor": [18, 43, 45], "quantization_preserv": [18, 43, 45], "fixed_scal": [18, 43, 45], "fixed_zero_point": [18, 43, 45], "futur": [18, 19, 27, 43, 45], "n_imag": [19, 27], "output_image_s": [19, 27], "data_generation_config": [19, 27], "ll": [19, 27], "walk": [19, 27], "simpl": [19, 27], "involv": [19, 24, 27, 31], "start": [19, 27, 39, 44, 47], "compress": [19, 24, 27, 28, 31], "toolkit": [19, 27, 28], "sequenti": [19, 27], "flatten": [19, 27], "next": [19, 27, 39, 40], "input_shap": 19, "8": [19, 20, 23, 25, 26, 27, 39, 44], "10": [19, 20, 23, 26, 27, 28, 30, 33], "simplic": [19, 27], "config": [19, 20, 23, 24, 25, 26, 27, 28, 31, 32, 33, 37, 41, 43, 44], "notic": [19, 24, 27, 31, 39], "chang": [19, 27, 39, 41, 46], "generated_imag": [19, 27], "variou": [19, 27, 46], "purpos": [19, 27, 38], "in_model": [20, 21, 23, 25, 26, 29, 32, 33], "representative_data_gen": [20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 39], "gptq_config": [20, 28, 30], "gptq_representative_data_gen": [20, 28], "target_resource_util": [20, 23, 24, 26, 28, 30, 31, 33], "core_config": [20, 21, 23, 25, 26, 28, 29, 30, 32, 33], "target_platform_cap": [20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 44], "default_keras_tpc": [20, 23, 24, 26], "symmetr": [20, 23, 26, 28, 30, 33, 42, 43, 44], "constraint": [20, 23, 24, 28, 30, 31], "sever": [20, 23, 26, 28, 30, 33, 46], "fold": [20, 23, 26, 28, 30, 33], "preced": [20, 23, 26, 28, 30, 33], "histogram": [20, 23, 26, 28, 30, 33, 46], "being": [20, 23, 26, 28, 30, 33, 43, 44], "ilp": [20, 23, 26, 33], "solver": [20, 23, 26, 33], "find": [20, 23, 26, 33], "maxim": [20, 23, 26, 33], "observ": [20, 28, 30, 43, 46], "calibr": [20, 21, 23, 26, 28, 29, 30, 33], "user": [20, 23, 25, 26, 28, 30, 32, 33], "handl": [20, 23, 26, 28, 30, 33], "applic": [20, 21, 23, 24, 25, 26, 39], "mobilenet": [20, 21], "random": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "requir": [20, 23, 26, 28, 30, 33, 44, 46], "num_calibration_batch": [20, 23, 26, 28, 30, 33], "numpi": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "def": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "repr_datagen": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33], "_": [20, 23, 26, 28, 30, 33, 39], "yield": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "224": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "bitwidth": [20, 23, 25, 26], "candid": [20, 23, 25, 26, 41], "mixed_precision_config": [20, 21, 23, 25, 26, 37], "our": [20, 23, 25, 26, 33, 47], "ru": [20, 23, 25, 26], "count_param": [20, 23, 24, 25, 26], "75": [20, 23, 25, 26], "quantized_model": [20, 23, 25, 26, 32, 33, 35, 36], "quantization_info": [20, 23, 25, 26, 28, 30, 32, 33], "userinform": 20, "keras_default_tpc": 21, "build": [21, 29, 44, 47], "graph": [21, 29, 41, 46], "hw": 21, "ru_data": [21, 29], "keras_load_quantized_model": 22, "filepath": 22, "custom_object": [22, 25, 26], "compil": 22, "trainabl": [22, 25, 44], "file": [22, 25, 26, 34, 39], "addit": [22, 39], "boolean": 22, "saved_model": 22, "loadopt": 22, "savedmodel": 22, "ptq": [23, 30, 39], "mobilenet_v2": [23, 25, 26, 28, 29, 30, 32, 33, 39], "mobilenetv2": [23, 25, 26, 39, 46], "pleas": [23, 26, 33, 39, 47], "look": [23, 26, 33, 43, 47], "pruning_config": [24, 31], "meet": [24, 31], "simd": [24, 31, 43], "tpc": [24, 31, 43], "By": [24, 28, 30, 31, 39, 46], "assess": [24, 31], "togeth": [24, 31], "friendli": [24, 31, 47], "architectur": [24, 31], "analyz": [24, 31], "identifi": [24, 31], "impact": [24, 31], "must": [24, 31, 43], "retrain": [24, 31], "recov": [24, 31], "origin": [24, 35, 36, 46], "achiev": 24, "analysi": [24, 31], "standard": [24, 31, 42], "associ": [24, 31, 43], "resnet50": [24, 31, 39], "here": [24, 31, 39, 43, 47], "aim": [24, 31], "footprint": [24, 31], "50": [24, 31], "assum": [24, 31], "float32": [24, 31, 39], "thu": [24, 31, 46], "dense_nparam": [24, 31], "l": [24, 47], "higher": [24, 31], "also": [24, 31, 47], "extend": [24, 31], "durat": [24, 31], "pruned_model": [24, 31], "pruning_info": [24, 31], "qat": [25, 26, 32, 33, 42], "convert": [25, 32], "replac": 25, "trainablequant": 25, "inferablequant": [25, 32], "load_model": [25, 26], "model_fil": [25, 26], "qatconfig": [26, 33], "built": [26, 33, 44], "fake_qu": [26, 33], "onlin": [26, 33], "wrapper": [26, 32, 33, 44], "ker": 26, "hight": 27, "nn": [27, 36], "batchnorm2d": 27, "default_pytorch_tpc": [28, 30, 31, 33], "quantized_modul": [28, 30], "pytorch_default_tpc": 29, "in_modul": 30, "clibrat": 30, "default_pyotrch_tpc": 31, "resnet50_weight": 31, "imagenet1k_v1": 31, "numel": 31, "state_dict": 31, "pretrain": [32, 33], "keep": [32, 47], "readi": 32, "tun": 33, "set_log_fold": [34, 46], "folder": 34, "level": 34, "verbos": 34, "facade_xquant_report": [35, 36], "float_model": [35, 36, 39], "repr_dataset": [35, 36, 39], "validation_dataset": [35, 36], "valid": [35, 36, 44], "quantization_config": [37, 44], "debug_config": 37, "debugconfig": 37, "debug": [37, 38], "edit": [37, 38, 41], "analyze_similar": 38, "simulate_schedul": 38, "plot": [38, 46], "figur": [38, 46], "within": [38, 47], "tensorboard": [38, 47], "pinpoint": 38, "problemat": 38, "editrul": 38, "rule": [38, 41], "action": 38, "simul": 38, "behaviour": 38, "cut": 38, "detail": [39, 43], "refer": 39, "project": [39, 47], "github": [39, 47], "readm": 39, "you": [39, 46, 47], "question": 39, "open": [39, 46, 47], "repositori": 39, "fakely_qu": 39, "int8": 39, "mct_quantiz": 39, "via": [39, 47], "save_model_path": 39, "is_layer_exportable_fn": 39, "is_keras_layer_export": 39, "serialization_format": 39, "quantization_format": 39, "To": [39, 46], "demonstr": [39, 43], "quantized_exportable_model": 39, "lambda": 39, "dtype": 39, "avail": [39, 47], "tempfil": 39, "keras_file_path": 39, "mkstemp": 39, "torchscript": 39, "is_pytorch_layer_export": 39, "onnx_opset_vers": 39, "default_onnx_opset_vers": 39, "current": 39, "fake": 39, "trace": 39, "mandatori": 39, "quant": 39, "your": 39, "packag": [39, 44, 47], "so": [39, 43], "part": 39, "skip": 39, "plan": 39, "pip": [39, 47], "instal": 39, "q": 39, "onnxruntim": 39, "extens": 39, "let": 39, "There": [39, 46], "onnx_file_path": 39, "model_format_onnx_mctq": 39, "15": 39, "16": 39, "get_ort_session_opt": 39, "session": 39, "creation": 39, "slowli": 39, "suffer": 39, "longer": 39, "latenc": 39, "howev": 39, "ort": 39, "sess": 39, "inferencesess": 39, "cudaexecutionprovid": 39, "cpuexecutionprovid": 39, "_input_data": 39, "astyp": 39, "_model_output_nam": 39, "get_output": 39, "_model_input_nam": 39, "get_input": 39, "predict": 39, "layerfilterparam": 40, "target_platform": [40, 44], "attributefilt": [40, 43], "attr": 40, "op": [40, 43], "match": [40, 41, 43], "regard": 40, "eq": 40, "noteq": 40, "greater": 40, "greatereq": 40, "smaller": 40, "smallereq": 40, "attribut": [41, 43, 44], "9": 41, "er_list": 41, "nodetypefilt": 41, "changecandidatesweightsquantconfigattr": 41, "attr_nam": 41, "weights_n_bit": [41, 43, 44], "new": 41, "node_typ": 41, "nodenamefilt": 41, "node_nam": 41, "nodenamescopefilt": 41, "node_name_scop": 41, "string": 41, "changefinalweightsquantconfigattr": 41, "kwarg": [41, 43], "attr_valu": 41, "changefinalactivationquantconfigattr": 41, "changecandidatesactivationquantconfigattr": 41, "changequantizationparamfunct": 41, "activation_quantization_params_fn": 41, "weights_quantization_params_fn": 41, "changefinalweightsquantizationmethod": 41, "weights_quantization_method": [41, 43, 44], "changecandidatesweightsquantizationmethod": 41, "changecandidatesactivationquantizationmethod": 41, "activation_quantization_method": [41, 43, 44], "changequantizationmethod": 41, "poweroftwo": 42, "uniform": [42, 43, 44], "dqa": 42, "dnn": 42, "attent": 42, "introduc": 42, "lsq": 42, "http": [42, 47], "arxiv": [42, 47], "org": 42, "pdf": 42, "1902": 42, "08153": 42, "weight_training_method": 42, "activation_training_method": 42, "weight_quantizer_params_overrid": 42, "activation_quantizer_params_overrid": 42, "backend": 43, "address": 43, "shortli": 43, "diagram": 43, "main": [43, 46], "compon": [43, 44], "power_of_two": 43, "lut_pot_quant": 43, "lookup": 43, "tabl": 43, "lut_sym_quant": 43, "default_weight_attr_config": 43, "attr_weights_configs_map": 43, "activation_n_bit": [43, 44], "supported_input_activation_n_bit": 43, "enable_activation_quant": [43, 44], "simd_siz": 43, "signed": 43, "singl": 43, "instruct": 43, "fetch": 43, "simultan": 43, "float_bitwidth": 43, "weights_per_channel_threshold": [43, 44], "enable_weights_quant": [43, 44], "lut_values_bitwidth": 43, "quantization_config_list": 43, "base_config": 43, "gather": [43, 46], "fallback": 43, "manner": 43, "default_qco": 43, "add_metadata": 43, "default_tp_model": 43, "definit": 43, "pattern": 43, "combin": 43, "qc_option": 43, "uniqu": 43, "operator_groups_list": 43, "treat": 43, "henc": 43, "either": 43, "opset": 43, "concaten": 43, "similarli": 43, "place": 43, "like": 43, "op_sets_to_lay": 43, "op_set_nam": 43, "attr_map": 43, "filterlayerparam": 43, "condit": 43, "satisfi": 43, "keyword": 43, "usag": 43, "tp_model": 43, "infrastructur": 44, "propos": 44, "emul": 44, "holder": 44, "upon": 44, "learnabl": 44, "basic": 44, "get_config": 44, "from_config": 44, "weights_quantization_param": 44, "weights_channels_axi": 44, "weights_quantization_candid": 44, "activation_quantization_param": 44, "activation_quantization_candid": 44, "phase": 46, "displai": 46, "ui": 46, "writer": 46, "stage": 46, "launch": 46, "logdir": 46, "seen": 46, "under": 46, "tab": 46, "click": 46, "deeper": 46, "view": 46, "tag": 46, "show": 46, "These": 46, "scalar": 46, "were": 46, "wai": [46, 47], "mathemat": 46, "divis": 46, "dot": 46, "product": 46, "euclidean": 46, "along": 46, "pair": 46, "would": 46, "expect": 46, "mani": 46, "few": [46, 47], "As": 46, "20": 46, "insert": 46, "chosen": 46, "second": 46, "sourc": 47, "research": 47, "develop": 47, "engin": 47, "easili": 47, "state": 47, "art": 47, "work": 47, "soni": 47, "semiconductor": 47, "israel": 47, "git": 47, "clone": 47, "com": 47, "model_optim": 47, "python": 47, "setup": 47, "py": 47, "pypi": 47, "latest": 47, "stabl": 47, "releas": 47, "nightli": 47, "unstabl": 47, "visual": 47, "cosin": 47, "comparison": 47, "just": 47, "minut": 47, "visit": 47, "notebook": 47, "doesn": 47, "t": 47, "out1": 47, "out2": 47, "out3": 47, "habi": 47, "h": 47, "v": 47, "peretz": 47, "r": 47, "cohen": 47, "dikstein": 47, "dror": 47, "o": 47, "diamant": 47, "i": 47, "jen": 47, "netzer": 47, "2021": 47, "hptq": 47, "preprint": 47, "gordon": 47, "2023": 47, "eptq": 47, "enhanc": 47}, "objects": {"model_compression_toolkit": [[2, 0, 1, "", "DefaultDict"], [18, 3, 1, "", "get_target_platform_capabilities"], [22, 3, 1, "", "keras_load_quantized_model"], [34, 3, 1, "", "set_log_folder"]], "model_compression_toolkit.DefaultDict": [[2, 1, 1, "", "get"], [2, 1, 1, "", "keys"]], "model_compression_toolkit.core": [[0, 0, 1, "", "BitWidthConfig"], [3, 0, 1, "", "ChannelAxis"], [37, 0, 1, "", "CoreConfig"], [38, 0, 1, "", "DebugConfig"], [3, 0, 1, "", "FrameworkInfo"], [5, 0, 1, "", "MixedPrecisionQuantizationConfig"], [6, 0, 1, "", "MpDistanceWeighting"], [9, 0, 1, "", "QuantizationConfig"], [10, 0, 1, "", "QuantizationErrorMethod"], [11, 0, 1, "", "ResourceUtilization"], [21, 3, 1, "", "keras_resource_utilization_data"], [29, 3, 1, "", "pytorch_resource_utilization_data"]], "model_compression_toolkit.core.BitWidthConfig": [[0, 2, 1, "", "manual_activation_bit_width_selection_list"]], "model_compression_toolkit.core.common.quantization.bit_width_config": [[0, 0, 1, "", "ManualBitWidthSelection"]], "model_compression_toolkit.core.common.quantization.bit_width_config.ManualBitWidthSelection": [[0, 2, 1, "", "bit_width"], [0, 2, 1, "", "filter"]], "model_compression_toolkit.core.network_editor": [[41, 0, 1, "", "ChangeCandidatesActivationQuantConfigAttr"], [41, 0, 1, "", "ChangeCandidatesActivationQuantizationMethod"], [41, 0, 1, "", "ChangeCandidatesWeightsQuantConfigAttr"], [41, 0, 1, "", "ChangeCandidatesWeightsQuantizationMethod"], [41, 0, 1, "", "ChangeFinalActivationQuantConfigAttr"], [41, 0, 1, "", "ChangeFinalWeightsQuantConfigAttr"], [41, 0, 1, "", "ChangeFinalWeightsQuantizationMethod"], [41, 0, 1, "", "ChangeQuantizationParamFunction"], [41, 0, 1, "", "EditRule"], [41, 0, 1, "", "NodeNameFilter"], [41, 0, 1, "", "NodeNameScopeFilter"], [41, 0, 1, "", "NodeTypeFilter"]], "model_compression_toolkit.data_generation": [[1, 0, 1, "", "BNLayerWeightingType"], [1, 0, 1, "", "BatchNormAlignemntLossType"], [1, 0, 1, "", "DataGenerationConfig"], [1, 0, 1, "", "DataInitType"], [1, 0, 1, "", "ImageGranularity"], [1, 0, 1, "", "ImageNormalizationType"], [1, 0, 1, "", "ImagePipelineType"], [1, 0, 1, "", "OutputLossType"], [1, 0, 1, "", "SchedulerType"], [14, 3, 1, "", "get_keras_data_generation_config"], [16, 3, 1, "", "get_pytorch_data_generation_config"], [19, 3, 1, "", "keras_data_generation_experimental"], [27, 3, 1, "", "pytorch_data_generation_experimental"]], "model_compression_toolkit.exporter": [[39, 0, 1, "", "KerasExportSerializationFormat"], [39, 0, 1, "", "PytorchExportSerializationFormat"], [39, 0, 1, "", "QuantizationFormat"], [39, 0, 1, "", "keras_export_model"], [39, 0, 1, "", "pytorch_export_model"]], "model_compression_toolkit.gptq": [[4, 0, 1, "", "GPTQHessianScoresConfig"], [4, 0, 1, "", "GradientPTQConfig"], [4, 0, 1, "", "RoundingType"], [15, 3, 1, "", "get_keras_gptq_config"], [17, 3, 1, "", "get_pytorch_gptq_config"], [20, 3, 1, "", "keras_gradient_post_training_quantization"], [28, 3, 1, "", "pytorch_gradient_post_training_quantization"]], "model_compression_toolkit.pruning": [[7, 0, 1, "", "ChannelsFilteringStrategy"], [7, 0, 1, "", "ImportanceMetric"], [7, 0, 1, "", "PruningConfig"], [8, 0, 1, "", "PruningInfo"], [24, 3, 1, "", "keras_pruning_experimental"], [31, 3, 1, "", "pytorch_pruning_experimental"]], "model_compression_toolkit.pruning.PruningConfig": [[7, 2, 1, "", "channels_filtering_strategy"], [7, 2, 1, "", "importance_metric"], [7, 2, 1, "", "num_score_approximations"]], "model_compression_toolkit.pruning.PruningInfo": [[8, 4, 1, "", "importance_scores"], [8, 4, 1, "", "pruning_masks"]], "model_compression_toolkit.ptq": [[23, 3, 1, "", "keras_post_training_quantization"], [30, 3, 1, "", "pytorch_post_training_quantization"]], "model_compression_toolkit.qat": [[42, 0, 1, "", "QATConfig"], [42, 0, 1, "", "TrainingMethod"], [25, 3, 1, "", "keras_quantization_aware_training_finalize_experimental"], [26, 3, 1, "", "keras_quantization_aware_training_init_experimental"], [32, 3, 1, "", "pytorch_quantization_aware_training_finalize_experimental"], [33, 3, 1, "", "pytorch_quantization_aware_training_init_experimental"]], "model_compression_toolkit.target_platform": [[40, 0, 1, "", "AttributeFilter"], [43, 0, 1, "", "AttributeQuantizationConfig"], [40, 0, 1, "", "Eq"], [43, 0, 1, "", "Fusing"], [40, 0, 1, "", "Greater"], [40, 0, 1, "", "GreaterEq"], [43, 0, 1, "", "LayerFilterParams"], [40, 0, 1, "", "NotEq"], [43, 0, 1, "", "OpQuantizationConfig"], [43, 0, 1, "", "OperationsSetToLayers"], [43, 0, 1, "", "OperationsToLayers"], [43, 0, 1, "", "OperatorSetConcat"], [43, 0, 1, "", "OperatorsSet"], [43, 0, 1, "", "QuantizationConfigOptions"], [43, 0, 1, "", "QuantizationMethod"], [40, 0, 1, "", "Smaller"], [40, 0, 1, "", "SmallerEq"], [43, 0, 1, "", "TargetPlatformCapabilities"], [43, 0, 1, "", "TargetPlatformModel"]], "model_compression_toolkit.trainable_infrastructure": [[44, 0, 1, "", "BaseKerasTrainableQuantizer"], [44, 0, 1, "", "BasePytorchTrainableQuantizer"], [44, 0, 1, "", "TrainableQuantizerActivationConfig"], [44, 0, 1, "", "TrainableQuantizerWeightsConfig"]], "model_compression_toolkit.xquant.common.xquant_config": [[12, 0, 1, "", "XQuantConfig"]], "model_compression_toolkit.xquant.keras.facade_xquant_report": [[35, 3, 1, "", "xquant_report_keras_experimental"]], "model_compression_toolkit.xquant.pytorch.facade_xquant_report": [[36, 3, 1, "", "xquant_report_pytorch_experimental"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute", "3": "py:function", "4": "py:property"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "function", "Python function"], "4": ["py", "property", "Python property"]}, "titleterms": {"bitwidthconfig": 0, "manualbitwidthselect": 0, "data": [1, 19, 27], "gener": [1, 19, 27], "configur": [1, 7, 12, 46], "imagegranular": 1, "schedulertyp": 1, "batchnormalignemntlosstyp": 1, "outputlosstyp": 1, "datainittyp": 1, "bnlayerweightingtyp": 1, "imagepipelinetyp": 1, "imagenormalizationtyp": 1, "defaultdict": 2, "class": [2, 3, 4], "frameworkinfo": 3, "channelaxi": 3, "gradientptqconfig": [4, 15, 17], "gptqhessianscoresconfig": 4, "roundingtyp": 4, "mixedprecisionquantizationconfig": 5, "mpdistanceweight": 6, "prune": [7, 8, 13, 24, 31], "importancemetr": 7, "channelsfilteringstrategi": 7, "inform": [8, 21, 29], "quantizationconfig": 9, "quantizationerrormethod": 10, "resourceutil": 11, "xquant": [12, 13, 35, 36], "api": [13, 47], "doc": 13, "ptq": 13, "gptq": 13, "qat": 13, "core": 13, "data_gener": 13, "export": [13, 39], "trainable_infrastructur": [13, 44], "set_log_fold": 13, "keras_load_quantized_model": 13, "target_platform": [13, 43], "indic": 13, "tabl": 13, "get": [14, 15, 16, 17, 18, 21, 29], "datagenerationconfig": [14, 16], "kera": [14, 15, 19, 20, 21, 22, 23, 24, 25, 26, 35, 39], "model": [14, 15, 16, 17, 21, 22, 25, 26, 29, 32, 33, 39, 47], "pytorch": [16, 17, 27, 28, 29, 30, 31, 32, 33, 36, 39], "targetplatformcap": [18, 43], "gradient": [20, 28], "base": [20, 28], "post": [20, 23, 28, 30], "train": [20, 23, 25, 26, 28, 30, 32, 33], "quantiz": [20, 22, 23, 25, 26, 28, 30, 32, 33, 39], "resourc": [21, 29], "util": [21, 29], "load": 22, "structur": [24, 31], "awar": [25, 26, 32, 33], "final": [25, 32], "init": [26, 33], "enabl": 34, "logger": 34, "report": [35, 36], "coreconfig": 37, "debug_config": 38, "modul": [38, 39, 41, 42, 43, 44], "debugconfig": 38, "quantizationformat": 39, "kerasexportserializationformat": 39, "keras_export_model": 39, "tutori": 39, "serial": 39, "format": 39, "mctq": 39, "pytorchexportserializationformat": 39, "pytorch_export_model": 39, "onnx": 39, "opset": 39, "version": 39, "us": 39, "infer": 39, "layer": 40, "attribut": 40, "filter": [40, 41], "network_editor": 41, "editrul": 41, "action": 41, "qat_config": 42, "trainingmethod": 42, "qatconfig": 42, "quantizationmethod": 43, "opquantizationconfig": 43, "attributequantizationconfig": 43, "quantizationconfigopt": 43, "targetplatformmodel": 43, "operatorsset": 43, "fuse": 43, "operatorsetconcat": 43, "operationstolay": 43, "operationssettolay": 43, "layerfilterparam": 43, "basekerastrainablequant": 44, "basepytorchtrainablequant": 44, "trainablequantizerweightsconfig": 44, "trainablequantizeractivationconfig": 44, "visual": 46, "within": 46, "tensorboard": 46, "cosin": 46, "similar": 46, "comparison": 46, "mix": 46, "precis": 46, "bit": 46, "width": 46, "compress": 47, "toolkit": 47, "user": 47, "guid": 47, "overview": 47, "instal": 47, "support": 47, "featur": 47, "quickstart": 47, "document": 47, "technic": 47, "constraint": 47, "refer": 47}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["api/api_docs/classes/BitWidthConfig", "api/api_docs/classes/DataGenerationConfig", "api/api_docs/classes/DefaultDict", "api/api_docs/classes/FrameworkInfo", "api/api_docs/classes/GradientPTQConfig", "api/api_docs/classes/MixedPrecisionQuantizationConfig", "api/api_docs/classes/MpDistanceWeighting", "api/api_docs/classes/PruningConfig", "api/api_docs/classes/PruningInfo", "api/api_docs/classes/QuantizationConfig", "api/api_docs/classes/QuantizationErrorMethod", "api/api_docs/classes/ResourceUtilization", "api/api_docs/classes/XQuantConfig", "api/api_docs/index", "api/api_docs/methods/get_keras_data_generation_config", "api/api_docs/methods/get_keras_gptq_config", "api/api_docs/methods/get_pytorch_data_generation_config", "api/api_docs/methods/get_pytroch_gptq_config", "api/api_docs/methods/get_target_platform_capabilities", "api/api_docs/methods/keras_data_generation_experimental", "api/api_docs/methods/keras_gradient_post_training_quantization", "api/api_docs/methods/keras_kpi_data", "api/api_docs/methods/keras_load_quantizad_model", "api/api_docs/methods/keras_post_training_quantization", "api/api_docs/methods/keras_pruning_experimental", "api/api_docs/methods/keras_quantization_aware_training_finalize_experimental", "api/api_docs/methods/keras_quantization_aware_training_init_experimental", "api/api_docs/methods/pytorch_data_generation_experimental", "api/api_docs/methods/pytorch_gradient_post_training_quantization", "api/api_docs/methods/pytorch_kpi_data", "api/api_docs/methods/pytorch_post_training_quantization", "api/api_docs/methods/pytorch_pruning_experimental", "api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental", "api/api_docs/methods/pytorch_quantization_aware_training_init_experimental", "api/api_docs/methods/set_logger_path", "api/api_docs/methods/xquant_report_keras_experimental", "api/api_docs/methods/xquant_report_pytorch_experimental", "api/api_docs/modules/core_config", "api/api_docs/modules/debug_config", "api/api_docs/modules/exporter", "api/api_docs/modules/layer_filters", "api/api_docs/modules/network_editor", "api/api_docs/modules/qat_config", "api/api_docs/modules/target_platform_capabilities", "api/api_docs/modules/trainable_infrastructure", "api/api_docs/notes/tpc_note", "guidelines/visualization", "index"], "filenames": ["api/api_docs/classes/BitWidthConfig.rst", "api/api_docs/classes/DataGenerationConfig.rst", "api/api_docs/classes/DefaultDict.rst", "api/api_docs/classes/FrameworkInfo.rst", "api/api_docs/classes/GradientPTQConfig.rst", "api/api_docs/classes/MixedPrecisionQuantizationConfig.rst", "api/api_docs/classes/MpDistanceWeighting.rst", "api/api_docs/classes/PruningConfig.rst", "api/api_docs/classes/PruningInfo.rst", "api/api_docs/classes/QuantizationConfig.rst", "api/api_docs/classes/QuantizationErrorMethod.rst", "api/api_docs/classes/ResourceUtilization.rst", "api/api_docs/classes/XQuantConfig.rst", "api/api_docs/index.rst", "api/api_docs/methods/get_keras_data_generation_config.rst", "api/api_docs/methods/get_keras_gptq_config.rst", "api/api_docs/methods/get_pytorch_data_generation_config.rst", "api/api_docs/methods/get_pytroch_gptq_config.rst", "api/api_docs/methods/get_target_platform_capabilities.rst", "api/api_docs/methods/keras_data_generation_experimental.rst", "api/api_docs/methods/keras_gradient_post_training_quantization.rst", "api/api_docs/methods/keras_kpi_data.rst", "api/api_docs/methods/keras_load_quantizad_model.rst", "api/api_docs/methods/keras_post_training_quantization.rst", "api/api_docs/methods/keras_pruning_experimental.rst", "api/api_docs/methods/keras_quantization_aware_training_finalize_experimental.rst", "api/api_docs/methods/keras_quantization_aware_training_init_experimental.rst", "api/api_docs/methods/pytorch_data_generation_experimental.rst", "api/api_docs/methods/pytorch_gradient_post_training_quantization.rst", "api/api_docs/methods/pytorch_kpi_data.rst", "api/api_docs/methods/pytorch_post_training_quantization.rst", "api/api_docs/methods/pytorch_pruning_experimental.rst", "api/api_docs/methods/pytorch_quantization_aware_training_finalize_experimental.rst", "api/api_docs/methods/pytorch_quantization_aware_training_init_experimental.rst", "api/api_docs/methods/set_logger_path.rst", "api/api_docs/methods/xquant_report_keras_experimental.rst", "api/api_docs/methods/xquant_report_pytorch_experimental.rst", "api/api_docs/modules/core_config.rst", "api/api_docs/modules/debug_config.rst", "api/api_docs/modules/exporter.rst", "api/api_docs/modules/layer_filters.rst", "api/api_docs/modules/network_editor.rst", "api/api_docs/modules/qat_config.rst", "api/api_docs/modules/target_platform_capabilities.rst", "api/api_docs/modules/trainable_infrastructure.rst", "api/api_docs/notes/tpc_note.rst", "guidelines/visualization.rst", "index.rst"], "titles": ["BitWidthConfig", "Data Generation Configuration", "DefaultDict Class", "FrameworkInfo Class", "GradientPTQConfig Class", "MixedPrecisionQuantizationConfig", "MpDistanceWeighting", "Pruning Configuration", "Pruning Information", "QuantizationConfig", "QuantizationErrorMethod", "ResourceUtilization", "XQuant Configuration", "API Docs", "Get DataGenerationConfig for Keras Models", "Get GradientPTQConfig for Keras Models", "Get DataGenerationConfig for Pytorch Models", "Get GradientPTQConfig for Pytorch Models", "Get FrameworkQuantizationCapabilities", "Keras Data Generation", "Keras Gradient Based Post Training Quantization", "Get Resource Utilization information for Keras Models", "Load Quantized Keras Model", "Keras Post Training Quantization", "Keras Structured Pruning", "Keras Quantization Aware Training Model Finalize", "Keras Quantization Aware Training Model Init", "Pytorch Data Generation", "Pytorch Gradient Based Post Training Quantization", "Get Resource Utilization information for PyTorch Models", "Pytorch Post Training Quantization", "Pytorch Structured Pruning", "PyTorch Quantization Aware Training Model Finalize", "PyTorch Quantization Aware Training Model Init", "Enable a Logger", "XQuant Report Keras", "XQuant Report Pytorch", "CoreConfig", "debug_config Module", "exporter Module", "Layer Attributes Filters", "network_editor Module", "qat_config Module", "target_platform_capabilities Module", "trainable_infrastructure Module", "<no title>", "Visualization within TensorBoard", "Model Compression Toolkit User Guide"], "terms": {"class": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 37, 38, 39, 40, 41, 42, 43, 44], "model_compression_toolkit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46], "core": [0, 3, 5, 6, 9, 10, 11, 20, 21, 23, 24, 25, 26, 28, 29, 31, 32, 33, 37, 38, 41], "manual_activation_bit_width_selection_list": 0, "factori": [0, 4, 37, 38], "manag": 0, "manual": [0, 13, 37], "bit": [0, 5, 11, 13, 20, 23, 25, 26, 33, 37, 39, 41, 43, 44, 47], "width": [0, 5, 13, 20, 23, 26, 27, 33, 37, 43, 47], "configur": [0, 4, 5, 9, 11, 13, 14, 15, 16, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43, 44, 47], "A": [0, 3, 4, 5, 8, 9, 13, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 42, 43, 47], "list": [0, 1, 3, 5, 14, 15, 16, 19, 27, 38, 41, 47], "object": [0, 3, 4, 5, 7, 11, 14, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 28, 29, 30, 33, 39, 41, 43, 44], "defin": [0, 4, 5, 6, 15, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 43, 44], "type": [0, 1, 2, 4, 5, 7, 8, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 27, 29, 31, 35, 36, 39, 41, 43], "common": [0, 12], "quantiz": [0, 3, 4, 5, 9, 10, 12, 13, 15, 17, 19, 21, 27, 29, 35, 36, 37, 38, 41, 42, 43, 44, 46, 47], "bit_width_config": [0, 37], "filter": [0, 1, 7], "bit_width": 0, "encapsul": [0, 9], "select": [0, 3, 7, 9, 10, 13, 37, 39, 42, 43, 44], "specif": [0, 3, 24, 31, 41, 46], "The": [0, 1, 3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 35, 36, 39, 41, 43, 44, 46], "us": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47], "node": [0, 26, 33, 41, 44, 46], "manipul": [0, 1], "basenodematch": 0, "appli": [0, 1, 9, 13, 39, 40, 41, 43], "int": [0, 1, 4, 5, 7, 14, 15, 16, 17, 19, 27, 43, 44], "data_gener": [1, 14, 16, 19, 27], "datagenerationconfig": [1, 13, 19, 27], "n_iter": [1, 14, 16, 19, 27], "optim": [1, 3, 4, 11, 13, 14, 15, 16, 17, 18, 20, 21, 23, 26, 28, 29, 30, 33, 37, 43, 44, 45, 47], "data_gen_batch_s": [1, 14, 16, 19, 27], "initial_lr": [1, 14, 16], "output_loss_multipli": [1, 14, 16], "image_granular": [1, 14, 16], "allimag": [1, 16], "scheduler_typ": [1, 14, 16], "none": [1, 2, 4, 5, 9, 12, 15, 17, 18, 20, 22, 23, 26, 28, 30, 33, 37, 39, 41, 42, 43, 44], "bn_alignment_loss_typ": [1, 14, 16], "output_loss_typ": [1, 14, 16], "data_init_typ": [1, 14, 16], "layer_weighting_typ": [1, 14, 16], "image_pipeline_typ": [1, 14, 16], "image_normalization_typ": [1, 14, 16], "extra_pixel": [1, 14, 16], "0": [1, 3, 4, 5, 8, 9, 14, 15, 16, 20, 23, 24, 25, 26, 31, 39, 44], "bn_layer_typ": [1, 14, 16], "last_layer_typ": [1, 16], "image_clip": [1, 14, 16], "true": [1, 5, 9, 15, 16, 17, 22, 32, 33, 44], "initi": [1, 2, 4, 7, 12, 14, 16, 26, 33, 44], "paramet": [1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "number": [1, 4, 5, 7, 14, 15, 16, 17, 19, 20, 23, 24, 26, 27, 28, 30, 31, 33, 43, 44], "iter": [1, 14, 16, 19, 20, 23, 26, 27, 28, 30, 33], "ani": [1, 2, 3, 35, 36, 39, 40, 44], "batch": [1, 4, 5, 14, 15, 16, 17, 19, 20, 23, 26, 27, 28, 30, 33], "size": [1, 4, 5, 14, 15, 16, 17, 19, 20, 23, 25, 26, 27, 33, 39, 44], "float": [1, 4, 5, 14, 15, 16, 17, 20, 26, 28, 30, 33, 35, 36, 39, 43, 44, 46], "learn": [1, 14, 15, 16, 44], "rate": [1, 14, 15, 16], "multipli": [1, 14, 16], "output": [1, 3, 6, 14, 16, 19, 20, 23, 26, 27, 28, 30, 32, 33, 43, 46, 47], "loss": [1, 4, 14, 15, 16, 17, 20, 24, 28, 30, 31], "granular": [1, 14, 16], "imag": [1, 4, 5, 14, 16, 19, 20, 23, 26, 27, 28, 30, 33, 46], "default": [1, 2, 4, 7, 14, 15, 16, 17, 18, 20, 23, 24, 28, 30, 31, 37, 39, 42, 43, 46], "schedul": [1, 4, 14, 16, 38], "batchnorm": [1, 14, 16, 19, 20, 23, 26, 28, 30, 33], "align": [1, 14, 16], "layer": [1, 3, 5, 6, 8, 14, 15, 16, 17, 19, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 38, 39, 41, 43, 44, 46], "weight": [1, 3, 4, 5, 6, 9, 11, 13, 14, 15, 16, 17, 20, 21, 24, 26, 28, 29, 30, 31, 32, 33, 39, 41, 42, 43, 44, 46], "pipelin": [1, 14, 16], "normal": [1, 4, 5, 14, 16], "union": [1, 14, 16, 19, 20, 21, 23, 24, 26, 27, 28, 29, 30, 31, 33, 43], "tupl": [1, 3, 14, 16, 19, 20, 24, 27, 31, 41, 43], "extra": [1, 14, 16], "pixel": [1, 14, 16], "add": [1, 3, 12, 14, 16, 22, 44], "input": [1, 5, 14, 16, 20, 23, 26, 28, 30, 33, 43], "bool": [1, 4, 5, 14, 15, 16, 17, 38, 43, 44], "flag": [1, 43], "enabl": [1, 5, 9, 13, 15, 17, 38, 44, 47], "clip": [1, 14, 16], "valu": [1, 2, 3, 4, 5, 6, 7, 10, 12, 20, 23, 24, 25, 26, 31, 39, 40, 41, 43, 44], "an": [1, 2, 3, 4, 8, 13, 20, 23, 26, 33, 35, 36, 39, 40, 41, 43, 44, 47], "enum": [1, 3, 4, 5, 6, 7, 10, 44], "choos": [1, 4, 39], "depend": [1, 20, 23, 26, 28, 30, 33], "when": [1, 2, 3, 4, 5, 7, 10, 11, 13, 15, 17, 20, 23, 25, 26, 38, 40, 42, 43, 44, 46], "imagewis": 1, "batchwis": [1, 14], "reduce_on_plateau": [1, 14], "reduceonplateau": 1, "step": [1, 4, 44], "l2_squar": [1, 14, 16], "l2": 1, "squar": [1, 10], "No": 1, "negative_min_max_diff": [1, 16], "mean": [1, 4, 10, 46], "neg": 1, "min": [1, 3, 9, 10, 20, 23, 26, 28, 30, 33, 46], "max": [1, 3, 9, 10, 20, 21, 23, 26, 28, 29, 30, 33, 46], "differ": [1, 5, 9, 13, 20, 23, 25, 26, 39, 43, 46], "inverse_min_max_diff": 1, "1": [1, 3, 4, 5, 8, 9, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 31, 32, 39, 47], "regularized_min_max_diff": [1, 14], "regular": [1, 4, 15, 17], "gaussian": [1, 14, 16], "divers": 1, "averag": [1, 5, 6, 14, 15, 16, 17], "same": [1, 39, 43], "per": [1, 3, 4, 20, 23, 26, 33, 43, 44, 46], "first_layer_multipli": 1, "first": [1, 20, 23, 26, 28, 30, 33, 39, 46], "all": [1, 3, 4, 6, 9, 41, 44, 46], "other": [1, 15, 17], "grad": 1, "gradient": [1, 4, 13, 30, 47], "base": [1, 4, 5, 9, 10, 13, 15, 17, 19, 24, 27, 30, 31, 44, 47], "smoothing_and_augment": [1, 14, 16], "smooth": [1, 44], "crop": 1, "flip": 1, "ident": 1, "do": [1, 46], "transform": [1, 20, 23, 26, 28, 30, 33], "torchvis": [1, 16, 28, 29, 30, 31, 32, 33, 39], "keras_appl": [1, 14], "imagenet": 1, "no_norm": 1, "known_dict": 2, "default_valu": 2, "dictionari": [2, 3, 4, 12, 25, 26, 35, 36, 39, 41, 42, 44], "It": [2, 12, 43, 44], "wrap": [2, 3, 22, 26, 33, 40, 43, 44], "given": [2, 20, 21, 23, 26, 28, 29, 30, 33], "return": [2, 4, 5, 8, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 39], "its": [2, 3, 22, 24, 31, 40, 43, 46], "request": 2, "If": [2, 3, 4, 5, 15, 17, 20, 23, 25, 26, 28, 30, 37, 39, 40, 43], "kei": [2, 6, 12, 24, 31, 40], "present": [2, 46], "pass": [2, 3, 15, 17, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 41], "gener": [2, 12, 13, 14, 16, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 43, 46, 47], "provid": [2, 5, 19, 24, 27, 31, 39, 43, 44, 46], "empti": 2, "get": [2, 3, 4, 5, 13, 20, 23, 25, 26, 28, 30, 32, 33, 43, 46], "inner": 2, "default_factori": 2, "exist": [2, 18, 41], "wa": [2, 39], "follow": [3, 4, 44, 46], "api": [3, 4, 18, 23, 26, 33, 42], "can": [3, 4, 6, 9, 13, 15, 17, 19, 21, 24, 27, 29, 31, 38, 39, 41, 43, 44, 46, 47], "mct": [3, 9, 13, 15, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 45, 46, 47], "framework": [3, 18, 44], "relat": [3, 8, 13, 43], "inform": [3, 4, 13, 15, 17, 18, 20, 23, 24, 26, 28, 30, 31, 33, 38, 43, 44, 45], "network": [3, 7, 32, 37, 38, 41, 46, 47], "activation_quantizer_map": 3, "kernel_channels_map": 3, "activation_min_max_map": 3, "layer_min_max_map": 3, "kernel_ops_attributes_map": 3, "out_channel_axis_map": 3, "about": [3, 4, 8, 13, 15, 17, 20, 23, 25, 26, 39, 43, 44], "librari": [3, 9], "need": [3, 20, 23, 26, 28, 30, 33, 39, 40, 44], "model": [3, 4, 5, 8, 9, 11, 12, 13, 18, 19, 20, 23, 24, 27, 28, 30, 31, 35, 36, 37, 41, 42, 43, 44, 46], "hold": [3, 37, 40, 43], "how": [3, 7, 20, 21, 23, 26, 28, 30, 33, 39, 44, 47], "thei": 3, "should": [3, 7, 15, 20, 21, 23, 24, 25, 26, 28, 30, 31, 33, 39, 43, 46], "multipl": [3, 5, 43], "map": [3, 43], "kernel": [3, 20, 23, 25, 26, 41, 44], "channel": [3, 7, 8, 13, 24, 31, 43, 44, 46], "indic": [3, 8, 24, 31, 43], "etc": [3, 11, 13, 20, 23, 26, 28, 30, 33, 46], "ar": [3, 12, 18, 20, 23, 24, 26, 28, 30, 31, 33, 39, 43, 44, 45, 46], "divid": 3, "three": 3, "group": [3, 7, 24, 31, 43], "kernel_op": 3, "have": [3, 39, 40, 46], "coeffici": [3, 20, 23, 25, 26, 28, 30, 43, 44], "e": [3, 20, 23, 26, 28, 30, 33, 47], "g": [3, 20, 23, 26, 28, 30, 33], "conv2d": [3, 19, 20, 23, 25, 26, 27, 41, 43], "dens": [3, 19], "activation_op": 3, "relu": 3, "no_quantization_op": 3, "reshap": [3, 19], "transpos": 3, "dict": [3, 8, 12, 35, 36, 39, 43, 44], "quantizationmethod": [3, 44], "callabl": [3, 5, 12, 15, 17, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 35, 36, 39, 40], "from": [3, 4, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 41, 43, 44, 45, 46, 47], "function": [3, 4, 5, 6, 13, 14, 15, 16, 17, 18, 19, 22, 24, 27, 31, 41, 43, 44], "defaultdict": [3, 13], "out": [3, 7], "str": [3, 12, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 35, 36, 39, 40, 43], "activ": [3, 4, 9, 11, 20, 21, 23, 26, 28, 29, 30, 33, 39, 41, 42, 43, 44, 46], "oper": [3, 11, 38, 40, 43], "attirbut": 3, "s": [3, 7, 9, 11, 20, 23, 24, 25, 26, 28, 30, 31, 33, 39, 40, 41, 43, 44, 47], "comput": [3, 4, 5, 6, 10, 12, 13, 15, 17, 21, 29, 35, 38, 46], "statist": [3, 20, 23, 26, 28, 30, 33, 46], "exampl": [3, 9, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 41, 43, 44, 47], "kera": [3, 13, 41, 44, 47], "we": [3, 19, 20, 23, 24, 26, 27, 31, 33, 39, 41, 43, 44, 46], "want": 3, "onli": [3, 4, 5, 6, 7, 18, 20, 23, 25, 26, 39], "set": [3, 6, 12, 13, 15, 17, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 41, 43, 44, 46], "know": 3, "3": [3, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 44], "2": [3, 9, 15, 19, 27, 43, 44, 47], "respectivli": 3, "import": [3, 7, 8, 9, 13, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 41, 44, 46], "tensorflow": [3, 13, 15, 19, 20, 21, 23, 24, 25, 26, 39, 41, 43, 47], "tf": [3, 15, 19, 22, 25, 26], "Then": [3, 20, 23, 26, 28, 30, 33, 41, 46], "creat": [3, 4, 9, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 39, 40, 41, 43], "rang": [3, 20, 23, 26, 28, 30, 33], "advanc": 3, "save": [3, 12, 26, 34, 39, 44], "collect": [3, 20, 23, 26, 28, 30, 33, 35, 36, 46], "time": [3, 7, 44], "For": [3, 9, 18, 19, 20, 23, 25, 26, 27, 33, 39, 43, 44, 45, 46, 47], "softmax": 3, "format": [3, 13], "index": [3, 13], "axi": [3, 44], "nhwc": 3, "last": [3, 4, 6], "nchw": 3, "instanc": [4, 13, 15, 17, 41, 43, 46], "which": [4, 7, 39, 40, 41, 43, 44], "post": [4, 13, 24, 26, 31, 33, 47], "train": [4, 13, 42, 44, 47], "knowledg": [4, 47], "distil": [4, 47], "teacher": 4, "student": 4, "gptq": [4, 15, 17, 20, 28], "n_epoch": [4, 15, 17, 20], "optimizer_rest": [4, 15, 17], "train_bia": 4, "hessian_weights_config": 4, "gradual_activation_quantization_config": 4, "regularization_factor": [4, 15, 17], "rounding_typ": 4, "softquant": 4, "optimizer_quantization_paramet": 4, "optimizer_bia": 4, "log_funct": [4, 15, 17], "gptq_quantizer_params_overrid": 4, "gradientptq": [4, 13], "repres": [4, 5, 11, 15, 17, 20, 23, 24, 25, 26, 28, 30, 31, 32, 33, 35, 36, 39, 41, 43, 46], "dataset": [4, 15, 17, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 39, 46], "epoch": [4, 15, 17], "see": [4, 17, 47], "multiple_tensors_mse_loss": 4, "expect": [4, 46], "interfac": [4, 17], "bia": [4, 15, 17, 20, 23, 25, 26], "whether": [4, 5, 8, 14, 15, 16, 17, 22, 38, 39, 43, 44], "updat": 4, "dure": [4, 13, 14, 15, 16, 17, 18, 35, 36, 39, 41, 43, 44, 45, 46], "includ": [4, 8, 20, 23, 26, 28, 30, 33, 44], "necessari": [4, 39, 44], "argument": [4, 6, 43], "run": [4, 15, 17, 39, 46], "hessian": [4, 5, 7, 10, 15, 17, 24, 31, 47], "score": [4, 5, 7, 8, 10, 15, 17, 24, 31], "gradual": 4, "point": [4, 5, 15, 17, 20, 28, 30, 35, 36, 43, 46], "factor": [4, 5, 10, 15, 17], "round": 4, "overrid": [4, 42], "rest": 4, "log": [4, 12, 13, 15, 17, 34, 46], "process": [4, 5, 9, 13, 14, 15, 16, 17, 18, 19, 24, 27, 31, 37, 38, 41, 42, 43, 45, 46], "instanti": [4, 9, 42], "per_sampl": 4, "hessians_num_sampl": 4, "norm_scor": [4, 5], "log_norm": 4, "scale_log_norm": 4, "fals": [4, 5, 9, 14, 15, 17, 38, 44], "hessian_batch_s": [4, 5, 15, 17], "32": [4, 5], "metric": [4, 5, 6, 7, 12, 13, 35, 36], "sampl": [4, 15, 17, 46], "attent": [4, 15, 17, 44], "between": [4, 5, 12, 20, 28, 30, 43, 46], "scale": [4, 5, 43], "final": [4, 5, 13, 19, 27, 41, 46, 47], "vector": [4, 46], "method": [4, 5, 6, 7, 10, 13, 24, 31, 39, 41, 42, 43, 44], "ste": [4, 42, 44], "straight": [4, 44], "through": [4, 19, 24, 27, 44], "estim": [4, 44], "q_fraction_scheduler_polici": 4, "By": [4, 24, 28, 30, 31, 39, 46], "fraction": 4, "increas": [4, 5], "linearli": 4, "throughout": 4, "config": [4, 19, 20, 23, 24, 25, 26, 27, 28, 31, 32, 33, 37, 41, 44], "linear": [4, 27], "anneal": 4, "current": [4, 39], "support": [4, 39], "initial_q_fract": 4, "target_q_fract": 4, "start_step": 4, "end_step": 4, "target": [4, 13, 18, 20, 21, 23, 24, 25, 26, 29, 31, 32, 33, 43], "begin": 4, "complet": 4, "mix": [5, 6, 11, 13, 20, 21, 23, 25, 26, 28, 29, 30, 33, 37, 43, 47], "precis": [5, 6, 11, 13, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 33, 37, 43, 47], "compute_distance_fn": 5, "distance_weighting_method": 5, "mpdistanceweight": [5, 13], "avg": [5, 6], "num_of_imag": [5, 20, 23], "configuration_overwrit": 5, "num_interest_points_factor": 5, "use_hessian_based_scor": 5, "refine_mp_solut": 5, "metric_normalization_threshold": 5, "10000000000": 5, "distanc": [5, 6, 13], "two": [5, 12, 20, 23, 26, 28, 30, 33, 39, 43, 46], "tensor": [5, 12, 15, 17, 19, 21, 27, 29, 43, 44, 46, 47], "pre": 5, "each": [5, 7, 8, 20, 23, 24, 26, 28, 30, 31, 33, 41, 43, 44, 46], "among": 5, "sensit": [5, 7, 24, 31], "evalu": [5, 35, 36], "compar": [5, 20, 28, 30, 46], "integ": [5, 39, 43], "overwrit": 5, "predefin": [5, 7], "one": [5, 40, 46], "zero": [5, 43], "percentag": 5, "reduc": [5, 24, 31], "interest": 5, "calcul": [5, 7, 13, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33], "try": 5, "improv": [5, 24, 31], "greedi": [5, 7], "algorithm": 5, "search": [5, 11, 13, 20, 23, 26, 28, 30, 33], "threshold": [5, 9, 10, 20, 23, 26, 28, 30, 33, 43, 44], "check": [5, 39, 40, 41], "In": [5, 19, 20, 23, 26, 27, 28, 30, 33, 39, 40, 42], "case": 5, "larger": 5, "than": [5, 40], "thi": [5, 8, 9, 10, 13, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 30, 31, 33, 39, 43, 44, 47], "prevent": 5, "numer": 5, "issu": [5, 39], "call": [6, 21, 29, 43, 46], "take": [6, 23, 26, 33, 47], "last_lay": 6, "pruningconfig": [7, 13, 24, 31], "num_score_approxim": [7, 24, 31], "pruning_num_score_approxim": 7, "importance_metr": 7, "lfh": [7, 24, 31], "channels_filtering_strategi": 7, "specifi": [7, 14, 16, 19, 22, 24, 27, 31, 39], "neural": [7, 47], "approxim": [7, 24, 31], "perform": [7, 11, 19, 24, 27, 31], "strategi": [7, 24, 31], "constant": [7, 41, 44], "label": [7, 24, 31, 43, 47], "free": [7, 19, 24, 27, 31, 47], "approach": 7, "determin": [7, 24, 31, 43], "info": [7, 34], "measur": [7, 11, 12, 46], "least": 7, "up": [7, 19, 27, 43, 46], "allow": [7, 12, 19, 27, 39], "resourc": [7, 11, 13, 20, 23, 24, 25, 26, 31, 32, 33, 46], "util": [7, 13, 20, 23, 24, 25, 26, 31, 32, 33, 44], "limit": [7, 20, 23, 25, 26, 28, 30, 33], "now": [7, 18, 33, 39, 43, 44, 45, 46], "weights_memori": [7, 11, 20, 23, 24, 26, 31, 33], "consid": [7, 14, 16, 24, 31, 43], "pruninginfo": [8, 13, 24, 31], "pruning_mask": 8, "importance_scor": 8, "store": [8, 44], "mask": 8, "act": 8, "contain": [8, 13, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 44], "access": 8, "metadata": [8, 43], "basenod": 8, "np": [8, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "ndarrai": 8, "arrai": 8, "where": [8, 12, 39, 41, 46], "element": [8, 43], "correspond": 8, "neuron": 8, "ha": [8, 39, 40, 41], "been": 8, "kept": [8, 26, 33], "quantifi": [8, 46], "signific": 8, "properti": 8, "activation_error_method": 9, "quantizationerrormethod": [9, 13], "mse": [9, 10, 46], "weights_error_method": 9, "relu_bound_to_power_of_2": 9, "weights_bias_correct": 9, "weights_second_moment_correct": 9, "input_sc": 9, "softmax_shift": 9, "shift_negative_activation_correct": 9, "activation_channel_equ": 9, "z_threshold": 9, "inf": [9, 11], "min_threshold": [9, 44], "52587890625e": 9, "05": 9, "l_p_valu": 9, "linear_collaps": 9, "residual_collaps": 9, "shift_negative_ratio": 9, "shift_negative_threshold_recalcul": 9, "shift_negative_params_search": 9, "concat_threshold_upd": 9, "activation_bias_correct": 9, "activation_bias_correction_threshold": 9, "custom_tpc_opset_to_lay": 9, "you": [9, 39, 46, 47], "noclip": [9, 10], "while": [9, 20, 23, 25, 26, 33, 43], "like": [9, 43], "qc": 9, "error": 10, "minim": [10, 20, 24, 28, 30, 31], "nois": 10, "mae": [10, 46], "absolut": 10, "kl": [10, 46], "diverg": [10, 46], "make": 10, "signal": 10, "distribut": 10, "similar": [10, 12, 35, 36, 38, 47], "possibl": [10, 20, 23, 26, 33, 43, 46], "lp": 10, "norm": [10, 46], "hmse": 10, "more": [10, 18, 23, 24, 26, 31, 33, 39, 43, 45, 46], "valuabl": 10, "induc": 10, "prune": [11, 47], "activation_memori": 11, "total_memori": 11, "bop": 11, "memori": [11, 24, 31, 46], "byte": [11, 20, 23, 24, 26, 31, 33, 46], "sum": [11, 21, 24, 29, 31], "total": [11, 21, 29], "xquant_config": [12, 35, 36], "xquantconfig": [12, 13, 35, 36], "report_dir": 12, "custom_similarity_metr": 12, "report": [12, 13], "dir": [12, 46], "explain": [12, 13, 35, 36, 44], "directori": [12, 13, 34], "custom": [12, 19, 22, 26, 27, 39], "name": [12, 18, 39, 41, 43, 46], "implement": [12, 44], "init": [13, 41, 47], "modul": [13, 27, 28, 29, 30, 31, 36], "pytorch_post_training_quant": [13, 30, 39], "pytorch": [13, 43, 44, 47], "keras_post_training_quant": [13, 23, 39, 41, 46], "pytorch_gradient_post_training_quant": [13, 17, 28], "get_pytorch_gptq_config": [13, 17], "gradientptqconfig": [13, 20, 28], "keras_gradient_post_training_quant": [13, 15, 20], "get_keras_gptq_config": [13, 15, 20], "option": [13, 22, 23, 24, 26, 28, 31, 33, 39, 43], "pytorch_quantization_aware_training_init_experiment": [13, 32, 33], "prepar": [13, 26, 33], "awar": [13, 42, 44, 47], "experiment": [13, 19, 27, 47], "pytorch_quantization_aware_training_finalize_experiment": [13, 32], "after": [13, 20, 22, 23, 26, 33, 47], "without": 13, "quantizewrapp": [13, 26, 32, 33], "keras_quantization_aware_training_init_experiment": [13, 25, 26], "keras_quantization_aware_training_finalize_experiment": [13, 25], "qat_config": [13, 26, 33], "coreconfig": [13, 20, 21, 23, 25, 26, 28, 29, 30, 32, 33], "entir": 13, "quantizationconfig": [13, 37], "mixedprecisionquantizationconfig": [13, 20, 21, 23, 25, 26, 37], "bitwidthconfig": [13, 37], "resourceutil": [13, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 33], "network_editor": [13, 38], "modifi": [13, 41], "troubleshoot": 13, "pytorch_resource_utilization_data": [13, 29], "data": [13, 14, 16, 21, 24, 29, 31, 35, 36, 39, 43, 46, 47], "desir": [13, 20, 21, 23, 25, 26, 28, 29, 30, 33], "keras_resource_utilization_data": [13, 21], "pytorch_data_generation_experiment": [13, 27], "get_pytorch_data_generation_config": [13, 16, 27], "load": [13, 25, 26, 39, 44], "keras_data_generation_experiment": [13, 19], "get_keras_data_generation_config": [13, 14, 19], "pytorch_pruning_experiment": [13, 31], "structur": [13, 47], "keras_pruning_experiment": [13, 24], "xquant_report_pytorch_experiment": [13, 36], "xquant_report_keras_experiment": [13, 35], "serial": 13, "abstract": [13, 44], "hardwar": [13, 24, 31, 43, 44, 47], "orient": [13, 44], "tool": [13, 44], "logger": [13, 38, 46], "path": [13, 22, 34, 39, 46], "accord": [13, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 39, 40], "infer": [13, 18, 25, 32, 43, 44], "get_target_platform_cap": [13, 18, 43], "platform": [13, 18, 20, 23, 24, 25, 26, 29, 31, 43], "targetplatformcap": [13, 18, 20, 21, 23, 24, 26, 28, 29, 30, 31, 33], "page": 13, "document": [13, 23, 26, 33], "auto": 13, "sphinx": 13, "default_n_it": [14, 16], "adam": [14, 17], "default_data_gen_b": [14, 16], "default_keras_initial_lr": 14, "default_keras_output_loss_multipli": 14, "schedulertyp": [14, 16], "batchnormalignemntlosstyp": [14, 16], "outputlosstyp": [14, 16], "datainittyp": [14, 16], "bnlayerweightingtyp": [14, 16], "imagegranular": [14, 16], "imagepipelinetyp": [14, 16], "imagenormalizationtyp": [14, 16], "default_keras_extra_pixel": 14, "use_hessian_based_weight": [15, 17], "act_hessian_default_batch_s": [15, 17], "use_hessian_sample_attent": [15, 17], "gradual_activation_quant": [15, 17], "fine": [15, 17, 24, 25, 26, 31, 32, 33], "tune": [15, 17, 24, 25, 26, 31, 32], "optimizerv2": 15, "auxiliri": [15, 17], "variabl": [15, 17], "accept": [15, 43], "4": [15, 19, 20, 23, 24, 26, 27, 28, 30, 31, 33], "1st": 15, "2nd": 15, "3rd": 15, "4th": 15, "gradualactivationquantizationconfig": [15, 17], "gradualactivationquant": [15, 17], "disabl": [15, 17], "non": [15, 17, 43], "5": [15, 17, 24, 31], "gptq_conf": [15, 17, 28], "nadam": 15, "order": [15, 17, 20, 23, 26, 33, 38, 39, 40, 42], "radam": 16, "default_pytorch_initial_lr": 16, "default_pytorch_output_loss_multipli": 16, "reduce_on_plateau_with_reset": 16, "default_pytorch_extra_pixel": 16, "default_pytorch_bn_layer_typ": 16, "default_pytorch_last_layer_typ": 16, "exact": 17, "dummi": 17, "param": [17, 38, 41, 44], "torch": [17, 27, 36, 39, 47], "fw_name": 18, "target_platform_nam": 18, "target_platform_vers": 18, "degener": 18, "compli": 18, "tpc": [18, 24, 31, 43], "capabl": [18, 24, 29, 31], "version": [18, 19, 27, 43, 47], "some": [18, 19, 27, 39, 43, 45, 46], "field": [18, 40, 43, 45], "opquantizationconfig": [18, 45], "ignor": [18, 43, 45], "quantization_preserv": [18, 43, 45], "fixed_scal": [18, 43, 45], "fixed_zero_point": [18, 43, 45], "futur": [18, 19, 27, 43, 45], "n_imag": [19, 27], "output_image_s": [19, 27], "data_generation_config": [19, 27], "ll": [19, 27], "walk": [19, 27], "simpl": [19, 27], "involv": [19, 24, 27, 31], "start": [19, 27, 39, 44, 47], "compress": [19, 24, 27, 28, 31], "toolkit": [19, 27, 28], "sequenti": [19, 27], "flatten": [19, 27], "next": [19, 27, 39, 40], "input_shap": 19, "8": [19, 20, 23, 25, 26, 27, 39, 43, 44], "10": [19, 20, 23, 26, 27, 28, 30, 33], "simplic": [19, 27], "notic": [19, 24, 27, 31, 39], "mai": [19, 20, 23, 26, 27, 28, 30, 33, 40, 46], "chang": [19, 27, 39, 41, 46], "generated_imag": [19, 27], "variou": [19, 27, 46], "purpos": [19, 27, 38], "in_model": [20, 21, 23, 25, 26, 29, 32, 33], "representative_data_gen": [20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 39], "gptq_config": [20, 28, 30], "gptq_representative_data_gen": [20, 28], "target_resource_util": [20, 23, 24, 26, 28, 30, 31, 33], "core_config": [20, 21, 23, 25, 26, 28, 29, 30, 32, 33], "target_platform_cap": [20, 21, 23, 24, 26, 28, 29, 30, 31, 33, 40, 44], "default_keras_tpc": [20, 23, 24, 26], "symmetr": [20, 23, 26, 28, 30, 33, 43, 44], "constraint": [20, 23, 24, 28, 30, 31], "power": [20, 23, 26, 28, 30, 33, 43], "sever": [20, 23, 26, 28, 30, 33, 46], "fold": [20, 23, 26, 28, 30, 33], "preced": [20, 23, 26, 28, 30, 33], "histogram": [20, 23, 26, 28, 30, 33, 46], "being": [20, 23, 26, 28, 30, 33, 43, 44], "ilp": [20, 23, 26, 33], "solver": [20, 23, 26, 33], "find": [20, 23, 26, 33], "both": [20, 23, 28, 30, 32, 44, 46], "maxim": [20, 23, 26, 33], "observ": [20, 28, 30, 43, 46], "calibr": [20, 21, 23, 26, 28, 29, 30, 33], "user": [20, 23, 25, 26, 28, 30, 32, 33], "handl": [20, 23, 26, 28, 30, 33], "applic": [20, 21, 23, 24, 25, 26, 39], "mobilenet": [20, 21], "random": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "requir": [20, 23, 26, 28, 30, 33, 44, 46], "num_calibration_batch": [20, 23, 26, 28, 30, 33], "numpi": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "def": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "repr_datagen": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33], "_": [20, 23, 26, 28, 30, 33, 39], "yield": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "224": [20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 39], "bitwidth": [20, 23, 25, 26], "candid": [20, 23, 25, 26, 41], "mixed_precision_config": [20, 21, 23, 25, 26, 37], "our": [20, 23, 25, 26, 33, 47], "note": [20, 23, 25, 26], "affect": [20, 23, 25, 26], "ru": [20, 23, 25, 26], "count_param": [20, 23, 24, 25, 26], "75": [20, 23, 25, 26], "quantized_model": [20, 23, 25, 26, 32, 33, 35, 36], "quantization_info": [20, 23, 25, 26, 28, 30, 32, 33], "userinform": 20, "keras_default_tpc": 21, "build": [21, 29, 44, 47], "graph": [21, 29, 41, 46], "hw": 21, "frameworkquantizationcap": [21, 28, 29, 30], "ru_data": [21, 29], "keras_load_quantized_model": 22, "filepath": 22, "custom_object": [22, 25, 26], "compil": 22, "trainabl": [22, 25, 44], "file": [22, 25, 26, 34, 39], "addit": [22, 39], "boolean": 22, "saved_model": 22, "loadopt": 22, "savedmodel": 22, "ptq": [23, 30, 39], "mobilenet_v2": [23, 25, 26, 28, 29, 30, 32, 33, 39], "mobilenetv2": [23, 25, 26, 39, 46], "pleas": [23, 26, 33, 39, 42, 47], "look": [23, 26, 33, 43, 47], "pruning_config": [24, 31], "meet": [24, 31], "simd": [24, 31, 43], "assess": [24, 31], "togeth": [24, 31], "friendli": [24, 31, 47], "architectur": [24, 31], "analyz": [24, 31], "identifi": [24, 31, 43], "remov": [24, 31, 32], "impact": [24, 31], "must": [24, 31, 43], "retrain": [24, 31], "recov": [24, 31], "origin": [24, 35, 36, 46], "achiev": 24, "analysi": [24, 31], "standard": [24, 31, 44], "associ": [24, 31], "resnet50": [24, 31, 39], "here": [24, 31, 39, 43, 47], "aim": [24, 31], "footprint": [24, 31], "50": [24, 31], "assum": [24, 31], "float32": [24, 31, 39], "thu": [24, 31, 46], "dense_nparam": [24, 31], "l": [24, 47], "higher": [24, 31], "also": [24, 31, 47], "extend": [24, 31], "durat": [24, 31], "pruned_model": [24, 31], "pruning_info": [24, 31], "qat": [25, 26, 32, 33, 42], "convert": [25, 32], "replac": 25, "trainablequant": 25, "inferablequant": [25, 32], "load_model": [25, 26], "model_fil": [25, 26], "qatconfig": [26, 33], "built": [26, 33, 44], "fake_qu": [26, 33], "onlin": [26, 33], "wrapper": [26, 32, 33, 44], "ker": 26, "hight": 27, "nn": [27, 36], "batchnorm2d": 27, "6": 27, "default_pytorch_tpc": [28, 30, 31, 33], "quantized_modul": [28, 30], "pytorch_default_tpc": 29, "in_modul": 30, "clibrat": 30, "default_pyotrch_tpc": 31, "resnet50_weight": 31, "imagenet1k_v1": 31, "p": 31, "numel": 31, "state_dict": 31, "pretrain": [32, 33], "keep": [32, 47], "readi": 32, "tun": 33, "set_log_fold": [34, 46], "folder": 34, "level": 34, "verbos": 34, "facade_xquant_report": [35, 36], "float_model": [35, 36, 39], "repr_dataset": [35, 36, 39], "validation_dataset": [35, 36], "valid": [35, 36, 43, 44], "quantization_config": [37, 44], "debug_config": 37, "dataclass": [37, 38], "debugconfig": 37, "debug": [37, 38], "edit": [37, 38, 41], "analyze_similar": 38, "simulate_schedul": 38, "plot": [38, 46], "figur": [38, 46], "within": [38, 43, 47], "tensorboard": [38, 47], "pinpoint": 38, "problemat": 38, "editrul": 38, "rule": [38, 41], "action": 38, "simul": 38, "behavior": 38, "cut": 38, "detail": [39, 43], "refer": 39, "project": [39, 47], "github": [39, 47], "readm": 39, "question": 39, "open": [39, 46, 47], "repositori": 39, "fakely_qu": 39, "int8": 39, "mct_quantiz": 39, "tflite": [39, 43], "via": [39, 47], "save_model_path": 39, "is_layer_exportable_fn": 39, "is_keras_layer_export": 39, "serialization_format": 39, "quantization_format": 39, "To": [39, 46], "demonstr": [39, 43], "quantized_exportable_model": 39, "lambda": 39, "dtype": 39, "avail": [39, 47], "tempfil": 39, "keras_file_path": 39, "mkstemp": 39, "torchscript": 39, "is_pytorch_layer_export": 39, "onnx_opset_vers": 39, "default_onnx_opset_vers": 39, "fake": 39, "trace": 39, "mandatori": 39, "quant": 39, "your": 39, "packag": [39, 44, 47], "so": 39, "part": 39, "skip": 39, "plan": 39, "pip": [39, 47], "instal": 39, "q": 39, "onnxruntim": 39, "extens": 39, "let": 39, "There": [39, 46], "onnx_file_path": 39, "model_format_onnx_mctq": 39, "15": 39, "16": 39, "get_ort_session_opt": 39, "session": 39, "creation": 39, "slowli": 39, "suffer": 39, "longer": 39, "latenc": 39, "howev": 39, "imx500": [39, 43], "ort": 39, "sess": 39, "inferencesess": 39, "cudaexecutionprovid": 39, "cpuexecutionprovid": 39, "_input_data": 39, "astyp": 39, "_model_output_nam": 39, "get_output": 39, "_model_input_nam": 39, "get_input": 39, "predict": 39, "layerfilterparam": 40, "attributefilt": 40, "attr": 40, "op": [40, 43], "match": [40, 41], "regard": 40, "eq": 40, "equal": 40, "noteq": 40, "greater": 40, "greatereq": 40, "smaller": 40, "smallereq": 40, "attribut": [41, 43, 44], "9": 41, "er_list": 41, "nodetypefilt": 41, "changecandidatesweightsquantconfigattr": 41, "attr_nam": 41, "weights_n_bit": [41, 43, 44], "new": [41, 43], "node_typ": 41, "nodenamefilt": 41, "node_nam": 41, "nodenamescopefilt": 41, "node_name_scop": 41, "string": 41, "changefinalweightsquantconfigattr": 41, "kwarg": 41, "attr_valu": 41, "changefinalactivationquantconfigattr": 41, "changecandidatesactivationquantconfigattr": 41, "changequantizationparamfunct": 41, "activation_quantization_params_fn": 41, "weights_quantization_params_fn": 41, "changefinalweightsquantizationmethod": 41, "weights_quantization_method": [41, 43, 44], "changecandidatesweightsquantizationmethod": 41, "changecandidatesactivationquantizationmethod": 41, "activation_quantization_method": [41, 43, 44], "changequantizationmethod": 41, "visit": [42, 47], "trainable_infrastructur": 42, "weight_training_method": 42, "activation_training_method": 42, "weight_quantizer_params_overrid": 42, "activation_quantizer_params_overrid": 42, "qnnpack": 43, "backend": 43, "address": 43, "accordingli": 43, "shortli": 43, "diagram": 43, "main": [43, 46], "compon": [43, 44], "power_of_two": 43, "uniform": [43, 44], "lut_pot_quant": 43, "lookup": 43, "tabl": 43, "lut_sym_quant": 43, "schema": 43, "mct_current_schema": 43, "default_weight_attr_config": 43, "attr_weights_configs_map": 43, "activation_n_bit": [43, 44], "supported_input_activation_n_bit": 43, "enable_activation_quant": [43, 44], "simd_siz": 43, "singl": 43, "instruct": 43, "fetch": 43, "simultan": 43, "signed": 43, "pars": 43, "keyword": 43, "rais": 43, "validationerror": 43, "cannot": 43, "form": 43, "weights_per_channel_threshold": [43, 44], "enable_weights_quant": [43, 44], "lut_values_bitwidth": 43, "hptq": [43, 47], "otherwis": 43, "quantization_configur": 43, "gather": [43, 46], "base_config": 43, "fallback": 43, "manner": 43, "default_qco": 43, "operator_set": 43, "fusing_pattern": 43, "pattern": 43, "tpc_minor_vers": 43, "minor": 43, "tpc_patch_vers": 43, "patch": 43, "tpc_platform_typ": 43, "add_metadata": 43, "ad": 43, "is_simd_pad": 43, "pad": 43, "schema_vers": 43, "uniqu": 43, "operatorsetnam": 43, "qc_option": 43, "fix": 43, "liter": 43, "combin": 43, "treat": 43, "henc": 43, "them": [43, 46], "operator_group": 43, "either": 43, "concaten": 43, "similarli": 43, "place": 43, "operators_set": 43, "infrastructur": 44, "propos": 44, "emul": 44, "holder": 44, "upon": 44, "learnabl": 44, "basic": 44, "block": [44, 46], "get_config": 44, "from_config": 44, "freeze_quant_param": 44, "implment": 44, "freez": 44, "poweroftwo": 44, "dqa": 44, "dnn": 44, "introduc": 44, "lsq": 44, "http": [44, 47], "arxiv": [44, 47], "org": 44, "pdf": 44, "1902": 44, "08153": 44, "weights_quantization_param": 44, "weights_channels_axi": 44, "weights_quantization_candid": 44, "minimum": 44, "activation_quantization_param": 44, "activation_quantization_candid": 44, "One": 46, "phase": 46, "displai": 46, "ui": 46, "done": 46, "writer": 46, "stage": 46, "launch": 46, "logdir": 46, "seen": 46, "under": 46, "tab": 46, "click": 46, "deeper": 46, "view": 46, "tag": 46, "show": 46, "These": 46, "scalar": 46, "were": 46, "wai": [46, 47], "mathemat": 46, "divis": 46, "dot": 46, "product": 46, "euclidean": 46, "along": 46, "pair": 46, "would": 46, "mani": 46, "few": [46, 47], "As": 46, "20": 46, "insert": 46, "chosen": 46, "second": 46, "sourc": 47, "research": 47, "develop": 47, "engin": 47, "easili": 47, "state": 47, "art": 47, "work": 47, "soni": 47, "semiconductor": 47, "israel": 47, "git": 47, "clone": 47, "com": 47, "model_optim": 47, "python": 47, "setup": 47, "py": 47, "pypi": 47, "latest": 47, "stabl": 47, "releas": 47, "nightli": 47, "unstabl": 47, "visual": 47, "cosin": 47, "comparison": 47, "just": 47, "minut": 47, "notebook": 47, "doesn": 47, "t": 47, "out1": 47, "out2": 47, "out3": 47, "habi": 47, "h": 47, "v": 47, "peretz": 47, "r": 47, "cohen": 47, "dikstein": 47, "dror": 47, "o": 47, "diamant": 47, "i": 47, "jen": 47, "netzer": 47, "2021": 47, "preprint": 47, "gordon": 47, "2023": 47, "eptq": 47, "enhanc": 47}, "objects": {"model_compression_toolkit": [[2, 0, 1, "", "DefaultDict"], [18, 3, 1, "", "get_target_platform_capabilities"], [22, 3, 1, "", "keras_load_quantized_model"], [34, 3, 1, "", "set_log_folder"]], "model_compression_toolkit.DefaultDict": [[2, 1, 1, "", "get"], [2, 1, 1, "", "keys"]], "model_compression_toolkit.core": [[0, 0, 1, "", "BitWidthConfig"], [3, 0, 1, "", "ChannelAxis"], [37, 0, 1, "", "CoreConfig"], [38, 0, 1, "", "DebugConfig"], [3, 0, 1, "", "FrameworkInfo"], [5, 0, 1, "", "MixedPrecisionQuantizationConfig"], [6, 0, 1, "", "MpDistanceWeighting"], [9, 0, 1, "", "QuantizationConfig"], [10, 0, 1, "", "QuantizationErrorMethod"], [11, 0, 1, "", "ResourceUtilization"], [21, 3, 1, "", "keras_resource_utilization_data"], [29, 3, 1, "", "pytorch_resource_utilization_data"]], "model_compression_toolkit.core.BitWidthConfig": [[0, 2, 1, "", "manual_activation_bit_width_selection_list"]], "model_compression_toolkit.core.common.quantization.bit_width_config": [[0, 0, 1, "", "ManualBitWidthSelection"]], "model_compression_toolkit.core.common.quantization.bit_width_config.ManualBitWidthSelection": [[0, 2, 1, "", "bit_width"], [0, 2, 1, "", "filter"]], "model_compression_toolkit.core.network_editor": [[41, 0, 1, "", "ChangeCandidatesActivationQuantConfigAttr"], [41, 0, 1, "", "ChangeCandidatesActivationQuantizationMethod"], [41, 0, 1, "", "ChangeCandidatesWeightsQuantConfigAttr"], [41, 0, 1, "", "ChangeCandidatesWeightsQuantizationMethod"], [41, 0, 1, "", "ChangeFinalActivationQuantConfigAttr"], [41, 0, 1, "", "ChangeFinalWeightsQuantConfigAttr"], [41, 0, 1, "", "ChangeFinalWeightsQuantizationMethod"], [41, 0, 1, "", "ChangeQuantizationParamFunction"], [41, 0, 1, "", "EditRule"], [41, 0, 1, "", "NodeNameFilter"], [41, 0, 1, "", "NodeNameScopeFilter"], [41, 0, 1, "", "NodeTypeFilter"]], "model_compression_toolkit.data_generation": [[1, 0, 1, "", "BNLayerWeightingType"], [1, 0, 1, "", "BatchNormAlignemntLossType"], [1, 0, 1, "", "DataGenerationConfig"], [1, 0, 1, "", "DataInitType"], [1, 0, 1, "", "ImageGranularity"], [1, 0, 1, "", "ImageNormalizationType"], [1, 0, 1, "", "ImagePipelineType"], [1, 0, 1, "", "OutputLossType"], [1, 0, 1, "", "SchedulerType"], [14, 3, 1, "", "get_keras_data_generation_config"], [16, 3, 1, "", "get_pytorch_data_generation_config"], [19, 3, 1, "", "keras_data_generation_experimental"], [27, 3, 1, "", "pytorch_data_generation_experimental"]], "model_compression_toolkit.exporter": [[39, 0, 1, "", "KerasExportSerializationFormat"], [39, 0, 1, "", "PytorchExportSerializationFormat"], [39, 0, 1, "", "QuantizationFormat"], [39, 0, 1, "", "keras_export_model"], [39, 0, 1, "", "pytorch_export_model"]], "model_compression_toolkit.gptq": [[4, 0, 1, "", "GPTQHessianScoresConfig"], [4, 0, 1, "", "GradientPTQConfig"], [4, 0, 1, "", "GradualActivationQuantizationConfig"], [4, 0, 1, "", "QFractionLinearAnnealingConfig"], [4, 0, 1, "", "RoundingType"], [15, 3, 1, "", "get_keras_gptq_config"], [17, 3, 1, "", "get_pytorch_gptq_config"], [20, 3, 1, "", "keras_gradient_post_training_quantization"], [28, 3, 1, "", "pytorch_gradient_post_training_quantization"]], "model_compression_toolkit.pruning": [[7, 0, 1, "", "ChannelsFilteringStrategy"], [7, 0, 1, "", "ImportanceMetric"], [7, 0, 1, "", "PruningConfig"], [8, 0, 1, "", "PruningInfo"], [24, 3, 1, "", "keras_pruning_experimental"], [31, 3, 1, "", "pytorch_pruning_experimental"]], "model_compression_toolkit.pruning.PruningConfig": [[7, 2, 1, "", "channels_filtering_strategy"], [7, 2, 1, "", "importance_metric"], [7, 2, 1, "", "num_score_approximations"]], "model_compression_toolkit.pruning.PruningInfo": [[8, 4, 1, "", "importance_scores"], [8, 4, 1, "", "pruning_masks"]], "model_compression_toolkit.ptq": [[23, 3, 1, "", "keras_post_training_quantization"], [30, 3, 1, "", "pytorch_post_training_quantization"]], "model_compression_toolkit.qat": [[42, 0, 1, "", "QATConfig"], [25, 3, 1, "", "keras_quantization_aware_training_finalize_experimental"], [26, 3, 1, "", "keras_quantization_aware_training_init_experimental"], [32, 3, 1, "", "pytorch_quantization_aware_training_finalize_experimental"], [33, 3, 1, "", "pytorch_quantization_aware_training_init_experimental"]], "model_compression_toolkit.target_platform_capabilities": [[40, 0, 1, "", "AttributeFilter"], [40, 0, 1, "", "Eq"], [40, 0, 1, "", "Greater"], [40, 0, 1, "", "GreaterEq"], [40, 0, 1, "", "NotEq"], [43, 0, 1, "", "QuantizationMethod"], [40, 0, 1, "", "Smaller"], [40, 0, 1, "", "SmallerEq"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema": [[43, 0, 1, "", "AttributeQuantizationConfig"], [43, 0, 1, "", "Fusing"], [43, 0, 1, "", "OpQuantizationConfig"], [43, 0, 1, "", "OperatorSetGroup"], [43, 0, 1, "", "OperatorsSet"], [43, 0, 1, "", "QuantizationConfigOptions"], [43, 0, 1, "", "TargetPlatformCapabilities"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.AttributeQuantizationConfig": [[43, 2, 1, "", "enable_weights_quantization"], [43, 2, 1, "", "lut_values_bitwidth"], [43, 2, 1, "", "weights_n_bits"], [43, 2, 1, "", "weights_per_channel_threshold"], [43, 2, 1, "", "weights_quantization_method"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.Fusing": [[43, 2, 1, "", "name"], [43, 2, 1, "", "operator_groups"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OperatorSetGroup": [[43, 2, 1, "", "name"], [43, 2, 1, "", "operators_set"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.OperatorsSet": [[43, 2, 1, "", "name"], [43, 2, 1, "", "qc_options"], [43, 2, 1, "", "type"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.QuantizationConfigOptions": [[43, 2, 1, "", "base_config"], [43, 2, 1, "", "quantization_configurations"]], "model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema.TargetPlatformCapabilities": [[43, 2, 1, "", "SCHEMA_VERSION"], [43, 2, 1, "", "add_metadata"], [43, 2, 1, "", "default_qco"], [43, 2, 1, "", "fusing_patterns"], [43, 2, 1, "", "is_simd_padding"], [43, 2, 1, "", "name"], [43, 2, 1, "", "operator_set"], [43, 2, 1, "", "tpc_minor_version"], [43, 2, 1, "", "tpc_patch_version"], [43, 2, 1, "", "tpc_platform_type"]], "model_compression_toolkit.trainable_infrastructure": [[44, 0, 1, "", "BaseKerasTrainableQuantizer"], [44, 0, 1, "", "BasePytorchTrainableQuantizer"], [44, 0, 1, "", "TrainableQuantizerActivationConfig"], [44, 0, 1, "", "TrainableQuantizerWeightsConfig"], [44, 0, 1, "", "TrainingMethod"]], "model_compression_toolkit.xquant.common.xquant_config": [[12, 0, 1, "", "XQuantConfig"]], "model_compression_toolkit.xquant.keras.facade_xquant_report": [[35, 3, 1, "", "xquant_report_keras_experimental"]], "model_compression_toolkit.xquant.pytorch.facade_xquant_report": [[36, 3, 1, "", "xquant_report_pytorch_experimental"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute", "3": "py:function", "4": "py:property"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "function", "Python function"], "4": ["py", "property", "Python property"]}, "titleterms": {"bitwidthconfig": 0, "manualbitwidthselect": 0, "data": [1, 19, 27], "gener": [1, 19, 27], "configur": [1, 7, 12, 46], "imagegranular": 1, "schedulertyp": 1, "batchnormalignemntlosstyp": 1, "outputlosstyp": 1, "datainittyp": 1, "bnlayerweightingtyp": 1, "imagepipelinetyp": 1, "imagenormalizationtyp": 1, "defaultdict": 2, "class": [2, 3, 4], "frameworkinfo": 3, "channelaxi": 3, "gradientptqconfig": [4, 15, 17], "gptqhessianscoresconfig": 4, "roundingtyp": 4, "gradualactivationquantizationconfig": 4, "qfractionlinearannealingconfig": 4, "mixedprecisionquantizationconfig": 5, "mpdistanceweight": 6, "prune": [7, 8, 13, 24, 31], "importancemetr": 7, "channelsfilteringstrategi": 7, "inform": [8, 21, 29], "quantizationconfig": 9, "quantizationerrormethod": 10, "resourceutil": 11, "xquant": [12, 13, 35, 36], "api": [13, 47], "doc": 13, "ptq": 13, "gptq": 13, "qat": 13, "core": 13, "data_gener": 13, "export": [13, 39], "trainable_infrastructur": [13, 44], "set_log_fold": 13, "keras_load_quantized_model": 13, "target_platform_cap": [13, 43], "indic": 13, "tabl": 13, "get": [14, 15, 16, 17, 18, 21, 29], "datagenerationconfig": [14, 16], "kera": [14, 15, 19, 20, 21, 22, 23, 24, 25, 26, 35, 39], "model": [14, 15, 16, 17, 21, 22, 25, 26, 29, 32, 33, 39, 47], "pytorch": [16, 17, 27, 28, 29, 30, 31, 32, 33, 36, 39], "frameworkquantizationcap": 18, "gradient": [20, 28], "base": [20, 28], "post": [20, 23, 28, 30], "train": [20, 23, 25, 26, 28, 30, 32, 33], "quantiz": [20, 22, 23, 25, 26, 28, 30, 32, 33, 39], "resourc": [21, 29], "util": [21, 29], "load": 22, "structur": [24, 31], "awar": [25, 26, 32, 33], "final": [25, 32], "init": [26, 33], "enabl": 34, "logger": 34, "report": [35, 36], "coreconfig": 37, "debug_config": 38, "modul": [38, 39, 41, 42, 43, 44], "debugconfig": 38, "quantizationformat": 39, "kerasexportserializationformat": 39, "keras_export_model": 39, "tutori": 39, "serial": 39, "format": 39, "mctq": 39, "pytorchexportserializationformat": 39, "pytorch_export_model": 39, "onnx": 39, "opset": 39, "version": 39, "us": 39, "infer": 39, "layer": 40, "attribut": 40, "filter": [40, 41], "network_editor": 41, "editrul": 41, "action": 41, "qat_config": 42, "trainingmethod": [42, 44], "qatconfig": 42, "quantizationmethod": 43, "opquantizationconfig": 43, "attributequantizationconfig": 43, "quantizationconfigopt": 43, "targetplatformcap": 43, "operatorsset": 43, "fuse": 43, "operatorsetgroup": 43, "basekerastrainablequant": 44, "basepytorchtrainablequant": 44, "trainablequantizerweightsconfig": 44, "trainablequantizeractivationconfig": 44, "visual": 46, "within": 46, "tensorboard": 46, "cosin": 46, "similar": 46, "comparison": 46, "mix": 46, "precis": 46, "bit": 46, "width": 46, "compress": 47, "toolkit": 47, "user": 47, "guid": 47, "overview": 47, "instal": 47, "support": 47, "featur": 47, "quickstart": 47, "document": 47, "technic": 47, "constraint": 47, "refer": 47}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/static/bizstyle.js b/docs/static/bizstyle.js index f41af42bc..9057a3811 100644 --- a/docs/static/bizstyle.js +++ b/docs/static/bizstyle.js @@ -23,7 +23,7 @@ const initialiseBizStyle = () => { } window.addEventListener("resize", - () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "MCT Documentation: ver 2.2.0") + () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "MCT Documentation: ver 2.3.0") ) if (document.readyState !== "loading") initialiseBizStyle() diff --git a/docs/static/documentation_options.js b/docs/static/documentation_options.js index 15876331c..72ca52131 100644 --- a/docs/static/documentation_options.js +++ b/docs/static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '2.2.0', + VERSION: '2.3.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html',