mct-nightly 2.2.0.20250114.134534__py3-none-any.whl → 2.2.0.20250114.161150__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mct-nightly
3
- Version: 2.2.0.20250114.134534
3
+ Version: 2.2.0.20250114.161150
4
4
  Summary: A Model Compression Toolkit for neural networks
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: Apache Software License
@@ -1,4 +1,4 @@
1
- model_compression_toolkit/__init__.py,sha256=dBTcbUHy3iim5N_8DIYbA_lq8Kp7tPhl7FelHVRgJRo,1557
1
+ model_compression_toolkit/__init__.py,sha256=xA9z6KdE1v3DTO3wLGBTWy4O0yAMvWUgDyFZsuzNP78,1557
2
2
  model_compression_toolkit/constants.py,sha256=i_R6uXBfO1ph_X6DNJych2x59SUojfJbn7dNjs_mZnc,3846
3
3
  model_compression_toolkit/defaultdict.py,sha256=LSc-sbZYXENMCw3U9F4GiXuv67IKpdn0Qm7Fr11jy-4,2277
4
4
  model_compression_toolkit/logger.py,sha256=3DByV41XHRR3kLTJNbpaMmikL8icd9e1N-nkQAY9oDk,4567
@@ -8,7 +8,7 @@ model_compression_toolkit/core/__init__.py,sha256=8a0wUNBKwTdJGDk_Ho6WQAXjGuCqQZ
8
8
  model_compression_toolkit/core/analyzer.py,sha256=X-2ZpkH1xdXnISnw1yJvXnvV-ssoUh-9LkLISSWNqiY,3691
9
9
  model_compression_toolkit/core/graph_prep_runner.py,sha256=CVTjBaci8F6EP3IKDnRMfxkP-Sv8qY8GpkGt6FyII2U,11376
10
10
  model_compression_toolkit/core/quantization_prep_runner.py,sha256=OtL6g2rTC5mfdKrkzm47EPPW-voGGVYMYxpy2_sfu1U,6547
11
- model_compression_toolkit/core/runner.py,sha256=YuL6LFarg3rl65rm3ccdXI9aNVd-yUhGRqhYqztby0M,13114
11
+ model_compression_toolkit/core/runner.py,sha256=jcKvWUhS5zQBBptONKvRFnkWrdDENcS5Go7kPi8Ya4o,13583
12
12
  model_compression_toolkit/core/common/__init__.py,sha256=Wh127PbXcETZX_d1PQqZ71ETK3J9XO5A-HpadGUbj6o,1447
13
13
  model_compression_toolkit/core/common/base_substitutions.py,sha256=xDFSmVVs_iFSZfajytI0cuQaNRNcwHX3uqOoHgVUvxQ,1666
14
14
  model_compression_toolkit/core/common/framework_implementation.py,sha256=IkMydCj6voau7dwkYLYA_Ka_EFUKP3GKQdpYN6b1fgc,22163
@@ -67,16 +67,16 @@ model_compression_toolkit/core/common/mixed_precision/mixed_precision_candidates
67
67
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_quantization_config.py,sha256=r1t025_QHshyoop-PZvL7x6UuXaeplCCU3h4VNBhJHo,4309
68
68
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_ru_helper.py,sha256=7iJ2YprFvm2Dk9EkXYrwO7-Sf89f537D-KrQP7XhvPs,8889
69
69
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_facade.py,sha256=aAuGIzSDKIDiq07nheeWRXLEatzr6Fvoa5ZHv-2BtCI,7130
70
- model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py,sha256=7ROKH1bTQEoyl5yLj10NbOWLFJgJicHBBJmUT_s1xnw,32463
70
+ model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py,sha256=fe8R1ZdllwL_YQoHgvzTBjoI3GJo4bEVk89I3zEVr14,32463
71
71
  model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py,sha256=gsigifJ-ykWNafF4t7UMEC_-nd6YPERAk1_z0kT-Y88,27172
