mct-nightly 1.11.0.20240320.400__py3-none-any.whl → 1.11.0.20240322.404__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 (155) hide show
  1. {mct_nightly-1.11.0.20240320.400.dist-info → mct_nightly-1.11.0.20240322.404.dist-info}/METADATA +17 -9
  2. {mct_nightly-1.11.0.20240320.400.dist-info → mct_nightly-1.11.0.20240322.404.dist-info}/RECORD +152 -152
  3. model_compression_toolkit/__init__.py +1 -1
  4. model_compression_toolkit/constants.py +1 -1
  5. model_compression_toolkit/core/__init__.py +3 -3
  6. model_compression_toolkit/core/common/collectors/base_collector.py +2 -2
  7. model_compression_toolkit/core/common/data_loader.py +3 -3
  8. model_compression_toolkit/core/common/graph/base_graph.py +10 -13
  9. model_compression_toolkit/core/common/graph/base_node.py +3 -3
  10. model_compression_toolkit/core/common/graph/edge.py +2 -1
  11. model_compression_toolkit/core/common/graph/memory_graph/bipartite_graph.py +2 -4
  12. model_compression_toolkit/core/common/graph/virtual_activation_weights_node.py +2 -2
  13. model_compression_toolkit/core/common/hessian/hessian_info_service.py +2 -3
  14. model_compression_toolkit/core/common/hessian/trace_hessian_calculator.py +3 -5
  15. model_compression_toolkit/core/common/mixed_precision/bit_width_setter.py +1 -2
  16. model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_facade.py +24 -23
  17. model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py +110 -112
  18. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization.py +114 -0
  19. model_compression_toolkit/core/common/mixed_precision/{kpi_tools/kpi_data.py → resource_utilization_tools/resource_utilization_data.py} +19 -19
  20. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/ru_aggregation_methods.py +105 -0
  21. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/ru_functions_mapping.py +26 -0
  22. model_compression_toolkit/core/common/mixed_precision/{kpi_tools/kpi_methods.py → resource_utilization_tools/ru_methods.py} +61 -61
  23. model_compression_toolkit/core/common/mixed_precision/search_methods/linear_programming.py +75 -71
  24. model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py +2 -4
  25. model_compression_toolkit/core/common/mixed_precision/solution_refinement_procedure.py +34 -34
  26. model_compression_toolkit/core/common/model_collector.py +2 -2
  27. model_compression_toolkit/core/common/network_editors/actions.py +3 -3
  28. model_compression_toolkit/core/common/pruning/greedy_mask_calculator.py +12 -12
  29. model_compression_toolkit/core/common/pruning/importance_metrics/lfh_importance_metric.py +2 -2
  30. model_compression_toolkit/core/common/pruning/mask/per_channel_mask.py +2 -2
  31. model_compression_toolkit/core/common/pruning/mask/per_simd_group_mask.py +2 -2
  32. model_compression_toolkit/core/common/pruning/memory_calculator.py +7 -7
  33. model_compression_toolkit/core/common/pruning/prune_graph.py +2 -3
  34. model_compression_toolkit/core/common/pruning/pruner.py +7 -7
  35. model_compression_toolkit/core/common/pruning/pruning_config.py +1 -1
  36. model_compression_toolkit/core/common/pruning/pruning_info.py +2 -2
  37. model_compression_toolkit/core/common/quantization/candidate_node_quantization_config.py +7 -4
  38. model_compression_toolkit/core/common/quantization/node_quantization_config.py +3 -1
  39. model_compression_toolkit/core/common/quantization/quantization_fn_selection.py +4 -2
  40. model_compression_toolkit/core/common/quantization/quantization_params_fn_selection.py +4 -6
  41. model_compression_toolkit/core/common/quantization/quantization_params_generation/lut_kmeans_params.py +2 -4
  42. model_compression_toolkit/core/common/quantization/quantizers/quantizers_helpers.py +1 -1
  43. model_compression_toolkit/core/common/quantization/quantizers/uniform_quantizers.py +8 -6
  44. model_compression_toolkit/core/common/quantization/set_node_quantization_config.py +2 -2
  45. model_compression_toolkit/core/common/statistics_correction/compute_bias_correction_of_graph.py +4 -6
  46. model_compression_toolkit/core/common/substitutions/batchnorm_refusing.py +4 -7
  47. model_compression_toolkit/core/common/substitutions/shift_negative_activation.py +3 -3
  48. model_compression_toolkit/core/common/substitutions/virtual_activation_weights_composition.py +1 -1
  49. model_compression_toolkit/core/common/substitutions/weights_activation_split.py +3 -3
  50. model_compression_toolkit/core/common/user_info.py +1 -1
  51. model_compression_toolkit/core/keras/back2framework/factory_model_builder.py +3 -3
  52. model_compression_toolkit/core/keras/back2framework/instance_builder.py +2 -2
  53. model_compression_toolkit/core/keras/back2framework/mixed_precision_model_builder.py +4 -8
  54. model_compression_toolkit/core/keras/graph_substitutions/substitutions/input_scaling.py +3 -2
  55. model_compression_toolkit/core/keras/graph_substitutions/substitutions/linear_collapsing.py +2 -2
  56. model_compression_toolkit/core/keras/graph_substitutions/substitutions/matmul_substitution.py +1 -1
  57. model_compression_toolkit/core/keras/graph_substitutions/substitutions/multi_head_attention_decomposition.py +1 -1
  58. model_compression_toolkit/core/keras/graph_substitutions/substitutions/residual_collapsing.py +1 -1
  59. model_compression_toolkit/core/keras/hessian/activation_trace_hessian_calculator_keras.py +3 -3
  60. model_compression_toolkit/core/keras/hessian/trace_hessian_calculator_keras.py +1 -2
  61. model_compression_toolkit/core/keras/hessian/weights_trace_hessian_calculator_keras.py +5 -6
  62. model_compression_toolkit/core/keras/keras_implementation.py +1 -1
  63. model_compression_toolkit/core/keras/mixed_precision/configurable_activation_quantizer.py +1 -1
  64. model_compression_toolkit/core/keras/mixed_precision/configurable_weights_quantizer.py +2 -4
  65. model_compression_toolkit/core/keras/pruning/pruning_keras_implementation.py +1 -1
  66. model_compression_toolkit/core/keras/quantizer/fake_quant_builder.py +7 -7
  67. model_compression_toolkit/core/keras/reader/common.py +2 -2
  68. model_compression_toolkit/core/keras/reader/node_builder.py +1 -1
  69. model_compression_toolkit/core/keras/{kpi_data_facade.py → resource_utilization_data_facade.py} +25 -24
  70. model_compression_toolkit/core/keras/tf_tensor_numpy.py +4 -2
  71. model_compression_toolkit/core/pytorch/back2framework/factory_model_builder.py +3 -3
  72. model_compression_toolkit/core/pytorch/back2framework/mixed_precision_model_builder.py +6 -11
  73. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/const_holder_conv.py +2 -2
  74. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/functional_batch_norm.py +1 -1
  75. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/linear_collapsing.py +1 -1
  76. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/multi_head_attention_decomposition.py +5 -5
  77. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/relu_bound_to_power_of_2.py +1 -1
  78. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/reshape_with_static_shapes.py +1 -1
  79. model_compression_toolkit/core/pytorch/graph_substitutions/substitutions/residual_collapsing.py +1 -1
  80. model_compression_toolkit/core/pytorch/hessian/activation_trace_hessian_calculator_pytorch.py +3 -7
  81. model_compression_toolkit/core/pytorch/hessian/trace_hessian_calculator_pytorch.py +1 -2
  82. model_compression_toolkit/core/pytorch/hessian/weights_trace_hessian_calculator_pytorch.py +2 -2
  83. model_compression_toolkit/core/pytorch/mixed_precision/configurable_activation_quantizer.py +1 -1
  84. model_compression_toolkit/core/pytorch/mixed_precision/configurable_weights_quantizer.py +1 -2
  85. model_compression_toolkit/core/pytorch/pruning/pruning_pytorch_implementation.py +3 -3
  86. model_compression_toolkit/core/pytorch/pytorch_implementation.py +1 -1
  87. model_compression_toolkit/core/pytorch/reader/graph_builders.py +5 -7
  88. model_compression_toolkit/core/pytorch/reader/reader.py +2 -2
  89. model_compression_toolkit/core/pytorch/{kpi_data_facade.py → resource_utilization_data_facade.py} +24 -22
  90. model_compression_toolkit/core/pytorch/utils.py +3 -2
  91. model_compression_toolkit/core/runner.py +43 -42
  92. model_compression_toolkit/data_generation/common/data_generation.py +18 -18
  93. model_compression_toolkit/data_generation/common/model_info_exctractors.py +1 -1
  94. model_compression_toolkit/data_generation/keras/keras_data_generation.py +7 -10
  95. model_compression_toolkit/data_generation/keras/model_info_exctractors.py +2 -1
  96. model_compression_toolkit/data_generation/keras/optimization_functions/image_initilization.py +2 -1
  97. model_compression_toolkit/data_generation/keras/optimization_functions/output_loss_functions.py +2 -4
  98. model_compression_toolkit/data_generation/pytorch/model_info_exctractors.py +2 -1
  99. model_compression_toolkit/data_generation/pytorch/pytorch_data_generation.py +8 -11
  100. model_compression_toolkit/exporter/model_exporter/keras/fakely_quant_keras_exporter.py +1 -1
  101. model_compression_toolkit/exporter/model_exporter/keras/keras_export_facade.py +2 -3
  102. model_compression_toolkit/exporter/model_exporter/pytorch/pytorch_export_facade.py +2 -3
  103. model_compression_toolkit/exporter/model_wrapper/keras/builder/fully_quantized_model_builder.py +8 -4
  104. model_compression_toolkit/exporter/model_wrapper/keras/builder/node_to_quantizer.py +2 -2
  105. model_compression_toolkit/exporter/model_wrapper/keras/validate_layer.py +7 -8
  106. model_compression_toolkit/exporter/model_wrapper/pytorch/builder/fully_quantized_model_builder.py +19 -12
  107. model_compression_toolkit/exporter/model_wrapper/pytorch/builder/node_to_quantizer.py +2 -2
  108. model_compression_toolkit/exporter/model_wrapper/pytorch/validate_layer.py +10 -11
  109. model_compression_toolkit/gptq/common/gptq_graph.py +3 -3
  110. model_compression_toolkit/gptq/common/gptq_training.py +14 -12
  111. model_compression_toolkit/gptq/keras/gptq_training.py +10 -8
  112. model_compression_toolkit/gptq/keras/graph_info.py +1 -1
  113. model_compression_toolkit/gptq/keras/quantization_facade.py +15 -17
  114. model_compression_toolkit/gptq/keras/quantizer/base_keras_gptq_quantizer.py +4 -5
  115. model_compression_toolkit/gptq/keras/quantizer/quantization_builder.py +1 -2
  116. model_compression_toolkit/gptq/pytorch/gptq_training.py +10 -8
  117. model_compression_toolkit/gptq/pytorch/graph_info.py +1 -1
  118. model_compression_toolkit/gptq/pytorch/quantization_facade.py +11 -13
  119. model_compression_toolkit/gptq/pytorch/quantizer/base_pytorch_gptq_quantizer.py +3 -4
  120. model_compression_toolkit/gptq/pytorch/quantizer/quantization_builder.py +1 -2
  121. model_compression_toolkit/logger.py +1 -13
  122. model_compression_toolkit/pruning/keras/pruning_facade.py +11 -12
  123. model_compression_toolkit/pruning/pytorch/pruning_facade.py +11 -12
  124. model_compression_toolkit/ptq/keras/quantization_facade.py +13 -14
  125. model_compression_toolkit/ptq/pytorch/quantization_facade.py +7 -8
  126. model_compression_toolkit/qat/keras/quantization_facade.py +20 -22
  127. model_compression_toolkit/qat/keras/quantizer/base_keras_qat_quantizer.py +2 -3
  128. model_compression_toolkit/qat/keras/quantizer/quantization_builder.py +1 -1
  129. model_compression_toolkit/qat/pytorch/quantization_facade.py +12 -14
  130. model_compression_toolkit/qat/pytorch/quantizer/base_pytorch_qat_quantizer.py +2 -3
  131. model_compression_toolkit/qat/pytorch/quantizer/quantization_builder.py +1 -1
  132. model_compression_toolkit/target_platform_capabilities/immutable.py +4 -2
  133. model_compression_toolkit/target_platform_capabilities/target_platform/__init__.py +4 -8
  134. model_compression_toolkit/target_platform_capabilities/target_platform/current_tp_model.py +1 -1
  135. model_compression_toolkit/target_platform_capabilities/target_platform/fusing.py +43 -8
  136. model_compression_toolkit/target_platform_capabilities/target_platform/op_quantization_config.py +13 -18
  137. model_compression_toolkit/target_platform_capabilities/target_platform/target_platform_model.py +2 -2
  138. model_compression_toolkit/target_platform_capabilities/target_platform/targetplatform2framework/attribute_filter.py +2 -2
  139. model_compression_toolkit/target_platform_capabilities/target_platform/targetplatform2framework/current_tpc.py +2 -1
  140. model_compression_toolkit/target_platform_capabilities/target_platform/targetplatform2framework/operations_to_layers.py +5 -5
  141. model_compression_toolkit/target_platform_capabilities/target_platform/targetplatform2framework/target_platform_capabilities.py +1 -2
  142. model_compression_toolkit/trainable_infrastructure/common/base_trainable_quantizer.py +13 -13
  143. model_compression_toolkit/trainable_infrastructure/common/get_quantizer_config.py +14 -7
  144. model_compression_toolkit/trainable_infrastructure/common/get_quantizers.py +5 -5
  145. model_compression_toolkit/trainable_infrastructure/keras/base_keras_quantizer.py +2 -3
  146. model_compression_toolkit/trainable_infrastructure/keras/load_model.py +4 -5
  147. model_compression_toolkit/trainable_infrastructure/keras/quantize_wrapper.py +3 -4
  148. model_compression_toolkit/trainable_infrastructure/pytorch/base_pytorch_quantizer.py +3 -3
  149. model_compression_toolkit/core/common/mixed_precision/kpi_tools/kpi.py +0 -112
  150. model_compression_toolkit/core/common/mixed_precision/kpi_tools/kpi_aggregation_methods.py +0 -105
  151. model_compression_toolkit/core/common/mixed_precision/kpi_tools/kpi_functions_mapping.py +0 -26
  152. {mct_nightly-1.11.0.20240320.400.dist-info → mct_nightly-1.11.0.20240322.404.dist-info}/LICENSE.md +0 -0
  153. {mct_nightly-1.11.0.20240320.400.dist-info → mct_nightly-1.11.0.20240322.404.dist-info}/WHEEL +0 -0
  154. {mct_nightly-1.11.0.20240320.400.dist-info → mct_nightly-1.11.0.20240322.404.dist-info}/top_level.txt +0 -0
  155. /model_compression_toolkit/core/common/mixed_precision/{kpi_tools → resource_utilization_tools}/__init__.py +0 -0
