mct-nightly 2.4.0.20250924.535__py3-none-any.whl → 2.4.2.20250926.532__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.
Files changed (169) hide show
  1. {mct_nightly-2.4.0.20250924.535.dist-info → mct_nightly-2.4.2.20250926.532.dist-info}/METADATA +6 -3
  2. {mct_nightly-2.4.0.20250924.535.dist-info → mct_nightly-2.4.2.20250926.532.dist-info}/RECORD +165 -159
  3. model_compression_toolkit/__init__.py +1 -1
  4. model_compression_toolkit/core/analyzer.py +5 -2
  5. model_compression_toolkit/core/common/back2framework/base_model_builder.py +4 -0
  6. model_compression_toolkit/core/common/collectors/base_collector.py +1 -4
  7. model_compression_toolkit/core/common/collectors/mean_collector.py +4 -7
  8. model_compression_toolkit/core/common/collectors/min_max_per_channel_collector.py +4 -7
  9. model_compression_toolkit/core/common/framework_implementation.py +22 -10
  10. model_compression_toolkit/core/common/framework_info.py +83 -93
  11. model_compression_toolkit/core/common/fusion/graph_fuser.py +9 -12
  12. model_compression_toolkit/core/common/graph/base_graph.py +72 -45
  13. model_compression_toolkit/core/common/graph/base_node.py +141 -121
  14. model_compression_toolkit/core/common/graph/functional_node.py +2 -19
  15. model_compression_toolkit/core/common/graph/virtual_activation_weights_node.py +21 -17
  16. model_compression_toolkit/core/common/mixed_precision/bit_width_setter.py +18 -8
  17. model_compression_toolkit/core/common/mixed_precision/configurable_quantizer_utils.py +9 -14
  18. model_compression_toolkit/core/common/mixed_precision/mixed_precision_candidates_filter.py +21 -12
  19. model_compression_toolkit/core/common/mixed_precision/mixed_precision_ru_helper.py +3 -2
  20. model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_facade.py +5 -2
  21. model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py +6 -3
  22. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py +10 -5
  23. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_data.py +5 -2
  24. model_compression_toolkit/core/common/mixed_precision/sensitivity_eval/metric_calculators.py +9 -4
  25. model_compression_toolkit/core/common/mixed_precision/sensitivity_eval/sensitivity_evaluation.py +7 -2
  26. model_compression_toolkit/core/common/mixed_precision/solution_refinement_procedure.py +5 -7
  27. model_compression_toolkit/core/common/model_collector.py +18 -22
  28. model_compression_toolkit/core/common/model_validation.py +44 -0
  29. model_compression_toolkit/core/common/network_editors/__init__.py +1 -8
  30. model_compression_toolkit/core/common/network_editors/actions.py +130 -14
  31. model_compression_toolkit/core/common/network_editors/edit_network.py +4 -1
  32. model_compression_toolkit/core/common/pruning/channels_grouping.py +5 -1
  33. model_compression_toolkit/core/common/pruning/greedy_mask_calculator.py +6 -0
  34. model_compression_toolkit/core/common/pruning/importance_metrics/lfh_importance_metric.py +15 -5
  35. model_compression_toolkit/core/common/pruning/mask/per_channel_mask.py +7 -3
  36. model_compression_toolkit/core/common/pruning/mask/per_simd_group_mask.py +4 -2
  37. model_compression_toolkit/core/common/pruning/memory_calculator.py +13 -5
  38. model_compression_toolkit/core/common/pruning/prune_graph.py +4 -1
  39. model_compression_toolkit/core/common/pruning/pruner.py +6 -1
  40. model_compression_toolkit/core/common/pruning/pruning_framework_implementation.py +13 -5
  41. model_compression_toolkit/core/common/pruning/pruning_section.py +18 -9
  42. model_compression_toolkit/core/common/quantization/bit_width_config.py +10 -10
  43. model_compression_toolkit/core/common/quantization/candidate_node_quantization_config.py +55 -116
  44. model_compression_toolkit/core/common/quantization/filter_nodes_candidates.py +14 -20
  45. model_compression_toolkit/core/common/quantization/node_quantization_config.py +228 -43
  46. model_compression_toolkit/core/common/quantization/quantization_config.py +1 -0
  47. model_compression_toolkit/core/common/quantization/quantization_fn_selection.py +1 -21
  48. model_compression_toolkit/core/common/quantization/quantization_params_fn_selection.py +78 -0
  49. model_compression_toolkit/core/common/quantization/quantization_params_generation/__init__.py +5 -8
  50. model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_activations_computation.py +76 -91
  51. model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_computation.py +66 -36
  52. model_compression_toolkit/core/common/quantization/quantization_params_generation/qparams_weights_computation.py +32 -61
  53. model_compression_toolkit/core/common/quantization/quantize_node.py +8 -8
  54. model_compression_toolkit/core/common/quantization/set_node_quantization_config.py +412 -93
  55. model_compression_toolkit/core/common/statistics_correction/apply_activation_bias_correction_to_graph.py +7 -3
  56. model_compression_toolkit/core/common/statistics_correction/apply_bias_correction_to_graph.py +19 -6
  57. model_compression_toolkit/core/common/statistics_correction/apply_second_moment_correction_to_graph.py +19 -11
  58. model_compression_toolkit/core/common/statistics_correction/compute_activation_bias_correction_of_graph.py +15 -15
  59. model_compression_toolkit/core/common/statistics_correction/compute_bias_correction_of_graph.py +20 -4
  60. model_compression_toolkit/core/common/statistics_correction/statistics_correction.py +9 -4
  61. model_compression_toolkit/core/common/substitutions/batchnorm_reconstruction.py +12 -8
  62. model_compression_toolkit/core/common/substitutions/batchnorm_refusing.py +6 -3
  63. model_compression_toolkit/core/common/substitutions/scale_equalization.py +21 -5
  64. model_compression_toolkit/core/common/substitutions/shift_negative_activation.py +55 -43
  65. model_compression_toolkit/core/common/substitutions/virtual_activation_weights_composition.py +3 -1
  66. model_compression_toolkit/core/common/substitutions/weights_activation_split.py +1 -1
  67. model_compression_toolkit/core/common/visualization/nn_visualizer.py +8 -3
  68. model_compression_toolkit/core/common/visualization/tensorboard_writer.py +12 -8
  69. model_compression_toolkit/core/graph_prep_runner.py +35 -22
  70. model_compression_toolkit/core/keras/back2framework/float_model_builder.py +4 -0
  71. model_compression_toolkit/core/keras/back2framework/keras_model_builder.py +5 -0
  72. model_compression_toolkit/core/keras/back2framework/mixed_precision_model_builder.py +15 -8
  73. model_compression_toolkit/core/keras/back2framework/quantized_model_builder.py +6 -5
  74. model_compression_toolkit/core/keras/default_framework_info.py +91 -131
  75. model_compression_toolkit/core/keras/graph_substitutions/substitutions/batchnorm_folding.py +7 -2
  76. model_compression_toolkit/core/keras/graph_substitutions/substitutions/dwconv_to_conv.py +1 -0
  77. model_compression_toolkit/core/keras/graph_substitutions/substitutions/input_scaling.py +18 -29
  78. model_compression_toolkit/core/keras/graph_substitutions/substitutions/scale_equalization.py +16 -8
  79. model_compression_toolkit/core/keras/graph_substitutions/substitutions/shift_negative_activation.py +5 -4
  80. model_compression_toolkit/core/keras/hessian/weights_hessian_scores_calculator_keras.py +13 -3
  81. model_compression_toolkit/core/keras/keras_implementation.py +37 -17
  82. model_compression_toolkit/core/keras/keras_model_validation.py +38 -0
  83. model_compression_toolkit/core/keras/keras_node_prior_info.py +13 -4
  84. model_compression_toolkit/core/keras/mixed_precision/configurable_activation_quantizer.py +1 -2
  85. model_compression_toolkit/core/keras/pruning/pruning_keras_implementation.py +34 -19
  86. model_compression_toolkit/core/keras/resource_utilization_data_facade.py +2 -2
  87. model_compression_toolkit/core/keras/statistics_correction/keras_compute_activation_bias_correction_of_graph.py +5 -3
  88. model_compression_toolkit/core/pytorch/back2framework/float_model_builder.py +12 -3
  89. model_compression_toolkit/core/pytorch/back2framework/mixed_precision_model_builder.py +16 -9
  90. model_compression_toolkit/core/pytorch/back2framework/pytorch_model_builder.py +5 -1
  91. model_compression_toolkit/core/pytorch/back2framework/quantization_wrapper/quantized_layer_wrapper.py +3 -2
  92. model_compression_toolkit/core/pytorch/back2framework/quantized_model_builder.py +6 -5
  93. model_compression_toolkit/core/pytorch/default_framework_info.py +79 -93
  94. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/const_holder_conv.py +4 -3
  95. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/relu_bound_to_power_of_2.py +5 -5
  96. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/scale_equalization.py +8 -4
  97. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/shift_negative_activation.py +4 -3
  98. model_compression_toolkit/core/pytorch/hessian/weights_hessian_scores_calculator_pytorch.py +12 -3
  99. model_compression_toolkit/core/pytorch/mixed_precision/configurable_activation_quantizer.py +1 -2
  100. model_compression_toolkit/core/pytorch/pruning/pruning_pytorch_implementation.py +41 -24
  101. model_compression_toolkit/core/pytorch/pytorch_implementation.py +33 -13
  102. model_compression_toolkit/core/pytorch/pytorch_node_prior_info.py +5 -1
  103. model_compression_toolkit/core/pytorch/resource_utilization_data_facade.py +2 -2
  104. model_compression_toolkit/core/pytorch/statistics_correction/pytorch_compute_activation_bias_correction_of_graph.py +5 -3
  105. model_compression_toolkit/core/quantization_prep_runner.py +11 -6
  106. model_compression_toolkit/core/runner.py +15 -5
  107. model_compression_toolkit/data_generation/keras/optimization_functions/lr_scheduler.py +8 -8
  108. model_compression_toolkit/data_generation/pytorch/optimization_functions/lr_scheduler.py +11 -11
  109. model_compression_toolkit/exporter/model_exporter/keras/keras_export_facade.py +0 -2
  110. model_compression_toolkit/exporter/model_exporter/pytorch/fakely_quant_onnx_pytorch_exporter.py +1 -0
  111. model_compression_toolkit/exporter/model_exporter/pytorch/pytorch_export_facade.py +9 -13
  112. model_compression_toolkit/gptq/common/gptq_graph.py +11 -5
  113. model_compression_toolkit/gptq/common/gptq_training.py +8 -1
  114. model_compression_toolkit/gptq/keras/gptq_training.py +9 -3
  115. model_compression_toolkit/gptq/keras/graph_info.py +6 -4
  116. model_compression_toolkit/gptq/keras/quantization_facade.py +10 -4
  117. model_compression_toolkit/gptq/keras/quantizer/soft_rounding/soft_quantizer_reg.py +3 -1
  118. model_compression_toolkit/gptq/pytorch/gptq_training.py +9 -3
  119. model_compression_toolkit/gptq/pytorch/graph_info.py +3 -1
  120. model_compression_toolkit/gptq/pytorch/quantization_facade.py +7 -5
  121. model_compression_toolkit/gptq/pytorch/quantizer/soft_rounding/soft_quantizer_reg.py +3 -1
  122. model_compression_toolkit/gptq/runner.py +7 -1
  123. model_compression_toolkit/pruning/keras/pruning_facade.py +12 -7
  124. model_compression_toolkit/pruning/pytorch/pruning_facade.py +8 -4
  125. model_compression_toolkit/ptq/keras/quantization_facade.py +13 -5
  126. model_compression_toolkit/ptq/pytorch/quantization_facade.py +8 -4
  127. model_compression_toolkit/ptq/runner.py +4 -1
  128. model_compression_toolkit/qat/common/qat_config.py +6 -2
  129. model_compression_toolkit/qat/keras/quantization_facade.py +13 -7
  130. model_compression_toolkit/qat/pytorch/quantization_facade.py +11 -7
  131. model_compression_toolkit/target_platform_capabilities/constants.py +1 -1
  132. model_compression_toolkit/target_platform_capabilities/targetplatform2framework/attach2pytorch.py +3 -3
  133. model_compression_toolkit/trainable_infrastructure/common/get_quantizer_config.py +2 -0
  134. model_compression_toolkit/trainable_infrastructure/common/trainable_quantizer_config.py +6 -0
  135. model_compression_toolkit/trainable_infrastructure/keras/config_serialization.py +4 -2
  136. model_compression_toolkit/xquant/__init__.py +1 -0
  137. model_compression_toolkit/xquant/common/constants.py +1 -0
  138. model_compression_toolkit/xquant/common/model_folding_utils.py +6 -1
  139. model_compression_toolkit/xquant/common/tensorboard_utils.py +4 -1
  140. model_compression_toolkit/xquant/common/xquant_config.py +27 -1
  141. model_compression_toolkit/xquant/{common → keras}/core_report_generator.py +2 -2
  142. model_compression_toolkit/xquant/keras/facade_xquant_report.py +1 -1
  143. model_compression_toolkit/xquant/{common → keras}/framework_report_utils.py +23 -2
  144. model_compression_toolkit/xquant/keras/keras_report_utils.py +10 -5
  145. model_compression_toolkit/xquant/keras/similarity_calculator.py +199 -0
  146. model_compression_toolkit/xquant/keras/tensorboard_utils.py +3 -0
  147. model_compression_toolkit/xquant/pytorch/core_detect_degrade_layer.py +77 -0
  148. model_compression_toolkit/xquant/pytorch/core_judge_troubleshoot.py +66 -0
  149. model_compression_toolkit/xquant/pytorch/core_report_generator.py +177 -0
  150. model_compression_toolkit/xquant/pytorch/detect_degrade_utils.py +78 -0
  151. model_compression_toolkit/xquant/pytorch/facade_xquant_report.py +41 -1
  152. model_compression_toolkit/xquant/pytorch/framework_report_utils.py +98 -0
  153. model_compression_toolkit/xquant/pytorch/judge_troubleshoot_utils.py +562 -0
  154. model_compression_toolkit/xquant/pytorch/pytorch_report_utils.py +10 -7
  155. model_compression_toolkit/xquant/{common → pytorch}/similarity_calculator.py +6 -1
  156. model_compression_toolkit/xquant/pytorch/tensorboard_utils.py +3 -0
  157. model_compression_toolkit/core/keras/quantization/activation_quantization_fn_factory.py +0 -47
  158. model_compression_toolkit/core/pytorch/quantization/activation_quantization_fn_factory.py +0 -45
  159. model_compression_toolkit/quantization_preparation/__init__.py +0 -14
  160. model_compression_toolkit/quantization_preparation/load_fqc.py +0 -223
  161. {mct_nightly-2.4.0.20250924.535.dist-info → mct_nightly-2.4.2.20250926.532.dist-info}/WHEEL +0 -0
  162. {mct_nightly-2.4.0.20250924.535.dist-info → mct_nightly-2.4.2.20250926.532.dist-info}/licenses/LICENSE.md +0 -0
  163. {mct_nightly-2.4.0.20250924.535.dist-info → mct_nightly-2.4.2.20250926.532.dist-info}/top_level.txt +0 -0
  164. /model_compression_toolkit/core/keras/{quantization → quantizer}/__init__.py +0 -0
  165. /model_compression_toolkit/core/keras/{quantization → quantizer}/fake_quant_builder.py +0 -0
  166. /model_compression_toolkit/core/keras/{quantization → quantizer}/lut_fake_quant.py +0 -0
  167. /model_compression_toolkit/core/pytorch/{quantization → quantizer}/__init__.py +0 -0
  168. /model_compression_toolkit/core/pytorch/{quantization → quantizer}/fake_quant_builder.py +0 -0
  169. /model_compression_toolkit/core/pytorch/{quantization → quantizer}/lut_fake_quant.py +0 -0