72
72
  model_compression_toolkit/core/common/mixed_precision/set_layer_to_bitwidth.py,sha256=P8QtKgFXtt5b2RoubzI5OGlCfbEfZsAirjyrkFzK26A,2846
73
73
  model_compression_toolkit/core/common/mixed_precision/solution_refinement_procedure.py,sha256=UWgxzhKWFOoESLq0TFVz0M1PhkU9d9n6wccSA3RgUxk,7903
74
74
  model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/__init__.py,sha256=Rf1RcYmelmdZmBV5qOKvKWF575ofc06JFQSq83Jz99A,696
75
- model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization.py,sha256=89gXow5VMOsQX0SxLLoVvVDDxQd1z9b6crEWZgeWSaY,3453
76
- model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py,sha256=jvPhYhzGMKKgoqkEBMeDcOiM8wHdHxn_hM1RVFgvERw,34262
77
- model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_data.py,sha256=5sbFXgDA6mpkXXAmk6HmR5UvBnuAmkoqTHu3ah6npsY,8529
75
+ model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization.py,sha256=T5yVr7lay-6QLuTDBZNI1Ufj02EMBWuY_yHjC8eHx5I,3998
76
+ model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py,sha256=qkYrYORLL5wmdmCkEY3tDSgabsGYt3OaTDVsgHWYBfE,34885
77
+ model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_data.py,sha256=tfcbMppa5KP_brfkFWRiOX9LQVHGXJtlgxyAt9oDGuw,8529
78
78
  model_compression_toolkit/core/common/mixed_precision/search_methods/__init__.py,sha256=sw7LOPN1bM82o3SkMaklyH0jw-TLGK0-fl2Wq73rffI,697
79
- model_compression_toolkit/core/common/mixed_precision/search_methods/linear_programming.py,sha256=0NUmtGiAOLl3GObr6V5L6GU19fXmp89GKDlKAKZkxwU,17176
79
+ model_compression_toolkit/core/common/mixed_precision/search_methods/linear_programming.py,sha256=ZvLxFIfMUPAyKKzPhJcuZyjjngLD9_1wWFU8e14vEbA,17176
80
80
  model_compression_toolkit/core/common/network_editors/__init__.py,sha256=vZmu55bYqiaOQs3AjfwWDXHmuKZcLHt-wm7uR5fPEqg,1307
81
81
  model_compression_toolkit/core/common/network_editors/actions.py,sha256=nid0_j-Cn10xvmztT8yCKW_6uA7JEnom9SW9syx7wc0,19594
82
82
  model_compression_toolkit/core/common/network_editors/edit_network.py,sha256=dfgawi-nB0ocAJ0xcGn9E-Zv203oUnQLuMiXpX8vTgA,1748
@@ -523,8 +523,8 @@ model_compression_toolkit/xquant/pytorch/model_analyzer.py,sha256=b93o800yVB3Z-i
523
523
  model_compression_toolkit/xquant/pytorch/pytorch_report_utils.py,sha256=UVN_S9ULHBEldBpShCOt8-soT8YTQ5oE362y96qF_FA,3950
524
524
  model_compression_toolkit/xquant/pytorch/similarity_functions.py,sha256=CERxq5K8rqaiE-DlwhZBTUd9x69dtYJlkHOPLB54vm8,2354
525
525
  model_compression_toolkit/xquant/pytorch/tensorboard_utils.py,sha256=mkoEktLFFHtEKzzFRn_jCnxjhJolK12TZ5AQeDHzUO8,9767