@@ -27,4 +27,4 @@ from model_compression_toolkit import data_generation
27
27
  from model_compression_toolkit import pruning
28
28
  from model_compression_toolkit.trainable_infrastructure.keras.load_model import keras_load_quantized_model
29
29
 
30
- __version__ = "1.11.0.20240320.000400"
30
+ __version__ = "1.11.0.20240322.000404"
@@ -93,7 +93,7 @@ UPPER_FACTOR = 1.2
93
93
  DEC_RANGE_BOTTOM = 0.97
94
94
  DEC_RANGE_UPPER = 1.03
95
95
 
96
- # KPI computation parameters
96
+ # Resource utilization computation parameters
97
97
  BITS_TO_BYTES = 8.0
98
98
 
99
99
  # Default threshold for Softmax layer
@@ -21,9 +21,9 @@ from model_compression_toolkit.core.common.quantization import quantization_conf
21
21
  from model_compression_toolkit.core.common.mixed_precision import mixed_precision_quantization_config
22
22
  from model_compression_toolkit.core.common.quantization.quantization_config import QuantizationConfig, QuantizationErrorMethod, DEFAULTCONFIG
23
23
  from model_compression_toolkit.core.common.quantization.core_config import CoreConfig
24
- from model_compression_toolkit.core.common.mixed_precision.kpi_tools.kpi import KPI
24
+ from model_compression_toolkit.core.common.mixed_precision.resource_utilization_tools.resource_utilization import ResourceUtilization
25
25
  from model_compression_toolkit.core.common.mixed_precision.mixed_precision_quantization_config import MixedPrecisionQuantizationConfig
