mct-nightly 1.8.0.8032023.post421__py3-none-any.whl → 1.8.0.8052023.post414__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mct_nightly-1.8.0.8032023.post421.dist-info → mct_nightly-1.8.0.8052023.post414.dist-info}/METADATA +10 -9
- {mct_nightly-1.8.0.8032023.post421.dist-info → mct_nightly-1.8.0.8052023.post414.dist-info}/RECORD +303 -291
- {mct_nightly-1.8.0.8032023.post421.dist-info → mct_nightly-1.8.0.8052023.post414.dist-info}/WHEEL +1 -1
- model_compression_toolkit/__init__.py +12 -41
- model_compression_toolkit/{core/common/constants.py → constants.py} +2 -6
- model_compression_toolkit/core/__init__.py +14 -0
- model_compression_toolkit/core/analyzer.py +3 -2
- model_compression_toolkit/core/common/__init__.py +0 -1
- model_compression_toolkit/core/common/collectors/base_collector.py +1 -1
- model_compression_toolkit/core/common/collectors/mean_collector.py +1 -1
- model_compression_toolkit/core/common/collectors/min_max_per_channel_collector.py +1 -1
- model_compression_toolkit/core/common/framework_implementation.py +1 -8
- model_compression_toolkit/core/common/framework_info.py +1 -1
- model_compression_toolkit/core/common/fusion/layer_fusing.py +4 -4
- model_compression_toolkit/core/common/graph/base_graph.py +2 -2
- model_compression_toolkit/core/common/graph/base_node.py +57 -1
- model_compression_toolkit/core/common/graph/memory_graph/bipartite_graph.py +1 -1
- model_compression_toolkit/core/common/graph/memory_graph/max_cut_astar.py +1 -1
- model_compression_toolkit/core/common/graph/virtual_activation_weights_node.py +2 -2
- model_compression_toolkit/core/common/memory_computation.py +1 -1
- model_compression_toolkit/core/common/mixed_precision/bit_width_setter.py +3 -5
- model_compression_toolkit/core/common/mixed_precision/kpi_tools/kpi_data.py +3 -4
- model_compression_toolkit/core/common/mixed_precision/kpi_tools/kpi_methods.py +3 -3
- model_compression_toolkit/core/common/mixed_precision/mixed_precision_quantization_config.py +1 -1
- model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_facade.py +3 -2
- model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py +1 -1
- model_compression_toolkit/core/common/mixed_precision/search_methods/linear_programming.py +1 -1
- model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py +2 -2
- model_compression_toolkit/core/common/mixed_precision/solution_refinement_procedure.py +2 -2
- model_compression_toolkit/core/common/model_collector.py +2 -2
- model_compression_toolkit/core/common/model_validation.py +1 -1
- model_compression_toolkit/core/common/network_editors/actions.py +4 -1
- model_compression_toolkit/core/common/network_editors/edit_network.py +0 -2
- model_compression_toolkit/core/common/quantization/candidate_node_quantization_config.py +1 -1
- model_compression_toolkit/core/common/quantization/filter_nodes_candidates.py +3 -4
- model_compression_toolkit/core/common/quantization/node_quantization_config.py +3 -3
- model_compression_toolkit/core/common/quantization/quantization_config.py +2 -2
- model_compression_toolkit/core/common/quantization/quantization_fn_selection.py +1 -1
- model_compression_toolkit/core/common/quantization/quantization_params_fn_selection.py +2 -2
- model_compression_toolkit/core/common/quantization/quantization_params_generation/error_functions.py +3 -2
- model_compression_toolkit/core/common/quantization/quantization_params_generation/kmeans_params.py +1 -1
- model_compression_toolkit/core/common/quantization/quantization_params_generation/lut_kmeans_params.py +2 -2
- model_compression_toolkit/core/common/quantization/quantization_params_generation/power_of_two_selection.py +2 -2
- model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_activations_computation.py +3 -3
- model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_computation.py +1 -1
- model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_search.py +1 -1
- model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_weights_computation.py +1 -1
- model_compression_toolkit/core/common/quantization/quantization_params_generation/symmetric_selection.py +2 -2
- model_compression_toolkit/core/common/quantization/quantization_params_generation/uniform_selection.py +2 -2
- model_compression_toolkit/core/common/quantization/quantize_graph_weights.py +4 -4
- model_compression_toolkit/core/common/quantization/quantize_node.py +2 -2
- model_compression_toolkit/core/common/quantization/quantizers/kmeans_quantizer.py +1 -1
- model_compression_toolkit/core/common/quantization/quantizers/lut_kmeans_quantizer.py +1 -1
- model_compression_toolkit/core/common/quantization/quantizers/quantizers_helpers.py +4 -2
- model_compression_toolkit/core/common/quantization/quantizers/uniform_quantizers.py +2 -2
- model_compression_toolkit/core/common/quantization/set_node_quantization_config.py +7 -7
- model_compression_toolkit/core/common/similarity_analyzer.py +2 -2
- model_compression_toolkit/core/common/statistics_correction/apply_bias_correction_to_graph.py +1 -1
- model_compression_toolkit/core/common/statistics_correction/apply_second_moment_correction_to_graph.py +2 -4
- model_compression_toolkit/core/common/statistics_correction/compute_bias_correction_of_graph.py +5 -5
- model_compression_toolkit/core/common/substitutions/apply_substitutions.py +2 -5
- model_compression_toolkit/core/common/substitutions/batchnorm_reconstruction.py +2 -2
- model_compression_toolkit/core/common/substitutions/batchnorm_refusing.py +3 -3
- model_compression_toolkit/core/common/substitutions/linear_collapsing.py +1 -1
- model_compression_toolkit/core/common/substitutions/linear_collapsing_substitution.py +0 -3
- model_compression_toolkit/core/common/substitutions/shift_negative_activation.py +5 -5
- model_compression_toolkit/core/common/substitutions/virtual_activation_weights_composition.py +1 -1
- model_compression_toolkit/core/common/substitutions/weights_activation_split.py +1 -1
- model_compression_toolkit/core/common/visualization/tensorboard_writer.py +1 -1
- model_compression_toolkit/core/keras/back2framework/factory_model_builder.py +1 -1
- model_compression_toolkit/core/keras/back2framework/float_model_builder.py +1 -1
- model_compression_toolkit/core/keras/back2framework/keras_model_builder.py +1 -4
- model_compression_toolkit/core/keras/back2framework/mixed_precision_model_builder.py +1 -1
- model_compression_toolkit/core/keras/back2framework/model_gradients.py +5 -4
- model_compression_toolkit/core/keras/back2framework/quantized_model_builder.py +1 -1
- model_compression_toolkit/core/keras/constants.py +0 -7
- model_compression_toolkit/core/keras/default_framework_info.py +3 -3
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/activation_decomposition.py +1 -1
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/input_scaling.py +1 -1
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/linear_collapsing.py +1 -1
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/multi_head_attention_decomposition.py +3 -4
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/relu_bound_to_power_of_2.py +2 -1
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/remove_relu_upper_bound.py +3 -2
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/residual_collapsing.py +1 -1
- model_compression_toolkit/core/keras/graph_substitutions/substitutions/shift_negative_activation.py +1 -1
- model_compression_toolkit/core/keras/keras_implementation.py +2 -10
- model_compression_toolkit/core/keras/keras_model_validation.py +1 -1
- model_compression_toolkit/core/keras/keras_node_prior_info.py +1 -1
- model_compression_toolkit/core/keras/kpi_data_facade.py +10 -10
- model_compression_toolkit/core/keras/quantizer/fake_quant_builder.py +2 -2
- model_compression_toolkit/core/keras/quantizer/input_layer_quantize_transform.py +1 -1
- model_compression_toolkit/core/keras/quantizer/lut_fake_quant.py +2 -2
- model_compression_toolkit/core/keras/quantizer/mixed_precision/selective_quantize_config.py +1 -1
- model_compression_toolkit/core/keras/reader/common.py +1 -1
- model_compression_toolkit/core/keras/statistics_correction/apply_second_moment_correction.py +1 -1
- model_compression_toolkit/core/pytorch/back2framework/factory_model_builder.py +1 -1
- model_compression_toolkit/core/pytorch/back2framework/float_model_builder.py +1 -1
- model_compression_toolkit/core/pytorch/back2framework/mixed_precision_model_builder.py +1 -1
- model_compression_toolkit/core/pytorch/back2framework/model_gradients.py +15 -8
- model_compression_toolkit/core/pytorch/back2framework/pytorch_model_builder.py +1 -1
- model_compression_toolkit/core/pytorch/back2framework/quantized_model_builder.py +1 -1
- model_compression_toolkit/core/pytorch/constants.py +4 -6
- model_compression_toolkit/core/pytorch/default_framework_info.py +2 -2
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/linear_collapsing.py +1 -1
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/multi_head_attention_decomposition.py +1 -1
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/relu_bound_to_power_of_2.py +3 -2
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/reshape_with_static_shapes.py +16 -2
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/residual_collapsing.py +1 -1
- model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/shift_negative_activation.py +1 -1
- model_compression_toolkit/core/pytorch/kpi_data_facade.py +9 -9
- model_compression_toolkit/core/pytorch/mixed_precision/mixed_precision_wrapper.py +1 -1
- model_compression_toolkit/core/pytorch/pytorch_implementation.py +6 -12
- model_compression_toolkit/core/pytorch/pytorch_node_prior_info.py +1 -1
- model_compression_toolkit/core/pytorch/quantizer/fake_quant_builder.py +2 -2
- model_compression_toolkit/core/pytorch/quantizer/lut_fake_quant.py +1 -1
- model_compression_toolkit/core/pytorch/reader/graph_builders.py +4 -2
- model_compression_toolkit/core/pytorch/statistics_correction/apply_second_moment_correction.py +1 -1
- model_compression_toolkit/core/runner.py +7 -7
- model_compression_toolkit/exporter/__init__.py +5 -0
- model_compression_toolkit/exporter/model_exporter/__init__.py +0 -3
- model_compression_toolkit/exporter/model_exporter/fw_agonstic/exporter.py +1 -1
- model_compression_toolkit/exporter/model_exporter/keras/fakely_quant_keras_exporter.py +1 -1
- model_compression_toolkit/exporter/model_exporter/keras/keras_export_facade.py +2 -2
- model_compression_toolkit/exporter/model_exporter/pytorch/fakely_quant_onnx_pytorch_exporter.py +15 -1
- model_compression_toolkit/exporter/model_exporter/pytorch/fakely_quant_torchscript_pytorch_exporter.py +1 -1
- model_compression_toolkit/exporter/model_exporter/pytorch/pytorch_export_facade.py +2 -2
- model_compression_toolkit/exporter/model_exporter/tflite/fakely_quant_tflite_exporter.py +2 -2
- model_compression_toolkit/exporter/model_exporter/tflite/int8_tflite_exporter.py +1 -1
- model_compression_toolkit/exporter/model_exporter/tflite/tflite_export_facade.py +2 -2
- model_compression_toolkit/exporter/model_wrapper/__init__.py +4 -8
- model_compression_toolkit/exporter/model_wrapper/keras/builder/fully_quantized_model_builder.py +45 -38
- model_compression_toolkit/exporter/model_wrapper/keras/builder/node_to_quantizer.py +43 -26
- model_compression_toolkit/exporter/model_wrapper/keras/validate_layer.py +51 -43
- model_compression_toolkit/exporter/model_wrapper/pytorch/builder/fully_quantized_model_builder.py +43 -35
- model_compression_toolkit/exporter/model_wrapper/pytorch/builder/node_to_quantizer.py +27 -7
- model_compression_toolkit/exporter/model_wrapper/pytorch/validate_layer.py +25 -18
- model_compression_toolkit/gptq/__init__.py +6 -0
- model_compression_toolkit/gptq/common/gptq_config.py +57 -104
- model_compression_toolkit/gptq/common/gptq_constants.py +0 -7
- model_compression_toolkit/gptq/common/gptq_framework_implementation.py +32 -0
- model_compression_toolkit/gptq/common/gptq_graph.py +2 -2
- model_compression_toolkit/gptq/common/gptq_training.py +30 -39
- model_compression_toolkit/gptq/keras/gptq_keras_implementation.py +29 -0
- model_compression_toolkit/gptq/keras/gptq_training.py +15 -32
- model_compression_toolkit/gptq/keras/graph_info.py +8 -33
- model_compression_toolkit/gptq/keras/quantization_facade.py +25 -24
- model_compression_toolkit/gptq/keras/quantizer/__init__.py +1 -0
- model_compression_toolkit/gptq/keras/quantizer/base_keras_gptq_quantizer.py +2 -3
- model_compression_toolkit/gptq/keras/quantizer/quant_utils.py +18 -1
- model_compression_toolkit/gptq/keras/quantizer/quantization_builder.py +2 -2
- model_compression_toolkit/gptq/keras/quantizer/regularization_factory.py +45 -0
- model_compression_toolkit/gptq/keras/quantizer/soft_rounding/soft_quantizer_reg.py +110 -0
- model_compression_toolkit/gptq/keras/quantizer/soft_rounding/symmetric_soft_quantizer.py +40 -137
- model_compression_toolkit/gptq/keras/quantizer/soft_rounding/uniform_soft_quantizer.py +224 -0
- model_compression_toolkit/gptq/keras/quantizer/ste_rounding/symmetric_ste.py +13 -43
- model_compression_toolkit/gptq/pytorch/gptq_pytorch_implementation.py +29 -0
- model_compression_toolkit/gptq/pytorch/gptq_training.py +10 -25
- model_compression_toolkit/gptq/pytorch/graph_info.py +7 -27
- model_compression_toolkit/gptq/pytorch/quantization_facade.py +21 -34
- model_compression_toolkit/gptq/pytorch/quantizer/__init__.py +1 -0
- model_compression_toolkit/gptq/pytorch/quantizer/base_pytorch_gptq_quantizer.py +3 -23
- model_compression_toolkit/gptq/pytorch/quantizer/quant_utils.py +18 -4
- model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py +2 -2
- model_compression_toolkit/gptq/pytorch/quantizer/regularization_factory.py +45 -0
- model_compression_toolkit/gptq/pytorch/quantizer/soft_rounding/soft_quantizer_reg.py +114 -0
- model_compression_toolkit/gptq/pytorch/quantizer/soft_rounding/symmetric_soft_quantizer.py +32 -119
- model_compression_toolkit/gptq/pytorch/quantizer/soft_rounding/uniform_soft_quantizer.py +194 -0
- model_compression_toolkit/gptq/pytorch/quantizer/ste_rounding/symmetric_ste.py +11 -33
- model_compression_toolkit/gptq/runner.py +3 -2
- model_compression_toolkit/{core/keras/quantization_facade.py → legacy/keras_quantization_facade.py} +12 -13
- model_compression_toolkit/{core/pytorch/quantization_facade.py → legacy/pytorch_quantization_facade.py} +11 -12
- model_compression_toolkit/{core/common/logger.py → logger.py} +10 -2
- model_compression_toolkit/ptq/__init__.py +3 -0
- model_compression_toolkit/ptq/keras/quantization_facade.py +11 -12
- model_compression_toolkit/ptq/pytorch/quantization_facade.py +8 -8
- model_compression_toolkit/qat/__init__.py +4 -0
- model_compression_toolkit/qat/common/__init__.py +1 -2
- model_compression_toolkit/qat/common/qat_config.py +3 -1
- model_compression_toolkit/qat/keras/quantization_facade.py +18 -20
- model_compression_toolkit/qat/keras/quantizer/base_keras_qat_quantizer.py +2 -2
- model_compression_toolkit/qat/keras/quantizer/ste_rounding/symmetric_ste.py +43 -48
- model_compression_toolkit/qat/keras/quantizer/ste_rounding/uniform_ste.py +34 -43
- model_compression_toolkit/qat/pytorch/quantization_facade.py +9 -9
- model_compression_toolkit/qat/pytorch/quantizer/base_pytorch_qat_quantizer.py +2 -2
- model_compression_toolkit/qat/pytorch/quantizer/ste_rounding/symmetric_ste.py +25 -24
- model_compression_toolkit/qat/pytorch/quantizer/ste_rounding/uniform_ste.py +32 -31
- model_compression_toolkit/{qat/common → quantizers_infrastructure}/constants.py +2 -1
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/common/base_inferable_quantizer.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/common/get_all_subclasses.py +1 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/common/get_quantizers.py +3 -3
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/load_model.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantize_wrapper.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/__init__.py +4 -0
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/activation_inferable_quantizers/activation_lut_pot_inferable_quantizer.py +3 -3
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/activation_inferable_quantizers/activation_pot_inferable_quantizer.py +3 -3
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/activation_inferable_quantizers/activation_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/activation_inferable_quantizers/activation_uniform_inferable_quantizer.py +3 -3
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/base_keras_inferable_quantizer.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/constants.py +1 -0
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/weights_inferable_quantizers/weights_lut_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/weights_inferable_quantizers/weights_lut_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/weights_inferable_quantizers/weights_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/weights_inferable_quantizers/weights_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/quantizers/weights_inferable_quantizers/weights_uniform_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/keras/validation_functions.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantize_wrapper.py +15 -5
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/__init__.py +6 -0
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/{common → pytorch/quantizers/activation_inferable_quantizers}/activation_lut_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/activation_inferable_quantizers/activation_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/activation_inferable_quantizers/activation_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/activation_inferable_quantizers/activation_uniform_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/base_lut_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/base_pytorch_inferable_quantizer.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/base_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/base_uniform_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/constants.py +3 -0
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/weights_inferable_quantizers/weights_lut_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/weights_inferable_quantizers/weights_lut_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/weights_inferable_quantizers/weights_pot_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/weights_inferable_quantizers/weights_symmetric_inferable_quantizer.py +2 -2
- model_compression_toolkit/quantizers_infrastructure/inferable_infrastructure/pytorch/quantizers/weights_inferable_quantizers/weights_uniform_inferable_quantizer.py +3 -3
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/common/base_trainable_quantizer.py +61 -10
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/common/get_quantizer_config.py +2 -1
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/common/get_quantizers.py +4 -5
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/common/trainable_quantizer_config.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/keras/base_keras_quantizer.py +24 -6
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/keras/config_serialization.py +1 -1
- model_compression_toolkit/quantizers_infrastructure/trainable_infrastructure/pytorch/base_pytorch_quantizer.py +26 -5
- model_compression_toolkit/target_platform_capabilities/constants.py +27 -0
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/__init__.py +5 -5
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/current_tp_model.py +1 -1
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/fusing.py +2 -2
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/operators.py +4 -4
- model_compression_toolkit/target_platform_capabilities/target_platform/quantization_format.py +20 -0
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/target_platform_model.py +16 -7
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/target_platform_model_component.py +1 -1
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/__init__.py +5 -5
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/attribute_filter.py +1 -1
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/layer_filter_params.py +33 -35
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/operations_to_layers.py +4 -4
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/target_platform_capabilities.py +9 -30
- model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/target_platform_capabilities_component.py +1 -1
- model_compression_toolkit/target_platform_capabilities/tpc_models/__init__.py +0 -0
- model_compression_toolkit/target_platform_capabilities/tpc_models/default_tpc/latest/__init__.py +25 -0
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/target_platform_capabilities.py +19 -17
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v1/tp_model.py +7 -1
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v1/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v1/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v2/tp_model.py +7 -1
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v2/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v2/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3/tp_model.py +7 -1
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core/tpc_models/default_tpc/v4_lut → target_platform_capabilities/tpc_models/default_tpc/v3_lut}/tp_model.py +7 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3_lut/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3_lut/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4/tp_model.py +7 -1
- model_compression_toolkit/{core/tpc_models/default_tpc/v5 → target_platform_capabilities/tpc_models/default_tpc/v4}/tpc_keras.py +2 -3
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core/tpc_models/default_tpc/v3_lut → target_platform_capabilities/tpc_models/default_tpc/v4_lut}/tp_model.py +7 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4_lut/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4_lut/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v5/tp_model.py +7 -1
- model_compression_toolkit/{core/tpc_models/default_tpc/v4 → target_platform_capabilities/tpc_models/default_tpc/v5}/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v5/tpc_pytorch.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/get_target_platform_capabilities.py +6 -8
- model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/__init__.py +14 -0
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/latest/__init__.py +6 -6
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/target_platform_capabilities.py +6 -5
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/v1/tp_model.py +7 -1
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/v1/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/v1/tpc_pytorch.py +2 -2
- model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/latest/__init__.py +22 -0
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/target_platform_capabilities.py +6 -5
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/v1/tp_model.py +7 -1
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/v1/tpc_keras.py +2 -2
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/v1/tpc_pytorch.py +2 -2
- model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/latest/__init__.py +22 -0
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/target_platform_capabilities.py +6 -5
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/v1/tp_model.py +26 -18
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/v1/tpc_keras.py +3 -3
- model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/v1/tpc_pytorch.py +3 -3
- model_compression_toolkit/core/tpc_models/default_tpc/latest/__init__.py +0 -25
- model_compression_toolkit/core/tpc_models/qnnpack_tpc/latest/__init__.py +0 -22
- model_compression_toolkit/core/tpc_models/tflite_tpc/latest/__init__.py +0 -22
- model_compression_toolkit/gptq/common/gptq_quantizer_config.py +0 -93
- {mct_nightly-1.8.0.8032023.post421.dist-info → mct_nightly-1.8.0.8052023.post414.dist-info}/LICENSE.md +0 -0
- {mct_nightly-1.8.0.8032023.post421.dist-info → mct_nightly-1.8.0.8052023.post414.dist-info}/top_level.txt +0 -0
- /model_compression_toolkit/{core/tpc_models/imx500_tpc → legacy}/__init__.py +0 -0
- /model_compression_toolkit/{core/tpc_models → target_platform_capabilities}/__init__.py +0 -0
- /model_compression_toolkit/{core/common → target_platform_capabilities}/immutable.py +0 -0
- /model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/op_quantization_config.py +0 -0
- /model_compression_toolkit/{core/common → target_platform_capabilities}/target_platform/targetplatform2framework/current_tpc.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v1/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v2/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v3_lut/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v4_lut/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/default_tpc/v5/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/imx500_tpc/v1/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/qnnpack_tpc/v1/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/__init__.py +0 -0
- /model_compression_toolkit/{core → target_platform_capabilities}/tpc_models/tflite_tpc/v1/__init__.py +0 -0
|
@@ -13,18 +13,20 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
|
|
16
|
-
from typing import
|
|
16
|
+
from typing import Union
|
|
17
17
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
import tensorflow as tf
|
|
20
20
|
from tensorflow.python.framework.tensor_shape import TensorShape
|
|
21
|
-
from model_compression_toolkit.
|
|
21
|
+
from model_compression_toolkit.constants import SIGNED
|
|
22
|
+
from model_compression_toolkit.quantizers_infrastructure.constants import FQ_MIN, FQ_MAX
|
|
22
23
|
|
|
23
|
-
from model_compression_toolkit.
|
|
24
|
+
from model_compression_toolkit.qat import TrainingMethod
|
|
25
|
+
|
|
26
|
+
from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod
|
|
24
27
|
from model_compression_toolkit.qat.common import THRESHOLD_TENSOR
|
|
25
|
-
from model_compression_toolkit
|
|
26
|
-
|
|
27
|
-
from model_compression_toolkit.core.common import constants as C
|
|
28
|
+
from model_compression_toolkit import quantizers_infrastructure as qi, constants as C
|
|
29
|
+
|
|
28
30
|
from model_compression_toolkit.qat.keras.quantizer.base_keras_qat_quantizer import BaseKerasQATTrainableQuantizer
|
|
29
31
|
from model_compression_toolkit.quantizers_infrastructure import TrainableQuantizerWeightsConfig, \
|
|
30
32
|
TrainableQuantizerActivationConfig
|
|
@@ -32,6 +34,7 @@ from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructur
|
|
|
32
34
|
from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructure.keras.quantizers import \
|
|
33
35
|
WeightsPOTInferableQuantizer, WeightsSymmetricInferableQuantizer, ActivationPOTInferableQuantizer, \
|
|
34
36
|
ActivationSymmetricInferableQuantizer
|
|
37
|
+
from model_compression_toolkit.quantizers_infrastructure.trainable_infrastructure.common.base_trainable_quantizer import VariableGroup
|
|
35
38
|
|
|
36
39
|
|
|
37
40
|
@mark_quantizer(quantization_target=qi.QuantizationTarget.Weights,
|
|
@@ -52,11 +55,11 @@ class STEWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
52
55
|
"""
|
|
53
56
|
super().__init__(quantization_config)
|
|
54
57
|
self.power_of_two = quantization_config.weights_quantization_method == QuantizationMethod.POWER_OF_TWO
|
|
55
|
-
self.threshold_values = quantization_config.weights_quantization_params[C.THRESHOLD]
|
|
58
|
+
self.threshold_values = np.array(quantization_config.weights_quantization_params[C.THRESHOLD])
|
|
56
59
|
self.threshold_shape = np.asarray(self.threshold_values).shape
|
|
57
60
|
self.per_channel = self.quantization_config.weights_per_channel_threshold
|
|
58
61
|
self.channel_axis = self.quantization_config.weights_channels_axis
|
|
59
|
-
self.np_threshold_values = np.reshape(np.asarray(self.threshold_values),[-1]) if self.
|
|
62
|
+
self.np_threshold_values = np.reshape(np.asarray(self.threshold_values),[-1]) if self.per_channel else float(self.threshold_values)
|
|
60
63
|
|
|
61
64
|
if self.per_channel and self.channel_axis not in [-1, len(self.threshold_shape) - 1]:
|
|
62
65
|
# Tensorflow's fake_quant_with_min_max_vars_per_channel only works on last axis, so
|
|
@@ -76,48 +79,45 @@ class STEWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
76
79
|
max_int = (2 ** (self.num_bits - int(C.WEIGHTS_SIGNED))) - 1
|
|
77
80
|
self.min = delta * min_int
|
|
78
81
|
self.max = delta * max_int
|
|
79
|
-
|
|
82
|
+
|
|
80
83
|
|
|
81
84
|
def initialize_quantization(self,
|
|
82
85
|
tensor_shape: TensorShape,
|
|
83
86
|
name: str,
|
|
84
|
-
layer: qi.KerasQuantizationWrapper)
|
|
87
|
+
layer: qi.KerasQuantizationWrapper):
|
|
85
88
|
"""
|
|
86
|
-
Add
|
|
87
|
-
Args:
|
|
88
|
-
tensor_shape: Tensor shape the quantizer quantize.
|
|
89
|
-
name: Prefix of variables names.
|
|
90
|
-
layer: Layer to add the variables to. The variables are saved
|
|
91
|
-
in the layer's scope.
|
|
89
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
Args:
|
|
92
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
93
|
+
name: Tensor name.
|
|
94
|
+
layer: Layer to quantize.
|
|
95
95
|
"""
|
|
96
96
|
ptq_threshold_tensor = layer.add_weight(
|
|
97
97
|
name + THRESHOLD_TENSOR,
|
|
98
|
-
shape=len(self.np_threshold_values) if self.
|
|
98
|
+
shape=len(self.np_threshold_values) if self.per_channel else (),
|
|
99
99
|
initializer=tf.keras.initializers.Constant(1.0),
|
|
100
100
|
trainable=False)
|
|
101
101
|
ptq_threshold_tensor.assign(self.np_threshold_values)
|
|
102
102
|
|
|
103
103
|
fq_min = layer.add_weight(
|
|
104
104
|
name + FQ_MIN,
|
|
105
|
-
shape=len(self.min) if self.
|
|
105
|
+
shape=len(self.min) if self.per_channel else (),
|
|
106
106
|
initializer=tf.keras.initializers.Constant(-1.0),
|
|
107
107
|
trainable=False)
|
|
108
108
|
fq_min.assign(self.min)
|
|
109
109
|
|
|
110
110
|
fq_max = layer.add_weight(
|
|
111
111
|
name + FQ_MAX,
|
|
112
|
-
shape=len(self.max) if self.
|
|
112
|
+
shape=len(self.max) if self.per_channel else (),
|
|
113
113
|
initializer=tf.keras.initializers.Constant(1.0),
|
|
114
114
|
trainable=False)
|
|
115
115
|
fq_max.assign(self.max)
|
|
116
116
|
|
|
117
117
|
# save the quantizer added parameters for later calculations
|
|
118
|
-
self.
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
self.add_quantizer_variable(THRESHOLD_TENSOR, ptq_threshold_tensor, VariableGroup.QPARAMS)
|
|
119
|
+
self.add_quantizer_variable(FQ_MIN, fq_min, VariableGroup.QPARAMS)
|
|
120
|
+
self.add_quantizer_variable(FQ_MAX, fq_max, VariableGroup.QPARAMS)
|
|
121
121
|
|
|
122
122
|
def __call__(self,
|
|
123
123
|
inputs: tf.Tensor,
|
|
@@ -134,9 +134,9 @@ class STEWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
134
134
|
The quantized tensor.
|
|
135
135
|
"""
|
|
136
136
|
|
|
137
|
-
_min = self.
|
|
138
|
-
_max = self.
|
|
139
|
-
if self.
|
|
137
|
+
_min = self.get_quantizer_variable(FQ_MIN)
|
|
138
|
+
_max = self.get_quantizer_variable(FQ_MAX)
|
|
139
|
+
if self.per_channel:
|
|
140
140
|
if self.perm_vec:
|
|
141
141
|
inputs = tf.transpose(inputs, perm=self.perm_vec)
|
|
142
142
|
q_tensor = tf.quantization.fake_quant_with_min_max_vars_per_channel(inputs, _min, _max,
|
|
@@ -157,7 +157,7 @@ class STEWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
157
157
|
BaseKerasInferableQuantizer object.
|
|
158
158
|
"""
|
|
159
159
|
if self.power_of_two:
|
|
160
|
-
pot_threshold = 2 ** np.ceil(np.log2(self.
|
|
160
|
+
pot_threshold = 2 ** np.ceil(np.log2(self.get_quantizer_variable(THRESHOLD_TENSOR)))
|
|
161
161
|
return WeightsPOTInferableQuantizer(num_bits=self.num_bits,
|
|
162
162
|
threshold=list(pot_threshold.flatten()),
|
|
163
163
|
per_channel=self.per_channel,
|
|
@@ -165,8 +165,7 @@ class STEWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
165
165
|
input_rank=len(self.threshold_shape))
|
|
166
166
|
else:
|
|
167
167
|
return WeightsSymmetricInferableQuantizer(num_bits=self.num_bits,
|
|
168
|
-
threshold=list(self.
|
|
169
|
-
THRESHOLD_TENSOR].numpy().flatten()),
|
|
168
|
+
threshold=list(self.get_quantizer_variable(THRESHOLD_TENSOR).numpy().flatten()),
|
|
170
169
|
per_channel=self.per_channel,
|
|
171
170
|
channel_axis=self.channel_axis,
|
|
172
171
|
input_rank=len(self.threshold_shape))
|
|
@@ -203,22 +202,18 @@ class STEActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
203
202
|
max_int = (2 ** (self.num_bits - int(self.signed))) - 1
|
|
204
203
|
self.min = delta * min_int
|
|
205
204
|
self.max = delta * max_int
|
|
206
|
-
self.quantizer_parameters = {}
|
|
207
205
|
|
|
208
206
|
def initialize_quantization(self,
|
|
209
207
|
tensor_shape: TensorShape,
|
|
210
208
|
name: str,
|
|
211
|
-
layer: qi.KerasQuantizationWrapper)
|
|
209
|
+
layer: qi.KerasQuantizationWrapper):
|
|
212
210
|
"""
|
|
213
|
-
Add
|
|
214
|
-
Args:
|
|
215
|
-
tensor_shape: Tensor shape the quantizer quantize.
|
|
216
|
-
name: Prefix of variables names.
|
|
217
|
-
layer: Layer to add the variables to. The variables are saved
|
|
218
|
-
in the layer's scope.
|
|
211
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
219
212
|
|
|
220
|
-
|
|
221
|
-
|
|
213
|
+
Args:
|
|
214
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
215
|
+
name: Tensor name.
|
|
216
|
+
layer: Layer to quantize.
|
|
222
217
|
"""
|
|
223
218
|
ptq_threshold_tensor = layer.add_weight(
|
|
224
219
|
name + THRESHOLD_TENSOR,
|
|
@@ -242,9 +237,10 @@ class STEActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
242
237
|
fq_max.assign(self.max)
|
|
243
238
|
|
|
244
239
|
# save the quantizer added parameters for later calculations
|
|
245
|
-
self.
|
|
246
|
-
|
|
247
|
-
|
|
240
|
+
self.add_quantizer_variable(THRESHOLD_TENSOR, ptq_threshold_tensor, VariableGroup.QPARAMS)
|
|
241
|
+
self.add_quantizer_variable(FQ_MIN, fq_min, VariableGroup.QPARAMS)
|
|
242
|
+
self.add_quantizer_variable(FQ_MAX, fq_max, VariableGroup.QPARAMS)
|
|
243
|
+
|
|
248
244
|
|
|
249
245
|
def __call__(self,
|
|
250
246
|
inputs: tf.Tensor,
|
|
@@ -259,8 +255,8 @@ class STEActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
259
255
|
The quantized tensor.
|
|
260
256
|
"""
|
|
261
257
|
|
|
262
|
-
_min = self.
|
|
263
|
-
_max = self.
|
|
258
|
+
_min = self.get_quantizer_variable(FQ_MIN)
|
|
259
|
+
_max = self.get_quantizer_variable(FQ_MAX)
|
|
264
260
|
q_tensor = tf.quantization.fake_quant_with_min_max_vars(inputs, _min, _max,
|
|
265
261
|
num_bits=self.num_bits)
|
|
266
262
|
|
|
@@ -275,7 +271,7 @@ class STEActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
275
271
|
"""
|
|
276
272
|
|
|
277
273
|
if self.power_of_two:
|
|
278
|
-
pot_threshold = 2 ** np.ceil(np.log2(self.
|
|
274
|
+
pot_threshold = 2 ** np.ceil(np.log2(self.get_quantizer_variable(THRESHOLD_TENSOR)))
|
|
279
275
|
return ActivationPOTInferableQuantizer(num_bits=self.num_bits,
|
|
280
276
|
# In activation quantization is per-tensor only - thus we pass
|
|
281
277
|
# the threshold as a list with a len of 1
|
|
@@ -285,6 +281,5 @@ class STEActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
285
281
|
return ActivationSymmetricInferableQuantizer(num_bits=self.num_bits,
|
|
286
282
|
# In activation quantization is per-tensor only - thus we
|
|
287
283
|
# pass the threshold as a list with a len of 1
|
|
288
|
-
threshold=[
|
|
289
|
-
self.quantizer_parameters[THRESHOLD_TENSOR].numpy()],
|
|
284
|
+
threshold=[self.get_quantizer_variable(THRESHOLD_TENSOR).numpy()],
|
|
290
285
|
signed=self.signed)
|
|
@@ -12,19 +12,18 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
|
|
16
|
-
from typing import Dict
|
|
17
|
-
|
|
18
15
|
import numpy as np
|
|
19
16
|
import tensorflow as tf
|
|
20
17
|
from tensorflow.python.framework.tensor_shape import TensorShape
|
|
21
|
-
from model_compression_toolkit.
|
|
22
|
-
from model_compression_toolkit.
|
|
23
|
-
from model_compression_toolkit.qat
|
|
18
|
+
from model_compression_toolkit.constants import RANGE_MIN, RANGE_MAX
|
|
19
|
+
from model_compression_toolkit.quantizers_infrastructure.constants import FQ_MIN, FQ_MAX
|
|
20
|
+
from model_compression_toolkit.qat import TrainingMethod
|
|
21
|
+
from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod
|
|
22
|
+
|
|
24
23
|
from model_compression_toolkit.qat.keras.quantizer.quant_utils import adjust_range_to_include_zero
|
|
25
24
|
from model_compression_toolkit.core.common.quantization.quantizers.quantizers_helpers import fix_range_to_include_zero
|
|
26
|
-
from model_compression_toolkit import quantizers_infrastructure as qi,
|
|
27
|
-
|
|
25
|
+
from model_compression_toolkit import quantizers_infrastructure as qi, constants as C
|
|
26
|
+
|
|
28
27
|
from model_compression_toolkit.qat.keras.quantizer.base_keras_qat_quantizer import BaseKerasQATTrainableQuantizer
|
|
29
28
|
from model_compression_toolkit.quantizers_infrastructure import TrainableQuantizerWeightsConfig, \
|
|
30
29
|
TrainableQuantizerActivationConfig
|
|
@@ -32,6 +31,7 @@ from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructur
|
|
|
32
31
|
mark_quantizer
|
|
33
32
|
from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructure.keras.quantizers import \
|
|
34
33
|
BaseKerasInferableQuantizer, WeightsUniformInferableQuantizer, ActivationUniformInferableQuantizer
|
|
34
|
+
from model_compression_toolkit.quantizers_infrastructure.trainable_infrastructure.common.base_trainable_quantizer import VariableGroup
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
@mark_quantizer(quantization_target=qi.QuantizationTarget.Weights,
|
|
@@ -52,8 +52,8 @@ class STEUniformWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
52
52
|
|
|
53
53
|
"""
|
|
54
54
|
super().__init__(quantization_config)
|
|
55
|
-
self.max_values = quantization_config.weights_quantization_params[RANGE_MAX]
|
|
56
|
-
self.min_values = quantization_config.weights_quantization_params[RANGE_MIN]
|
|
55
|
+
self.max_values = np.array(quantization_config.weights_quantization_params[RANGE_MAX])
|
|
56
|
+
self.min_values = np.array(quantization_config.weights_quantization_params[RANGE_MIN])
|
|
57
57
|
self.num_bits = self.quantization_config.weights_n_bits
|
|
58
58
|
self.per_channel = self.quantization_config.weights_per_channel_threshold
|
|
59
59
|
self.channel_axis = self.quantization_config.weights_channels_axis
|
|
@@ -70,22 +70,17 @@ class STEUniformWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
70
70
|
else:
|
|
71
71
|
self.perm_vec = None
|
|
72
72
|
|
|
73
|
-
self.quantizer_parameters = {}
|
|
74
|
-
|
|
75
73
|
def initialize_quantization(self,
|
|
76
74
|
tensor_shape: TensorShape,
|
|
77
75
|
name: str,
|
|
78
|
-
layer: qi.KerasQuantizationWrapper)
|
|
76
|
+
layer: qi.KerasQuantizationWrapper):
|
|
79
77
|
"""
|
|
80
|
-
Add
|
|
81
|
-
Args:
|
|
82
|
-
tensor_shape: Tensor shape the quantizer quantize.
|
|
83
|
-
name: Prefix of variables names.
|
|
84
|
-
layer: Layer to add the variables to. The variables are saved
|
|
85
|
-
in the layer's scope.
|
|
78
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
86
79
|
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
Args:
|
|
81
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
82
|
+
name: Tensor name.
|
|
83
|
+
layer: Layer to quantize.
|
|
89
84
|
"""
|
|
90
85
|
fq_min = layer.add_weight(
|
|
91
86
|
name + FQ_MIN,
|
|
@@ -102,8 +97,8 @@ class STEUniformWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
102
97
|
fq_max.assign(self.max)
|
|
103
98
|
|
|
104
99
|
# save the quantizer added parameters for later calculations
|
|
105
|
-
self.
|
|
106
|
-
|
|
100
|
+
self.add_quantizer_variable(FQ_MIN, fq_min, VariableGroup.QPARAMS)
|
|
101
|
+
self.add_quantizer_variable(FQ_MAX, fq_max, VariableGroup.QPARAMS)
|
|
107
102
|
|
|
108
103
|
def __call__(self, inputs: tf.Tensor,
|
|
109
104
|
training: bool):
|
|
@@ -117,8 +112,8 @@ class STEUniformWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
117
112
|
The quantized tensor.
|
|
118
113
|
"""
|
|
119
114
|
|
|
120
|
-
_min = self.
|
|
121
|
-
_max = self.
|
|
115
|
+
_min = self.get_quantizer_variable(FQ_MIN)
|
|
116
|
+
_max = self.get_quantizer_variable(FQ_MAX)
|
|
122
117
|
_min, _max = adjust_range_to_include_zero(_min, _max, self.num_bits)
|
|
123
118
|
|
|
124
119
|
if self.per_channel:
|
|
@@ -142,8 +137,8 @@ class STEUniformWeightQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
142
137
|
Returns:
|
|
143
138
|
BaseKerasInferableQuantizer object.
|
|
144
139
|
"""
|
|
145
|
-
min_range, max_range = fix_range_to_include_zero(self.
|
|
146
|
-
self.
|
|
140
|
+
min_range, max_range = fix_range_to_include_zero(self.get_quantizer_variable(FQ_MIN).numpy(),
|
|
141
|
+
self.get_quantizer_variable(FQ_MAX).numpy(),
|
|
147
142
|
self.num_bits)
|
|
148
143
|
return WeightsUniformInferableQuantizer(num_bits=self.num_bits,
|
|
149
144
|
min_range=list(min_range.flatten()),
|
|
@@ -174,22 +169,18 @@ class STEUniformActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
174
169
|
self.num_bits = quantization_config.activation_n_bits
|
|
175
170
|
self.min_range = quantization_config.activation_quantization_params[C.RANGE_MIN]
|
|
176
171
|
self.max_range = quantization_config.activation_quantization_params[C.RANGE_MAX]
|
|
177
|
-
self.quantizer_parameters = {}
|
|
178
172
|
|
|
179
173
|
def initialize_quantization(self,
|
|
180
174
|
tensor_shape: TensorShape,
|
|
181
175
|
name: str,
|
|
182
|
-
layer: qi.KerasQuantizationWrapper)
|
|
176
|
+
layer: qi.KerasQuantizationWrapper):
|
|
183
177
|
"""
|
|
184
|
-
Add
|
|
185
|
-
Args:
|
|
186
|
-
tensor_shape: Tensor shape the quantizer quantize.
|
|
187
|
-
name: Prefix of variables names.
|
|
188
|
-
layer: Layer to add the variables to. The variables are saved
|
|
189
|
-
in the layer's scope.
|
|
178
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
190
179
|
|
|
191
|
-
|
|
192
|
-
|
|
180
|
+
Args:
|
|
181
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
182
|
+
name: Tensor name.
|
|
183
|
+
layer: Layer to quantize.
|
|
193
184
|
"""
|
|
194
185
|
fq_min = layer.add_weight(
|
|
195
186
|
name + FQ_MIN,
|
|
@@ -206,8 +197,8 @@ class STEUniformActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
206
197
|
fq_max.assign(self.max_range)
|
|
207
198
|
|
|
208
199
|
# save the quantizer added parameters for later calculations
|
|
209
|
-
self.
|
|
210
|
-
|
|
200
|
+
self.add_quantizer_variable(FQ_MIN, fq_min, VariableGroup.QPARAMS)
|
|
201
|
+
self.add_quantizer_variable(FQ_MAX, fq_max, VariableGroup.QPARAMS)
|
|
211
202
|
|
|
212
203
|
def __call__(self,
|
|
213
204
|
inputs: tf.Tensor,
|
|
@@ -222,8 +213,8 @@ class STEUniformActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
222
213
|
The quantized tensor.
|
|
223
214
|
"""
|
|
224
215
|
|
|
225
|
-
_min = self.
|
|
226
|
-
_max = self.
|
|
216
|
+
_min = self.get_quantizer_variable(FQ_MIN)
|
|
217
|
+
_max = self.get_quantizer_variable(FQ_MAX)
|
|
227
218
|
_min, _max = adjust_range_to_include_zero(_min, _max, self.num_bits)
|
|
228
219
|
q_tensor = tf.quantization.fake_quant_with_min_max_vars(inputs, _min, _max,
|
|
229
220
|
num_bits=self.num_bits)
|
|
@@ -237,8 +228,8 @@ class STEUniformActivationQATQuantizer(BaseKerasQATTrainableQuantizer):
|
|
|
237
228
|
Returns:
|
|
238
229
|
BaseKerasInferableQuantizer object.
|
|
239
230
|
"""
|
|
240
|
-
min_range, max_range = fix_range_to_include_zero(self.
|
|
241
|
-
self.
|
|
231
|
+
min_range, max_range = fix_range_to_include_zero(self.get_quantizer_variable(FQ_MIN).numpy(),
|
|
232
|
+
self.get_quantizer_variable(FQ_MAX).numpy(),
|
|
242
233
|
self.num_bits)
|
|
243
234
|
return ActivationUniformInferableQuantizer(num_bits=self.num_bits,
|
|
244
235
|
# In activation quantization is per-tensor only - thus we pass
|
|
@@ -16,16 +16,16 @@ import copy
|
|
|
16
16
|
from typing import Callable
|
|
17
17
|
from functools import partial
|
|
18
18
|
|
|
19
|
-
from model_compression_toolkit.
|
|
19
|
+
from model_compression_toolkit.constants import FOUND_TORCH, PYTORCH
|
|
20
20
|
|
|
21
|
-
from model_compression_toolkit import CoreConfig
|
|
21
|
+
from model_compression_toolkit.core import CoreConfig
|
|
22
22
|
from model_compression_toolkit.core import common
|
|
23
|
-
from model_compression_toolkit.
|
|
23
|
+
from model_compression_toolkit.logger import Logger
|
|
24
24
|
from model_compression_toolkit.core.common.framework_info import FrameworkInfo
|
|
25
25
|
from model_compression_toolkit.core.common.mixed_precision.kpi_tools.kpi import KPI
|
|
26
26
|
from model_compression_toolkit.core.common.mixed_precision.mixed_precision_quantization_config import \
|
|
27
27
|
MixedPrecisionQuantizationConfigV2
|
|
28
|
-
from model_compression_toolkit.
|
|
28
|
+
from model_compression_toolkit.target_platform_capabilities.target_platform.targetplatform2framework import TargetPlatformCapabilities
|
|
29
29
|
from model_compression_toolkit.core.runner import core_runner, _init_tensorboard_writer
|
|
30
30
|
from model_compression_toolkit.ptq.runner import ptq_runner
|
|
31
31
|
|
|
@@ -34,7 +34,7 @@ if FOUND_TORCH:
|
|
|
34
34
|
import torch.nn as nn
|
|
35
35
|
from torch.nn import Module
|
|
36
36
|
from model_compression_toolkit.core.pytorch.default_framework_info import DEFAULT_PYTORCH_INFO
|
|
37
|
-
from model_compression_toolkit.
|
|
37
|
+
from model_compression_toolkit.target_platform_capabilities.constants import DEFAULT_TP_MODEL
|
|
38
38
|
from model_compression_toolkit.core.pytorch.pytorch_implementation import PytorchImplementation
|
|
39
39
|
from model_compression_toolkit.qat.common.qat_config import _is_qat_applicable
|
|
40
40
|
from model_compression_toolkit.core.pytorch.back2framework.pytorch_model_builder import PyTorchModelBuilder
|
|
@@ -121,7 +121,7 @@ if FOUND_TORCH:
|
|
|
121
121
|
|
|
122
122
|
Create a MCT core config, containing the quantization configuration:
|
|
123
123
|
|
|
124
|
-
>>> config = mct.CoreConfig()
|
|
124
|
+
>>> config = mct.core.CoreConfig()
|
|
125
125
|
|
|
126
126
|
Pass the model, the representative dataset generator, the configuration and the target KPI to get a
|
|
127
127
|
quantized model. Now the model contains quantizer wrappers for fine tunning the weights:
|
|
@@ -134,11 +134,11 @@ if FOUND_TORCH:
|
|
|
134
134
|
|
|
135
135
|
if core_config.mixed_precision_enable:
|
|
136
136
|
if not isinstance(core_config.mixed_precision_config, MixedPrecisionQuantizationConfigV2):
|
|
137
|
-
|
|
137
|
+
Logger.error("Given quantization config to mixed-precision facade is not of type "
|
|
138
138
|
"MixedPrecisionQuantizationConfigV2. Please use pytorch_post_training_quantization API,"
|
|
139
139
|
"or pass a valid mixed precision configuration.")
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
Logger.info("Using experimental mixed-precision quantization. "
|
|
142
142
|
"If you encounter an issue please file a bug.")
|
|
143
143
|
|
|
144
144
|
tb_w = _init_tensorboard_writer(fw_info)
|
|
@@ -193,7 +193,7 @@ if FOUND_TORCH:
|
|
|
193
193
|
|
|
194
194
|
Create a MCT core config, containing the quantization configuration:
|
|
195
195
|
|
|
196
|
-
>>> config = mct.CoreConfig()
|
|
196
|
+
>>> config = mct.core.CoreConfig()
|
|
197
197
|
|
|
198
198
|
Pass the model, the representative dataset generator, the configuration and the target KPI to get a
|
|
199
199
|
quantized model:
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
from typing import Union
|
|
16
16
|
|
|
17
|
-
from model_compression_toolkit.
|
|
18
|
-
from model_compression_toolkit.
|
|
17
|
+
from model_compression_toolkit.logger import Logger
|
|
18
|
+
from model_compression_toolkit.constants import FOUND_TORCH
|
|
19
19
|
|
|
20
20
|
from model_compression_toolkit.quantizers_infrastructure import TrainableQuantizerWeightsConfig, \
|
|
21
21
|
TrainableQuantizerActivationConfig
|
|
@@ -12,18 +12,19 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
from typing import
|
|
15
|
+
from typing import Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import torch
|
|
19
19
|
import torch.nn as nn
|
|
20
20
|
|
|
21
|
-
from model_compression_toolkit.
|
|
21
|
+
from model_compression_toolkit.qat import TrainingMethod
|
|
22
|
+
from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod
|
|
22
23
|
from model_compression_toolkit.qat.common import THRESHOLD_TENSOR
|
|
23
|
-
from model_compression_toolkit import quantizers_infrastructure as qi,
|
|
24
|
+
from model_compression_toolkit import quantizers_infrastructure as qi, constants as C
|
|
24
25
|
from model_compression_toolkit.qat.pytorch.quantizer.base_pytorch_qat_quantizer import BasePytorchQATTrainableQuantizer
|
|
25
26
|
from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructure.common.base_inferable_quantizer import mark_quantizer
|
|
26
|
-
|
|
27
|
+
|
|
27
28
|
from model_compression_toolkit.core.pytorch.utils import to_torch_tensor
|
|
28
29
|
from model_compression_toolkit.qat.pytorch.quantizer.quantizer_utils import ste_round, ste_clip, symmetric_quantizer
|
|
29
30
|
from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructure.pytorch.quantizers import \
|
|
@@ -31,6 +32,7 @@ from model_compression_toolkit.quantizers_infrastructure.inferable_infrastructur
|
|
|
31
32
|
ActivationSymmetricInferableQuantizer
|
|
32
33
|
from model_compression_toolkit.quantizers_infrastructure.trainable_infrastructure.common.trainable_quantizer_config import \
|
|
33
34
|
TrainableQuantizerWeightsConfig, TrainableQuantizerActivationConfig
|
|
35
|
+
from model_compression_toolkit.quantizers_infrastructure.trainable_infrastructure.common.base_trainable_quantizer import VariableGroup
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
@mark_quantizer(quantization_target=qi.QuantizationTarget.Weights,
|
|
@@ -66,22 +68,19 @@ class STEWeightQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
66
68
|
self.max_int = (2 ** n_pos_bits) - 1
|
|
67
69
|
self.min = delta * self.min_int
|
|
68
70
|
self.max = delta * self.max_int
|
|
69
|
-
|
|
71
|
+
|
|
70
72
|
|
|
71
73
|
def initialize_quantization(self,
|
|
72
74
|
tensor_shape: torch.Size,
|
|
73
75
|
name: str,
|
|
74
|
-
layer: qi.PytorchQuantizationWrapper)
|
|
76
|
+
layer: qi.PytorchQuantizationWrapper):
|
|
75
77
|
"""
|
|
76
|
-
Add
|
|
77
|
-
Args:
|
|
78
|
-
tensor_shape: Tensor shape the quantizer quantize.
|
|
79
|
-
name: Prefix of variables names.
|
|
80
|
-
layer: Layer to add the variables to. The variables are saved
|
|
81
|
-
in the layer's scope.
|
|
78
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
82
79
|
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
Args:
|
|
81
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
82
|
+
name: Tensor name.
|
|
83
|
+
layer: Layer to quantize.
|
|
85
84
|
"""
|
|
86
85
|
|
|
87
86
|
# Add threshold variables to layer.
|
|
@@ -89,9 +88,8 @@ class STEWeightQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
89
88
|
requires_grad=False))
|
|
90
89
|
|
|
91
90
|
# save the quantizer added parameters for later calculations
|
|
92
|
-
self.
|
|
91
|
+
self.add_quantizer_variable(THRESHOLD_TENSOR, layer.get_parameter(name + "_" + THRESHOLD_TENSOR), VariableGroup.QPARAMS)
|
|
93
92
|
|
|
94
|
-
return self.quantizer_parameters
|
|
95
93
|
|
|
96
94
|
def __call__(self,
|
|
97
95
|
inputs: nn.Parameter,
|
|
@@ -116,7 +114,7 @@ class STEWeightQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
116
114
|
Returns:
|
|
117
115
|
A pytorch inferable quanizer object.
|
|
118
116
|
"""
|
|
119
|
-
np_threshold = self.
|
|
117
|
+
np_threshold = self.get_quantizer_variable(THRESHOLD_TENSOR).cpu().detach().numpy().flatten()
|
|
120
118
|
if self.power_of_two:
|
|
121
119
|
pot_threshold = 2 ** np.ceil(np.log2(np_threshold))
|
|
122
120
|
return WeightsPOTInferableQuantizer(num_bits=self.num_bits,
|
|
@@ -153,20 +151,23 @@ class STEActivationQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
153
151
|
np_threshold_values = quantization_config.activation_quantization_params[C.THRESHOLD]
|
|
154
152
|
self.threshold_tensor = torch.Tensor([np_threshold_values])
|
|
155
153
|
self.num_bits = quantization_config.activation_n_bits
|
|
156
|
-
self.quantizer_parameters = {}
|
|
157
154
|
|
|
158
155
|
def initialize_quantization(self,
|
|
159
156
|
tensor_shape: torch.Size,
|
|
160
157
|
name: str,
|
|
161
|
-
layer: qi.PytorchQuantizationWrapper)
|
|
158
|
+
layer: qi.PytorchQuantizationWrapper):
|
|
162
159
|
"""
|
|
163
|
-
Add
|
|
160
|
+
Add quantizer parameters to the quantizer parameters dictionary
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
tensor_shape: tensor shape of the quantized tensor.
|
|
164
|
+
name: Tensor name.
|
|
165
|
+
layer: Layer to quantize.
|
|
164
166
|
"""
|
|
165
167
|
layer.register_parameter(name, nn.Parameter(to_torch_tensor(self.threshold_tensor), requires_grad=True))
|
|
166
168
|
|
|
167
169
|
# save the quantizer added parameters for later calculations
|
|
168
|
-
self.
|
|
169
|
-
return self.quantizer_parameters
|
|
170
|
+
self.add_quantizer_variable(THRESHOLD_TENSOR, layer.get_parameter(name), VariableGroup.QPARAMS)
|
|
170
171
|
|
|
171
172
|
def __call__(self,
|
|
172
173
|
inputs: torch.Tensor,
|
|
@@ -181,7 +182,7 @@ class STEActivationQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
181
182
|
The quantized tensor.
|
|
182
183
|
"""
|
|
183
184
|
|
|
184
|
-
_t = self.
|
|
185
|
+
_t = self.get_quantizer_variable(THRESHOLD_TENSOR)
|
|
185
186
|
q_tensor = symmetric_quantizer(inputs, _t, self.num_bits, sign=self.sign)
|
|
186
187
|
return q_tensor
|
|
187
188
|
|
|
@@ -192,7 +193,7 @@ class STEActivationQATQuantizer(BasePytorchQATTrainableQuantizer):
|
|
|
192
193
|
Returns:
|
|
193
194
|
A pytorch inferable quanizer object.
|
|
194
195
|
"""
|
|
195
|
-
np_threshold = self.
|
|
196
|
+
np_threshold = self.get_quantizer_variable(THRESHOLD_TENSOR).cpu().detach().numpy()
|
|
196
197
|
if self.power_of_two:
|
|
197
198
|
pot_threshold = np.power(2.0, np.ceil(np.log2(np_threshold)))
|
|
198
199
|
return ActivationPOTInferableQuantizer(num_bits=self.num_bits,
|