526
- mct_nightly-2.2.0.20250114.134534.dist-info/LICENSE.md,sha256=aYSSIb-5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks,10174
527
- mct_nightly-2.2.0.20250114.134534.dist-info/METADATA,sha256=quvuXUrjOH_pIW_pD6rxY0fFwE7NxpduT0u1P1eolbk,26604
528
- mct_nightly-2.2.0.20250114.134534.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
529
- mct_nightly-2.2.0.20250114.134534.dist-info/top_level.txt,sha256=gsYA8juk0Z-ZmQRKULkb3JLGdOdz8jW_cMRjisn9ga4,26
530
- mct_nightly-2.2.0.20250114.134534.dist-info/RECORD,,
526
+ mct_nightly-2.2.0.20250114.161150.dist-info/LICENSE.md,sha256=aYSSIb-5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks,10174
527
+ mct_nightly-2.2.0.20250114.161150.dist-info/METADATA,sha256=AjCYuWPjOdisumA9-7iUbEVGvFr1uzWV9809mi42JyQ,26604
528
+ mct_nightly-2.2.0.20250114.161150.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
529
+ mct_nightly-2.2.0.20250114.161150.dist-info/top_level.txt,sha256=gsYA8juk0Z-ZmQRKULkb3JLGdOdz8jW_cMRjisn9ga4,26
530
+ mct_nightly-2.2.0.20250114.161150.dist-info/RECORD,,
@@ -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__ = "2.2.0.20250114.134534"
30
+ __version__ = "2.2.0.20250114.161150"
@@ -69,7 +69,7 @@ class MixedPrecisionSearchManager:
69
69
 
70
70
  # To define RU Total constraints we need to compute weights and activations even if they have no constraints
71
71
  # TODO currently this logic is duplicated in linear_programming.py
72
- targets = target_resource_utilization.get_restricted_metrics()
72
+ targets = target_resource_utilization.get_restricted_targets()
73
73
  if RUTarget.TOTAL in targets:
74
74
  targets = targets.union({RUTarget.ACTIVATION, RUTarget.WEIGHTS}) - {RUTarget.TOTAL}
75
75
  self.ru_targets_to_compute = targets
@@ -86,15 +86,31 @@ class ResourceUtilization:
86
86
  ru.total_memory <= self.total_memory and \
87
87
  ru.bops <= self.bops)
88
88
 
89
- def get_restricted_metrics(self) -> Set[RUTarget]:
89
+ def get_restricted_targets(self) -> Set[RUTarget]:
90
90
  d = self.get_resource_utilization_dict()
91
91
  return {k for k, v in d.items() if v < np.inf}
92
92
 
93
93
  def is_any_restricted(self) -> bool:
94
- return bool(self.get_restricted_metrics())
94
+ return bool(self.get_restricted_targets())
95
95
 
96
- def __repr__(self):
97
- return f"Weights_memory: {self.weights_memory}, " \
98
- f"Activation_memory: {self.activation_memory}, " \
99
- f"Total_memory: {self.total_memory}, " \
100
- f"BOPS: {self.bops}"
96
+ def get_summary_str(self, restricted: bool):
97
+ """
98
+ Generate summary string.
99
+
100
+ Args:
101
+ restricted: whether to include non-restricted targets.
102
+
103
+ Returns:
104
+ Summary string.
105
+ """
106
+ targets = self.get_restricted_targets() if restricted else list(RUTarget)
107
+ summary = []
108
+ if RUTarget.WEIGHTS in targets:
109
+ summary.append(f"Weights memory: {self.weights_memory}")
110
+ if RUTarget.ACTIVATION in targets:
111
+ summary.append(f"Activation memory: {self.activation_memory}")
112
+ if RUTarget.TOTAL in targets:
113
+ summary.append(f"Total memory: {self.total_memory}")
114
+ if RUTarget.BOPS in targets:
115
+ summary.append(f"BOPS: {self.bops}")
116
+ return ', '.join(summary)
@@ -15,8 +15,7 @@
15
15
  from collections import defaultdict
16
16
  from copy import deepcopy
17
17
  from enum import Enum, auto
18
- from functools import lru_cache
19
- from typing import Dict, NamedTuple, Optional, Tuple, List, Iterable, Union, Literal, Sequence
18
+ from typing import Dict, NamedTuple, Optional, Tuple, List, Iterable, Union, Literal, Sequence, Set
20
19
 
21
20
  from model_compression_toolkit.constants import FLOAT_BITWIDTH
22
21
  from model_compression_toolkit.core import FrameworkInfo