26
- from model_compression_toolkit.core.keras.kpi_data_facade import keras_kpi_data
27
- from model_compression_toolkit.core.pytorch.kpi_data_facade import pytorch_kpi_data
26
+ from model_compression_toolkit.core.keras.resource_utilization_data_facade import keras_resource_utilization_data
27
+ from model_compression_toolkit.core.pytorch.resource_utilization_data_facade import pytorch_resource_utilization_data
28
28
  from model_compression_toolkit.core.common.mixed_precision.distance_weighting import MpDistanceWeighting
29
29
 
@@ -66,5 +66,5 @@ class BaseCollector(object):
66
66
  """
67
67
 
68
68
  if not self.is_legal:
69
- Logger.exception(f'{self.__class__.__name__} was manipulated per-channel,'
70
- 'but collected per-tensor. Data is invalid.') # pragma: no cover
69
+ Logger.critical('The data is invalid.'
70
+ f'{self.__class__.__name__} was collected per-tensor but received data manipulated per-channel.') # pragma: no cover
@@ -66,7 +66,7 @@ class FolderImageLoader(object):
66
66
 
67
67
  self.folder = folder
68
68
  self.image_list = []
69
- print(f"Starting Scanning Disk: {self.folder}")
69
+ Logger.info(f"Starting Scanning Disk: {self.folder}")
70
70
  for root, dirs, files in os.walk(self.folder):
71
71
  for file in files:
72
72
  file_type = file.split('.')[-1].lower()
@@ -74,8 +74,8 @@ class FolderImageLoader(object):
74
74
  self.image_list.append(os.path.join(root, file))
75
75
  self.n_files = len(self.image_list)
76
76
  if self.n_files == 0:
77
- Logger.error(f"No files of type: {FILETYPES} are found!") # pragma: no cover
78
- print(f"Finished Disk Scanning: Found {self.n_files} files")
77
+ Logger.critical(f"Expected files of type {FILETYPES}. No files of type {FILETYPES} were found.") # pragma: no cover
78
+ Logger.info(f"Finished Disk Scanning: Found {self.n_files} files")
79
79
  self.preprocessing = preprocessing
80
80
  self.batch_size = batch_size
81
81
 
@@ -102,10 +102,10 @@ class Graph(nx.MultiDiGraph, GraphSearches):
102
102
  for filtered_layer in tpc_filtered_layers])
103
103
  if n.is_custom:
104
104
  if not is_node_in_tpc:
105
- Logger.error(f'MCT does not support optimizing Keras custom layers, but found layer of type {n.type}. '
106
- f'Please add the custom layer to TPC or file a feature request or an issue if you believe this is an issue.')
105
+ Logger.critical(f'MCT does not support optimizing Keras custom layers. Found a layer of type {n.type}. '
106
+ f' Please add the custom layer to Target Platform Capabilities (TPC), or file a feature request or an issue if you believe this should be supported.')
107
107
  if any([qc.default_weight_attr_config.enable_weights_quantization for qc in n.get_qco(tpc).quantization_config_list]):
108
- Logger.error(f'MCT does not support optimizing Keras custom layers with weights quantization. Layer: {n.type}')
108
+ Logger.critical(f'Layer identified: {n.type}. MCT does not support weight quantization for Keras custom layers.')
109
109
 
110
110
  self.tpc = tpc
111
111
 
@@ -231,7 +231,7 @@ class Graph(nx.MultiDiGraph, GraphSearches):
231
231
 
232
232
  sc = self.node_to_in_stats_collector.get(n)
233
233
  if sc is None:
234
- Logger.error(f'Input statistics collector of node {n.name} is None') # pragma: no cover
234
+ Logger.critical(f'No input statistics collector found for node {n.name}.') # pragma: no cover
235
235
  return sc
236
236
 
237
237
  def scale_stats_collector(self,
@@ -370,8 +370,7 @@ class Graph(nx.MultiDiGraph, GraphSearches):
370
370
  input_nodes_output_index = [0] * len(input_nodes)
371
371
 
372
372
  if len(input_nodes_output_index) != len(input_nodes):
373
- Logger.error('Graph.add_node_with_in_edges: input_nodes & input_nodes_output_index must be the same '
374
- 'length') # pragma: no cover
373
+ Logger.critical('The number of input nodes and their corresponding output indices must be equal. Found mismatched lengths.') # pragma: no cover
375
374
 
376
375
  self.add_node(new_node)
377
376
  for sink_index, (in_node, source_index) in enumerate(zip(input_nodes, input_nodes_output_index)):
@@ -414,7 +413,7 @@ class Graph(nx.MultiDiGraph, GraphSearches):
414
413
 
415
414
  """