@@ -1,47 +0,0 @@
1
- # Copyright 2025 Sony Semiconductor Israel, Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
15
-
16
- from collections.abc import Callable
17
-
18
- from mct_quantizers import QuantizationMethod
19
-
20
-
21
- from model_compression_toolkit.core.keras.quantization.fake_quant_builder import power_of_two_quantization, \
22
- symmetric_quantization, uniform_quantization
23
- from model_compression_toolkit.core.keras.quantization.lut_fake_quant import activation_lut_kmean_quantizer
24
-
25
-
26
- """
27
- Mapping from a QuantizationMethod to an activation quantizer function.
28
- """
29
- _activation_quantizer_factory_mapping = {
30
- QuantizationMethod.POWER_OF_TWO: power_of_two_quantization,
31
- QuantizationMethod.SYMMETRIC: symmetric_quantization,
32
- QuantizationMethod.UNIFORM: uniform_quantization,
33
- QuantizationMethod.LUT_POT_QUANTIZER: activation_lut_kmean_quantizer
34
- }
35
-
36
-
37
- def get_activation_quantization_fn_factory(quantization_method: QuantizationMethod) -> Callable[[int, dict], Callable]:
38
- """
39
- Get factory for activation quantizer.
40
-
41
- Args:
42
- quantization_method: quantization method for activation.
43
-
44
- Returns:
45
- Factory that accepts activation bitwidth and a dict of quantization params, and returns the quantizer.
46
- """
47
- return _activation_quantizer_factory_mapping[quantization_method]
@@ -1,45 +0,0 @@
1
- # Copyright 2025 Sony Semiconductor Israel, Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
15
-
16
- from collections.abc import Callable
17
-
18
- from mct_quantizers import QuantizationMethod
19
- from model_compression_toolkit.core.pytorch.quantization.fake_quant_builder import power_of_two_quantization, \
20
- symmetric_quantization, uniform_quantization
21
- from model_compression_toolkit.core.pytorch.quantization.lut_fake_quant import activation_lut_kmean_quantizer
22
-
23
-
24
- """
25
- Mapping from a QuantizationMethod to an activation quantizer function.
26
- """
27
- _activation_quantizer_factory_mapping = {
28
- QuantizationMethod.POWER_OF_TWO: power_of_two_quantization,
29
- QuantizationMethod.SYMMETRIC: symmetric_quantization,
30
- QuantizationMethod.UNIFORM: uniform_quantization,
31
- QuantizationMethod.LUT_POT_QUANTIZER: activation_lut_kmean_quantizer
32
- }
33
-
34
-
35
- def get_activation_quantization_fn_factory(quantization_method: QuantizationMethod) -> Callable[[int, dict], Callable]:
36
- """
37
- Get factory for activation quantizer.
38
-
39
- Args:
40
- quantization_method: quantization method for activation.
41
-
42
- Returns:
43
- Factory that accepts activation bitwidth and a dict of quantization params, and returns the quantizer.
44
- """
45
- return _activation_quantizer_factory_mapping[quantization_method]
@@ -1,14 +0,0 @@
1
- # Copyright 2025 Sony Semiconductor Israel, Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
@@ -1,223 +0,0 @@
1
- # Copyright 2025 Sony Semiconductor Israel, Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- # ==============================================================================
15
- from typing import List, Optional
16
-
17
- from model_compression_toolkit.core.common import Graph, BaseNode
18
- from model_compression_toolkit.core.common.framework_info import ChannelAxisMapping
19
- from model_compression_toolkit.core.common.fusion.fusing_info import FusingInfoGenerator
20
- from model_compression_toolkit.core.common.quantization.candidate_node_quantization_config import \
21
- CandidateNodeQuantizationConfig, NodeQuantizationConfig
22
- from model_compression_toolkit.core.common.quantization.node_quantization_config import \
23
- NodeActivationQuantizationConfig, NodeWeightsQuantizationConfig, ActivationQuantizationMode
24
- from model_compression_toolkit.core.common.quantization.set_node_quantization_config import filter_node_qco_by_graph
25
- from model_compression_toolkit.logger import Logger
26
- from model_compression_toolkit.target_platform_capabilities import FrameworkQuantizationCapabilities, \
27
- QuantizationConfigOptions, OpQuantizationConfig
28
-
29
-
30
- def load_fqc_configuration(graph: Graph, fqc: FrameworkQuantizationCapabilities):
31
- """
32
- Set-up graph for quantization per TPC.
33
- Each node will contain quantization candidates for mixed precision and the base config for single precision.
34
- The graph will contain the fusing info.
35
-
36
- Args:
37
- graph: graph.
38
- fqc: framework quantization capabilities object.
39
-
40
- Returns:
41
- Updated graph.
42
- """
43
- graph = _set_nodes_quantization_configuration(graph, fqc)
44
- graph = _set_fusion_info(graph, fqc)
45
-
46
- return graph
47
-
48
-
49
- def set_quantization_configs_to_node(node: BaseNode,
50
- graph: Graph,
51
- fqc: FrameworkQuantizationCapabilities):
52
- """
53
- Create and set quantization configurations to a node (for both weights and activation).
54
-
55
- Args:
56
- node (BaseNode): Node to set its quantization configurations.
57
- graph (Graph): Model's internal representation graph.
58
- fqc (FrameworkQuantizationCapabilities): FrameworkQuantizationCapabilities to get default OpQuantizationConfig.
59
- """
60
- qc_options = fetch_qc_options_for_node(node, fqc)
61
- base_config, candidates_qcs = filter_node_qco_by_graph(node, fqc, graph, qc_options)
62
-
63
- node_attrs_list = node.get_node_weights_attributes()
64
- mp_candidates = [_create_candidate(node.channel_axis, qc, node_attrs_list)
65
- for qc in candidates_qcs]
66
- sp_cfg = _create_candidate(node.channel_axis, base_config, node_attrs_list)
67
-
68
- node.quantization_cfg = NodeQuantizationConfig(base_quantization_cfg=sp_cfg,
69
- candidates_quantization_cfg=mp_candidates)
70
-
71
- # TODO is not needed anymore as find min/max candidate look for a real max/min, but some tests still count on it
72
- node.sort_node_candidates()
73
-
74
- if not node.has_activation:
75
- node.quantization_cfg.update_activation_quantization_mode(ActivationQuantizationMode.NO_QUANT)
76
-
77
- _disable_unsupported_quant_preserving(node, graph)
78
-
79
-
80
- def fetch_qc_options_for_node(node: BaseNode,
81
- fqc: FrameworkQuantizationCapabilities,
82
- return_default=True) -> Optional[QuantizationConfigOptions]:
83
- """
84
- Get quantization configuration options for the node from TPC.
85
-
86
- Args:
87
- node: node for which to fetch quantization configuration.
88
- fqc: framework quantization capabilities.
89
- return_default: whether to return the default qco or None if node op is not in FQC.
90
-
91
- Returns:
92
- Quantization configuration options for the node.
93
- """
94
- # qcos by filters
95
- filter_matches = [(fl, qco) for fl, qco in fqc.filterlayer2qco.items() if node.is_match_filter_params(fl)]
96
- fls, filter_qcos = zip(*filter_matches) if filter_matches else (None, None)
97
- if filter_qcos and any(qco != filter_qcos[0] for qco in filter_qcos[1:]):
98
- raise ValueError(f'Cannot assign quantization configuration to {node} as it matches more than one filter with '
99
- f'conflicting configs: {fls}.')
100
-
101
- # qco by opset
102
- # must use is_match_type for functional op in TF2.15
103
- matches = [(op_type, qco) for op_type, qco in fqc.layer2qco.items() if node.is_match_type(op_type)]
104
- op_types, qcos = zip(*matches) if matches else (None, None)
105
- if qcos and any(qco != qcos[0] for qco in qcos[1:]):
106
- raise ValueError(f'Cannot assign quantization configuration to {node} as it matches more than one op type with '
107
- f'conflicting configs: {op_types}.')
108
-
109
- # if node matches by both filter and opset, filter takes priority
110
- if filter_qcos:
111
- return filter_qcos[0]
112
-
113
- if qcos:
114
- return qcos[0]
115
-
116
- return fqc.tpc.default_qco if return_default else None
117
-
118
-
119
- def _set_nodes_quantization_configuration(graph: Graph,
120
- fqc: FrameworkQuantizationCapabilities) -> Graph:
121
- """
122
- Set quantization configuration for each graph node.
123
-
124
- Args:
125
- graph: graph to set with quantization configuration.
126
- fqc: framework quantization capabilities.
127
-
128
- Returns:
129
- Graph: The graph with quantization configurations attached to each node in it.
130
- """
131
- _validate_custom_ops_have_qco(graph, fqc)
132
-
133
- for n in graph.get_topo_sorted_nodes():
134
- set_quantization_configs_to_node(node=n,
135
- graph=graph,
136
- fqc=fqc)
137
- return graph
138
-
139
-
140
- def _set_fusion_info(graph: Graph, fqc: FrameworkQuantizationCapabilities) -> Graph:
141
- """
142
-
143
- Args:
144
- graph: graph.
145
- fqc: quantization capabilities with attached framework.
146
-
147
- Returns:
148
-
149
- """
150
- # TODO fix the dict with const keys inside get_fusing_patterns. use named tuple or class
151
- # TODO irena instead of storing fusion inside graph (including tpc objects) and then let graph convert tpc op config to
152
- # node config, do it here and only store in graph whatever is relevant after this stage.
153
- fusing_info = FusingInfoGenerator(fqc.get_fusing_patterns()).generate_fusing_info(graph)
154
- graph.fusing_info = fusing_info
155
- graph.override_fused_node_activation_quantization_candidates()
156
- return graph
157
-
158
-
159
- def _disable_unsupported_quant_preserving(node: BaseNode, graph: Graph):
160
- """
161
- Disable quantization for quantization preserving ops in cases it cannot be supported
162
- (multiple inputs or un-quantized previous node).
163
-
164
- Args:
165
- node: current node.
166
- graph: graph.
167
- """
168
- if not node.quantization_cfg.get_activation_quant_mode() == ActivationQuantizationMode.PRESERVE_QUANT:
169
- return
170
-
171
- prev_nodes = graph.get_prev_nodes(node)
172
- if len(prev_nodes) != 1:
173
- Logger.info(f'Disabling Quantization-Preserving for node {node.name} with {len(prev_nodes)} inputs.')
174
- node.quantization_cfg.update_activation_quantization_mode(ActivationQuantizationMode.NO_QUANT)
175
- elif prev_nodes[0].quantization_cfg.get_activation_quant_mode() == ActivationQuantizationMode.NO_QUANT:
176
- Logger.info(f'Disabling Quantization-Preserving for node {node.name} since previous node activation '
177
- f'quantization is disabled.')
178
- node.quantization_cfg.update_activation_quantization_mode(ActivationQuantizationMode.NO_QUANT)
179
-
180
-
181
- # TODO irena copied from graph.set_fqc as is. Why does it have Keras errors?
182
- def _validate_custom_ops_have_qco(graph, fqc):
183
- custom_nodes = [n for n in graph.nodes if n.is_custom]
184
- for n in custom_nodes:
185
- qco = fetch_qc_options_for_node(n, fqc, return_default=False)
186
- if not qco:
187
- Logger.critical(f'MCT does not support optimizing Keras custom layers. Found a layer of type {n.type}. '
188
- ' Please add the custom layer to Framework Quantization Capabilities (FQC), or file a feature '
189
- 'request or an issue if you believe this should be supported.') # pragma: no cover
190
- if any([qc.default_weight_attr_config.enable_weights_quantization for qc in qco.quantization_configurations]):
191
- Logger.critical(f'Layer identified: {n.type}. MCT does not support weight quantization for Keras custom layers.') # pragma: no cover
192
-
193
-
194
- def _create_candidate(weight_channel_axis: ChannelAxisMapping,
195
- op_cfg: OpQuantizationConfig,
196
- node_attrs_list: List[str]) -> CandidateNodeQuantizationConfig:
197
- """
198
- Create quantization configuration candidate.
199
-
200
- Args:
201
- weight_channel_axis: channels axes of the node's kernel.
202
- op_cfg: quantization config for the op.
203
- node_attrs_list: A list of the node's weights attributes names.
204
-
205
- Returns:
206
- Candidate quantization config.
207
- """
208
-
209
- aqc = NodeActivationQuantizationConfig(op_cfg=op_cfg)
210
-
211
- # TODO: remove this validation and warning once enabling all attributes quantization by default
212
- attrs_with_enabled_quantization = [attr for attr, cfg in op_cfg.attr_weights_configs_mapping.items()
213
- if cfg.enable_weights_quantization]
214
- if len(attrs_with_enabled_quantization) > 1:
215
- Logger.warning(f"Multiple weights attributes quantization is enabled via the provided FQC."
216
- f"Quantizing any attribute other than the kernel is experimental "
217
- f"and may be subject to unstable behavior."
218
- f"Attributes with enabled weights quantization: {attrs_with_enabled_quantization}.")
219
- wqc = NodeWeightsQuantizationConfig(op_cfg=op_cfg,
220
- weights_channels_axis=weight_channel_axis,
221
- node_attrs_list=node_attrs_list)
222
-
223
- return CandidateNodeQuantizationConfig(activation_quantization_cfg=aqc, weights_quantization_cfg=wqc)