@@ -160,16 +159,17 @@ class ResourceUtilizationCalculator:
160
159
  """
161
160
  ru_targets = set(ru_targets) if ru_targets else set(RUTarget)
162
161
 
162
+ if w_qcs is not None and not self.is_custom_weights_config_applicable(ru_targets):
163
+ raise ValueError('Weight configuration passed but no relevant metric requested.')
164
+ if act_qcs is not None and not self.is_custom_activation_config_applicable(ru_targets):
165
+ raise ValueError('Activation configuration passed but no relevant metric requested.')
166
+
163
167
  w_total, a_total = None, None
164
168
  if {RUTarget.WEIGHTS, RUTarget.TOTAL}.intersection(ru_targets):
165
169
  w_total, *_ = self.compute_weights_utilization(target_criterion, bitwidth_mode, w_qcs)
166
- elif w_qcs is not None: # pragma: no cover
167
- raise ValueError('Weight configuration passed but no relevant metric requested.')
168
170
 
169
171
  if {RUTarget.ACTIVATION, RUTarget.TOTAL}.intersection(ru_targets):
170
172
  a_total = self.compute_activations_utilization(target_criterion, bitwidth_mode, act_qcs)
171
- elif act_qcs is not None: # pragma: no cover
172
- raise ValueError('Activation configuration passed but no relevant metric requested.')
173
173
 
174
174
  ru = ResourceUtilization()
175
175
  if RUTarget.WEIGHTS in ru_targets:
@@ -182,7 +182,7 @@ class ResourceUtilizationCalculator:
182
182
  ru.bops, _ = self.compute_bops(target_criterion=target_criterion,
183
183
  bitwidth_mode=bitwidth_mode, act_qcs=act_qcs, w_qcs=w_qcs)
184
184
 
185
- assert ru.get_restricted_metrics() == set(ru_targets), 'Mismatch between the number of requested and computed metrics'
185
+ assert ru.get_restricted_targets() == set(ru_targets), 'Mismatch between the number of requested and computed metrics'
186
186
  return ru
187
187
 
188
188
  def compute_weights_utilization(self,
@@ -464,6 +464,14 @@ class ResourceUtilizationCalculator:
464
464
  node_bops = a_nbits * w_nbits * node_mac
465
465
  return node_bops
466
466
 
467
+ def is_custom_weights_config_applicable(self, ru_targets: Set[RUTarget]) -> bool:
468
+ """ Whether custom configuration for weights is compatible with the requested targets."""
469
+ return bool({RUTarget.WEIGHTS, RUTarget.TOTAL, RUTarget.BOPS}.intersection(ru_targets))
470
+
471
+ def is_custom_activation_config_applicable(self, ru_targets: Set[RUTarget]) -> bool:
472
+ """ Whether custom configuration for activations is compatible with the requested targets."""
473
+ return bool({RUTarget.ACTIVATION, RUTarget.TOTAL, RUTarget.BOPS}.intersection(ru_targets))
474
+
467
475
  def _get_cut_target_nodes(self, cut: Cut, target_criterion: TargetInclusionCriterion) -> List[BaseNode]:
468
476
  """
469
477
  Retrieve target nodes from a cut filtered by a criterion.
@@ -118,7 +118,7 @@ def requires_mixed_precision(in_model: Any,
118
118
 
119
119
  ru_calculator = ResourceUtilizationCalculator(transformed_graph, fw_impl, fw_info)
120
120
  max_ru = ru_calculator.compute_resource_utilization(TargetInclusionCriterion.AnyQuantized, BitwidthMode.QMaxBit,
121
- ru_targets=target_resource_utilization.get_restricted_metrics())
121
+ ru_targets=target_resource_utilization.get_restricted_targets())
122
122
  return not target_resource_utilization.is_satisfied_by(max_ru)
123
123
 
124
124
 