416
415
  if new_node is None:
417
- Logger.error("Graph received a None value as a new input node.")
416
+ Logger.critical("Cannot replace input node with a None value; new input node is required.")
418
417
 
419
418
  graph_inputs = self.get_inputs()
420
419
  new_graph_inputs = copy(graph_inputs)
@@ -442,13 +441,13 @@ class Graph(nx.MultiDiGraph, GraphSearches):
442
441
  if node_to_remove in output_nodes: # If node is in the graph's outputs, the outputs should be updated
443
442
  if new_graph_outputs is None:
444
443
  Logger.critical(
445
- f'{node_to_remove.name} is in graph outputs, but new outputs were not given.') # pragma: no cover
444
+ f"{node_to_remove.name} is among the graph outputs; however, it cannot be removed without providing a new output.") # pragma: no cover
446
445
  self.set_outputs(new_graph_outputs)
447
446
 
448
447
  if node_to_remove in self.get_inputs(): # If node is in the graph's inputs, the inputs should be updated
449
448
  if new_graph_inputs is None:
450
449
  Logger.critical(
451
- f'{node_to_remove.name} is in graph inputs, but new inputs were not given.') # pragma: no cover
450
+ f'{node_to_remove.name} s among the graph inputs; however, it cannot be removed without providing a new input.') # pragma: no cover
452
451
  self.set_inputs(new_graph_inputs)
453
452
 
454
453
  # Make sure there are no connected edges left to the node before removing it.
@@ -828,14 +827,12 @@ class Graph(nx.MultiDiGraph, GraphSearches):
828
827
 
829
828
  """
830
829
  if not fw_impl.is_node_entry_node(entry_node):
831
- Logger.error(f"Expected to find an entry node to create its pruning section,"
832
- f"but node {entry_node} is not an entry node.")
830
+ Logger.critical(f"Node {entry_node} is not a valid entry node for creating a pruning section")
833
831
 
834
832
  intermediate_nodes, exit_node = self._find_intermediate_and_exit_nodes(entry_node, fw_impl)
835
833
 
836
834
  if not fw_impl.is_node_exit_node(exit_node, entry_node, self.fw_info):
837
- Logger.error(f"Expected to find exit node when creating a pruning section,"
838
- f"but node {exit_node} is not an exit node.")
835
+ Logger.critical(f"Node {exit_node} is not a valid exit node for the pruning section starting with {entry_node}.")
839
836
 
840
837
  return PruningSection(entry_node=entry_node,
841
838
  intermediate_nodes=intermediate_nodes,
@@ -547,7 +547,7 @@ class BaseNode:
547
547
  """
548
548
 
549
549
  if tpc is None:
550
- Logger.error(f'Can not retrieve QC options for None TPC') # pragma: no cover
550
+ Logger.critical(f'Can not retrieve QC options for None TPC') # pragma: no cover
551
551
 