@@ -196,7 +196,7 @@ def _add_ru_constraints(search_manager: MixedPrecisionSearchManager,
196
196
  """
197
197
  ru_indicated_vectors = {}
198
198
  # targets to add constraints for
199
- constraints_targets = target_resource_utilization.get_restricted_metrics()
199
+ constraints_targets = target_resource_utilization.get_restricted_targets()
200
200
  # to add constraints for Total target we need to compute weight and activation
201
201
  targets_to_compute = constraints_targets
202
202
  if RUTarget.TOTAL in constraints_targets:
@@ -14,7 +14,7 @@
14
14
  # ==============================================================================
15
15
 
16
16
  import copy
17
- from typing import Callable, Any, List
17
+ from typing import Callable, Any, List, Optional
18
18
 
19
19
  from model_compression_toolkit.core.common import FrameworkInfo
20
20
  from model_compression_toolkit.core.common.framework_implementation import FrameworkImplementation
@@ -170,6 +170,7 @@ def core_runner(in_model: Any,
170
170
 
171
171
  _set_final_resource_utilization(graph=tg,
172
172
  final_bit_widths_config=bit_widths_config,
173
+ target_resource_utilization=target_resource_utilization,
173
174
  fw_info=fw_info,
174
175
  fw_impl=fw_impl)
175
176
 
@@ -207,6 +208,7 @@ def core_runner(in_model: Any,
207
208
 
208
209
  def _set_final_resource_utilization(graph: Graph,
209
210
  final_bit_widths_config: List[int],
211
+ target_resource_utilization: Optional[ResourceUtilization],
210
212
  fw_info: FrameworkInfo,
211
213
  fw_impl: FrameworkImplementation):
212
214
  """
@@ -216,21 +218,24 @@ def _set_final_resource_utilization(graph: Graph,
216
218
  Args:
217
219
  graph: Graph to compute the resource utilization for.
218
220
  final_bit_widths_config: The final bit-width configuration to quantize the model accordingly.
221
+ target_resource_utilization: Requested target resource utilization if relevant.
219
222
  fw_info: A FrameworkInfo object.
220
223
  fw_impl: FrameworkImplementation object with specific framework methods implementation.
221
224
 
222
225
  """
223
- w_qcs = {n: n.final_weights_quantization_cfg for n in graph.nodes}
224
- a_qcs = {n: n.final_activation_quantization_cfg for n in graph.nodes}
225
- ru_calculator = ResourceUtilizationCalculator(graph, fw_impl, fw_info)
226
- final_ru = ru_calculator.compute_resource_utilization(TargetInclusionCriterion.AnyQuantized, BitwidthMode.QCustom,
227
- act_qcs=a_qcs, w_qcs=w_qcs)
228
-
229
- for ru_target, ru in final_ru.get_resource_utilization_dict().items():
230
- if ru == 0:
231
- Logger.warning(f"No relevant quantized layers for the resource utilization target {ru_target} were found, "
232
- f"the recorded final ru for this target would be 0.")
233
-
234
- Logger.info(f'Resource utilization (of quantized targets):\n {str(final_ru)}.')
226
+ ru_targets = target_resource_utilization.get_restricted_targets()
227
+ final_ru = None
228
+ if ru_targets:
229
+ ru_calculator = ResourceUtilizationCalculator(graph, fw_impl, fw_info)
230
+ w_qcs, a_qcs = None, None
231
+ if ru_calculator.is_custom_weights_config_applicable(ru_targets):
232
+ w_qcs = {n: n.final_weights_quantization_cfg for n in graph.nodes}
233
+ if ru_calculator.is_custom_activation_config_applicable(ru_targets):
234
+ a_qcs = {n: n.final_activation_quantization_cfg for n in graph.nodes}
235
+ final_ru = ru_calculator.compute_resource_utilization(TargetInclusionCriterion.AnyQuantized,
236
+ BitwidthMode.QCustom,
237
+ act_qcs=a_qcs, w_qcs=w_qcs, ru_targets=ru_targets)
238
+ summary = final_ru.get_summary_str(restricted=True)
239
+ Logger.info(f'Resource utilization for quantized mixed-precision targets:\n {summary}.')
235
240
  graph.user_info.final_resource_utilization = final_ru
236
241
  graph.user_info.mixed_precision_cfg = final_bit_widths_config