552
552
  for fl, qco in tpc.filterlayer2qco.items():
553
553
  if self.is_match_filter_params(fl):
@@ -617,10 +617,10 @@ class BaseNode:
617
617
  Logger.warning(f"More than one pruning SIMD option is available."
618
618
  f" Min SIMD is used: {min(simd_list)}")
619
619
  if len(simd_list) == 0:
620
- Logger.error(f"No SIMD option is available for {self}")
620
+ Logger.critical(f"No SIMD option is available for {self}")
621
621
  _simd = min(simd_list)
622
622
  if _simd <= 0 or int(_simd) != _simd:
623
- Logger.error(f"SIMD is expected to be a non-positive integer but found: {_simd}")
623
+ Logger.critical(f"SIMD is expected to be a non-positive integer but found: {_simd}")
624
624
  return _simd
625
625
 
626
626
  def sort_node_candidates(self, fw_info):
@@ -17,6 +17,7 @@
17
17
  from typing import Any, Dict
18
18
 
19
19
  from model_compression_toolkit.core.common.graph.base_node import BaseNode
20
+ from model_compression_toolkit.logger import Logger
20
21
 
21
22
  # Edge attributes:
22
23
  EDGE_SOURCE_INDEX = 'source_index'
@@ -108,4 +109,4 @@ def convert_to_edge(edge: Any) -> Edge:
108
109
  elif isinstance(edge, Edge): # it's already an Edge and no change need to be done
109
110
  return edge
110
111
 
111
- raise Exception('Edges list contains an object that is not a known edge format.')
112
+ Logger.critical('Edge conversion failed: unrecognized edge format encountered.')
@@ -75,10 +75,8 @@ class DirectedBipartiteGraph(nx.DiGraph):
75
75
  edges_list: A list of edges to verify their correction.
76
76
  """
77
77
  for n1, n2 in edges_list:
78
- if n1 in self.a_nodes and n2 in self.a_nodes:
79
- Logger.critical(f"Can't add an edge {(n1, n2)} between two nodes in size A of a bipartite graph.")
80
- if n1 in self.b_nodes and n2 in self.b_nodes:
81
- Logger.critical(f"Can't add an edge {(n1, n2)} between two nodes in size B of a bipartite graph.")
78
+ if (n1 in self.a_nodes and n2 in self.a_nodes) or (n1 in self.b_nodes and n2 in self.b_nodes):
79
+ Logger.critical(f"Attempted to add edge {(n1, n2)} between nodes of the same partition in a bipartite graph, violating bipartite properties.")
82
80
 
83
81
  def add_nodes_to_a(self, new_nodes: List[Any]):
84
82
  """
@@ -113,14 +113,14 @@ class VirtualSplitActivationNode(VirtualSplitNode):
113
113
  class VirtualActivationWeightsNode(BaseNode):
114
114
  """
115
115
  A node that represents a composition of pair of sequential activation node and weights (kernel) node.
116
- This structure is used for mixed-precision search with bit-operation KPI.
116
+ This structure is used for mixed-precision search with bit-operation constraint.
117
117
  The node's candidates are the cartesian product of both nodes' candidates.
118
118
 
119
119
  Important: note that not like regular BaseNode or FunctionalNode, in VirtualActivationWeightsNode the activation
120
120
  candidates config refer to the quantization config of the activation that precedes the linear operation! instead of
121
121
  the output of the linear operation.
122
122
  It is ok, since this node is not meant to be used in a graph for creating an actual model, but only a virtual
123
- representation of the model's graph only for allowing to compute the bit-operations KPI in mixed-precision.
123
+ representation of the model's graph only for allowing to compute the bit-operations constraint in mixed-precision.
124
124
  """
125
125
 
126
126
  def __init__(self,
@@ -72,7 +72,7 @@ class HessianInfoService:
72
72
  """
73
73
  images = next(representative_dataset())
74
74
  if not isinstance(images, list):
75
- Logger.error(f'Images expected to be a list but is of type {type(images)}')
75
+ Logger.critical(f'Expected images to be a list; found type: {type(images)}.')
76
76
 
77
77
  # Ensure each image is a single sample, if not, take the first sample
78
78
  return [image[0:1, ...] if image.shape[0] != 1 else image for image in images]
@@ -176,8 +176,7 @@ class HessianInfoService:
176
176
  """
177
177
  father_nodes = [n for n in self.graph.nodes if not n.reuse and n.reuse_group==trace_hessian_request.target_node.reuse_group]
178
178
  if len(father_nodes)!=1:
179
- Logger.error(f"Each reused group has a single node in it which is not marked as"
180
- f" reused but found {len(father_nodes)}")
179
+ Logger.critical(f"Expected a single non-reused node in the reused group, but found {len(father_nodes)}.")
181
180
  reused_group_request = TraceHessianRequest(target_node=father_nodes[0],
182
181
  granularity=trace_hessian_request.granularity,
183
182
  mode=trace_hessian_request.mode)
@@ -50,21 +50,19 @@ class TraceHessianCalculator(ABC):
50
50
 
51
51
  for output_node in graph.get_outputs():
52
52
  if not fw_impl.is_output_node_compatible_for_hessian_score_computation(output_node.node):
53
- Logger.error(f"All graph outputs should support Hessian computation, but node {output_node.node} "
54
- f"was found with layer type {output_node.node.type}. "
55
- f"Try to run MCT without Hessian info computation.")
53
+ Logger.critical(f"All graph outputs must support Hessian score computation. Incompatible node: {output_node.node}, layer type: {output_node.node.type}. Consider disabling Hessian info computation.")
56
54
 
57
55
  self.input_images = fw_impl.to_tensor(input_images)
58
56
  self.num_iterations_for_approximation = num_iterations_for_approximation
59
57
 
60
58
  # Validate representative dataset has same inputs as graph
61
59
  if len(self.input_images)!=len(graph.get_inputs()):
62
- Logger.error(f"Graph has {len(graph.get_inputs())} inputs, but provided representative dataset returns {len(self.input_images)} inputs")
60
+ Logger.critical(f"The graph requires {len(graph.get_inputs())} inputs, but the provided representative dataset contains {len(self.input_images)} inputs.")
63
61
 
64
62
  # Assert all inputs have a batch size of 1
65
63
  for image in self.input_images:
66
64
  if image.shape[0]!=1:
67
- Logger.error(f"Hessian is calculated only for a single image (per input) but input shape is {image.shape}")
65
+ Logger.critical(f"Hessian calculations are restricted to a single-image per input. Found input with shape: {image.shape}.")
68
66
 
69
67
  self.fw_impl = fw_impl
70
68
  self.hessian_request = trace_hessian_request
@@ -116,8 +116,7 @@ def _get_node_qc_by_bit_widths(node: BaseNode,
116
116
 
117
117
  return qc
118
118
 
119
- Logger.critical(f'Node {node.name} quantization configuration from configuration file' # pragma: no cover
120
- f' was not found in candidates configurations.')
119
+ Logger.critical(f"Quantization configuration for node '{node.name}' not found in candidate configurations.") # pragma: no cover
121
120
 
122
121
 
123
122
  def _set_node_final_qc(bit_width_cfg: List[int],
@@ -21,8 +21,8 @@ from typing import List, Callable, Dict
21
21
  from model_compression_toolkit.core import MixedPrecisionQuantizationConfig
22
22
  from model_compression_toolkit.core.common import Graph
23
23
  from model_compression_toolkit.core.common.hessian import HessianInfoService
24
- from model_compression_toolkit.core.common.mixed_precision.kpi_tools.kpi import KPI, KPITarget
25
- from model_compression_toolkit.core.common.mixed_precision.kpi_tools.kpi_functions_mapping import kpi_functions_mapping
24
+ from model_compression_toolkit.core.common.mixed_precision.resource_utilization_tools.resource_utilization import ResourceUtilization, RUTarget
25
+ from model_compression_toolkit.core.common.mixed_precision.resource_utilization_tools.ru_functions_mapping import ru_functions_mapping
26
26
  from model_compression_toolkit.core.common.framework_implementation import FrameworkImplementation
27
27
  from model_compression_toolkit.core.common.mixed_precision.mixed_precision_search_manager import MixedPrecisionSearchManager
28
28
  from model_compression_toolkit.core.common.mixed_precision.search_methods.linear_programming import \
@@ -47,7 +47,7 @@ search_methods = {
47
47
  def search_bit_width(graph_to_search_cfg: Graph,
48
48
  fw_info: FrameworkInfo,
49
49
  fw_impl: FrameworkImplementation,
50
- target_kpi: KPI,
50
+ target_resource_utilization: ResourceUtilization,
51
51
  mp_config: MixedPrecisionQuantizationConfig,
52
52
  representative_data_gen: Callable,
53
53
  search_method: BitWidthSearchMethod = BitWidthSearchMethod.INTEGER_PROGRAMMING,
@@ -56,15 +56,15 @@ def search_bit_width(graph_to_search_cfg: Graph,
56
56
  Search for an MP configuration for a given graph. Given a search_method method (by default, it's linear
57
57
  programming), we use the sensitivity_evaluator object that provides a function to compute an
58
58
  evaluation for the expected sensitivity for a bit-width configuration.
59
- Then, and after computing the KPI for each node in the graph for each bit-width in the search space,
60
- we search for the optimal solution, given some target_kpi, the solution should fit.
61
- target_kpi have to be passed. If it was not passed, the facade is not supposed to get here by now.
59
+ Then, and after computing the resource utilization for each node in the graph for each bit-width in the search space,
60
+ we search for the optimal solution, given some target_resource_utilization, the solution should fit.
61
+ target_resource_utilization have to be passed. If it was not passed, the facade is not supposed to get here by now.
62
62
 
63
63
  Args:
64
64
  graph_to_search_cfg: Graph to search a MP configuration for.
65
65
  fw_info: FrameworkInfo object about the specific framework (e.g., attributes of different layers' weights to quantize).
66
66
  fw_impl: FrameworkImplementation object with specific framework methods implementation.
67
- target_kpi: Target KPI to bound our feasible solution space s.t the configuration does not violate it.
67
+ target_resource_utilization: Target Resource Utilization to bound our feasible solution space s.t the configuration does not violate it.
68
68
  mp_config: Mixed-precision quantization configuration.
69
69
  representative_data_gen: Dataset to use for retrieving images for the models inputs.
70
70
  search_method: BitWidthSearchMethod to define which searching method to use.
@@ -77,25 +77,25 @@ def search_bit_width(graph_to_search_cfg: Graph,
77
77
 
78
78
  """
79
79
 
80
- # target_kpi have to be passed. If it was not passed, the facade is not supposed to get here by now.
81
- if target_kpi is None:
82
- Logger.critical('Target KPI have to be passed for search_methods bit-width configuration') # pragma: no cover
80
+ # target_resource_utilization have to be passed. If it was not passed, the facade is not supposed to get here by now.
81
+ if target_resource_utilization is None:
82
+ Logger.critical("Target ResourceUtilization is required for the bit-width search method's configuration.") # pragma: no cover
83
83
 
84
84
  # Set graph for MP search
85
85
  graph = copy.deepcopy(graph_to_search_cfg) # Copy graph before searching
86
- if target_kpi.bops < np.inf:
87
- # Since Bit-operations count target KPI is set, we need to reconstruct the graph for the MP search
86
+ if target_resource_utilization.bops < np.inf:
87
+ # Since Bit-operations count target resource utilization is set, we need to reconstruct the graph for the MP search
88
88
  graph = substitute(graph, fw_impl.get_substitutions_virtual_weights_activation_coupling())
89
89
 
90
90
  # If we only run weights compression with MP than no need to consider activation quantization when computing the
91
91
  # MP metric (it adds noise to the computation)
92
- disable_activation_for_metric = (target_kpi.weights_memory < np.inf and
93
- (target_kpi.activation_memory == np.inf and
94
- target_kpi.total_memory == np.inf and
95
- target_kpi.bops == np.inf)) or graph_to_search_cfg.is_single_activation_cfg()
92
+ disable_activation_for_metric = (target_resource_utilization.weights_memory < np.inf and
93
+ (target_resource_utilization.activation_memory == np.inf and
94
+ target_resource_utilization.total_memory == np.inf and
95
+ target_resource_utilization.bops == np.inf)) or graph_to_search_cfg.is_single_activation_cfg()
96
96
 
97
97
  # Set Sensitivity Evaluator for MP search. It should always work with the original MP graph,
98
- # even if a virtual graph was created (and is used only for BOPS KPI computation purposes)
98
+ # even if a virtual graph was created (and is used only for BOPS utilization computation purposes)
99
99
  se = fw_impl.get_sensitivity_evaluator(
100
100
  graph_to_search_cfg,
101
101
  mp_config,
@@ -104,16 +104,17 @@ def search_bit_width(graph_to_search_cfg: Graph,
104
104
  disable_activation_for_metric=disable_activation_for_metric,
105
105
  hessian_info_service=hessian_info_service)
106
106
 
107
- # Each pair of (KPI method, KPI aggregation) should match to a specific provided kpi target
108
- kpi_functions = kpi_functions_mapping
107
+ # Each pair of (resource utilization method, resource utilization aggregation) should match to a specific
108
+ # provided target resource utilization
109
+ ru_functions = ru_functions_mapping
109
110
 
110
111
  # Instantiate a manager object
111
112
  search_manager = MixedPrecisionSearchManager(graph,
112
113
  fw_info,
113
114
  fw_impl,
114
115
  se,
115
- kpi_functions,
116
- target_kpi,
116
+ ru_functions,
117
+ target_resource_utilization,
117
118
  original_graph=graph_to_search_cfg)
118
119
 
119
120
  if search_method in search_methods: # Get a specific search function
@@ -123,9 +124,9 @@ def search_bit_width(graph_to_search_cfg: Graph,
123
124
 
124
125
  # Search for the desired mixed-precision configuration
125
126
  result_bit_cfg = search_method_fn(search_manager,
126
- target_kpi)
127
+ target_resource_utilization)
127
128
 
128
129
  if mp_config.refine_mp_solution:
129
- result_bit_cfg = greedy_solution_refinement_procedure(result_bit_cfg, search_manager, target_kpi)
130
+ result_bit_cfg = greedy_solution_refinement_procedure(result_bit_cfg, search_manager, target_resource_utilization)
130
131
 
131
132
  return result_bit_cfg