mct-nightly 2.3.0.20250407.1120__py3-none-any.whl → 2.3.0.20250409.529__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 (18) hide show
  1. {mct_nightly-2.3.0.20250407.1120.dist-info → mct_nightly-2.3.0.20250409.529.dist-info}/METADATA +1 -1
  2. {mct_nightly-2.3.0.20250407.1120.dist-info → mct_nightly-2.3.0.20250409.529.dist-info}/RECORD +18 -18
  3. model_compression_toolkit/__init__.py +1 -1
  4. model_compression_toolkit/core/common/fusion/fusing_info.py +4 -5
  5. model_compression_toolkit/core/common/graph/base_graph.py +2 -1
  6. model_compression_toolkit/core/common/graph/base_node.py +15 -19
  7. model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py +2 -2
  8. model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py +2 -1
  9. model_compression_toolkit/core/common/quantization/node_quantization_config.py +33 -13
  10. model_compression_toolkit/core/common/quantization/set_node_quantization_config.py +5 -3
  11. model_compression_toolkit/core/common/statistics_correction/compute_activation_bias_correction_of_graph.py +1 -2
  12. model_compression_toolkit/core/common/substitutions/batchnorm_reconstruction.py +3 -2
  13. model_compression_toolkit/core/common/substitutions/shift_negative_activation.py +3 -2
  14. model_compression_toolkit/core/keras/mixed_precision/configurable_activation_quantizer.py +1 -2
  15. model_compression_toolkit/core/pytorch/mixed_precision/configurable_activation_quantizer.py +1 -2
  16. {mct_nightly-2.3.0.20250407.1120.dist-info → mct_nightly-2.3.0.20250409.529.dist-info}/WHEEL +0 -0
  17. {mct_nightly-2.3.0.20250407.1120.dist-info → mct_nightly-2.3.0.20250409.529.dist-info}/licenses/LICENSE.md +0 -0
  18. {mct_nightly-2.3.0.20250407.1120.dist-info → mct_nightly-2.3.0.20250409.529.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mct-nightly
3
- Version: 2.3.0.20250407.1120
3
+ Version: 2.3.0.20250409.529
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,5 +1,5 @@
1
- mct_nightly-2.3.0.20250407.1120.dist-info/licenses/LICENSE.md,sha256=aYSSIb-5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks,10174
2
- model_compression_toolkit/__init__.py,sha256=rbCx-x__4DNITXM-m79qge3vAJYMLHqI9ym62xr6BTE,1557
1
+ mct_nightly-2.3.0.20250409.529.dist-info/licenses/LICENSE.md,sha256=aYSSIb-5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks,10174
2
+ model_compression_toolkit/__init__.py,sha256=N8l60g-rzPJ8KsABiD7u-UgLCwPxPQ4hH36Y6v0QhbQ,1557
3
3
  model_compression_toolkit/constants.py,sha256=2ltuH-gdaLZoZV4CPUgKjC3S9ojz2z4OTVdenyVEypU,3912
4
4
  model_compression_toolkit/defaultdict.py,sha256=LSc-sbZYXENMCw3U9F4GiXuv67IKpdn0Qm7Fr11jy-4,2277
5
5
  model_compression_toolkit/logger.py,sha256=L3q7tn3Uht0i_7phnlOWMR2Te2zvzrt2HOz9vYEInts,4529
@@ -31,11 +31,11 @@ model_compression_toolkit/core/common/collectors/min_max_per_channel_collector.p
31
31
  model_compression_toolkit/core/common/collectors/statistics_collector.py,sha256=psijsQZefwjMDH8SU5E18n65HiGtQilPhKr1hhzZX-I,8268
32
32
  model_compression_toolkit/core/common/collectors/weighted_histogram_collector.py,sha256=zp3dE7YTqWmkD5QWdRhsl9zD8W6Lr96G1Wjw1g2D3T0,4894
33
33
  model_compression_toolkit/core/common/fusion/__init__.py,sha256=Rf1RcYmelmdZmBV5qOKvKWF575ofc06JFQSq83Jz99A,696
34
- model_compression_toolkit/core/common/fusion/fusing_info.py,sha256=LfzVS9B6r2KCwf8rcCUdepEQhWkt287SoXfwoudpfFo,15496
34
+ model_compression_toolkit/core/common/fusion/fusing_info.py,sha256=W8qZejLwbm-lkvNF3GepNL3ypO10vFRxOxbq-o_rt_I,15479
35
35
  model_compression_toolkit/core/common/fusion/graph_fuser.py,sha256=F0AaAUBpJ9JjHMB5H2LD9pdwTSWJK-Kqm9dQmGHX1Jo,7368
36
36
  model_compression_toolkit/core/common/graph/__init__.py,sha256=Xr-Lt_qXMdrCnnOaUS_OJP_3iTTGfPCLf8_vSrQgCs0,773
37
- model_compression_toolkit/core/common/graph/base_graph.py,sha256=hedhjVula5rPv0vN0CLBDtPYM8SH3cM6FAL62aFfF7U,41767
38
- model_compression_toolkit/core/common/graph/base_node.py,sha256=CJu8_r80MGVnYmlAUGOGKGRsD9xShMyaRNb3VMeRC0s,34523
37
+ model_compression_toolkit/core/common/graph/base_graph.py,sha256=3OhaMHW01okwFY4mSy0ERFCJk8AZPDs8bCKAmjvmJEI,41893
38
+ model_compression_toolkit/core/common/graph/base_node.py,sha256=Yl6GdjnP_Rt9w1lQUm00CJI0JUAffQF7wr6mur_YfbA,34124
39
39
  model_compression_toolkit/core/common/graph/edge.py,sha256=buoSEUZwilWBK3WeBKpJ-GeDaUA1SDdOHxDpxU_bGpk,3784
40
40
  model_compression_toolkit/core/common/graph/functional_node.py,sha256=GH5wStmw8SoAj5IdT_-ItN1Meo_P5NUTt_5bgJC4fak,3935
41
41
  model_compression_toolkit/core/common/graph/graph_matchers.py,sha256=CrDoHYq4iPaflgJWmoJ1K4ziLrRogJvFTVWg8P0UcDU,4744
@@ -70,12 +70,12 @@ model_compression_toolkit/core/common/mixed_precision/mixed_precision_quantizati
70
70
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_ru_helper.py,sha256=2Pp4hiYvGW2I9YhloDxQNT0sZRg3TDp9CXObloF8IFU,4971
71
71
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_facade.py,sha256=GGrp7QngrWvWtPN8cQnL4IEbNwcVRc-hAUqfnxjjMmk,5998
72
72
  model_compression_toolkit/core/common/mixed_precision/mixed_precision_search_manager.py,sha256=NBzzhkVI407S9cIiw7t7nsP3MrkOdSnweKQdPBXb8to,38180
73
- model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py,sha256=gsigifJ-ykWNafF4t7UMEC_-nd6YPERAk1_z0kT-Y88,27172
73
+ model_compression_toolkit/core/common/mixed_precision/sensitivity_evaluation.py,sha256=4bkM8pYKvk18cxHbx973Dz6qWrNT0MRm44cuk__qVaI,27297
74
74
  model_compression_toolkit/core/common/mixed_precision/set_layer_to_bitwidth.py,sha256=P8QtKgFXtt5b2RoubzI5OGlCfbEfZsAirjyrkFzK26A,2846
75
75
  model_compression_toolkit/core/common/mixed_precision/solution_refinement_procedure.py,sha256=fk7PWiZ6Na5O_Z_dymk_UfDCTqW_X_4EROU7DZknQnc,9444
76
76
  model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/__init__.py,sha256=Rf1RcYmelmdZmBV5qOKvKWF575ofc06JFQSq83Jz99A,696
77
77
  model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization.py,sha256=PKkhc5q8pEPnNLXwo3U56EOCfYnPXIvPs0LlCGZOoKU,4426
78
- model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py,sha256=MP4Q5lThvEIhfa1iBajQQM3nCUNgK-2yseqQQ8Rgiog,40624
78
+ model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_calculator.py,sha256=cjFnpDvxZDE4K2sgt26DhosA2XqhxHDs0eW5Qe7AwAQ,40668
79
79
  model_compression_toolkit/core/common/mixed_precision/resource_utilization_tools/resource_utilization_data.py,sha256=QQwtl08DiDxUOQGpYPnek_RlZjWm1Ky7tL2ESHXMK78,4050
80
80
  model_compression_toolkit/core/common/mixed_precision/search_methods/__init__.py,sha256=sw7LOPN1bM82o3SkMaklyH0jw-TLGK0-fl2Wq73rffI,697
81
81
  model_compression_toolkit/core/common/mixed_precision/search_methods/linear_programming.py,sha256=TaK5NqVdmygsHw9_x5JsJ-BPvlbKA9cRyTno1R8gbnU,7269
@@ -106,13 +106,13 @@ model_compression_toolkit/core/common/quantization/candidate_node_quantization_c
106
106
  model_compression_toolkit/core/common/quantization/core_config.py,sha256=yxCzWqldcHoe8GGxrH0tp99bhrc5jDT7SgZftnMUUBE,2374
107
107
  model_compression_toolkit/core/common/quantization/debug_config.py,sha256=zJP2W9apUPX9RstpPWWK71wr9xJsg7j-s7lGV4_bQdc,1510
108
108
  model_compression_toolkit/core/common/quantization/filter_nodes_candidates.py,sha256=n2A8pO7_DMMae4o69U0I00iW6mzeRlRfKHDxlQUBBuI,7204
109
- model_compression_toolkit/core/common/quantization/node_quantization_config.py,sha256=bRK8c3iH64RGBZ8jZb0i4vVjcEvCxgKX5CdTEmIMtZ4,29077
109
+ model_compression_toolkit/core/common/quantization/node_quantization_config.py,sha256=gL3XUm85FBLvtF60jmWkPxITOBw7cs66scNtC7QHW-M,29471
110
110
  model_compression_toolkit/core/common/quantization/quantization_config.py,sha256=UkSVW7d1OF_Px9gAjsqqK65aYhIBFWaBO-_IH6_AFfg,4403
111
111
  model_compression_toolkit/core/common/quantization/quantization_fn_selection.py,sha256=HfBkSiRTOf9mNF-TNQHTCCs3xSg66F20no0O6vl5v1Y,2154
112
112
  model_compression_toolkit/core/common/quantization/quantization_params_fn_selection.py,sha256=7eG7dl1TcbdnHwgmvyjarxLs0o6Lw_9VAjXAm4rsiBk,3791
113
113
  model_compression_toolkit/core/common/quantization/quantize_graph_weights.py,sha256=N005MSvx8UypVpa7XrxNrB2G732n2wHj3RmLyjTgd3I,2728
114
114
  model_compression_toolkit/core/common/quantization/quantize_node.py,sha256=cdzGNWfT4MRogIU8ehs0tr3lVjnzAI-jeoS9b4TwVBo,2854
115
- model_compression_toolkit/core/common/quantization/set_node_quantization_config.py,sha256=u0pVJawyUTgatn2L8qMNBac2Cut3HSPZSytBGDuBB0k,21341
115
+ model_compression_toolkit/core/common/quantization/set_node_quantization_config.py,sha256=3jyOBaRFwoZQsiyB1nF7ayox1XSo6jf2fDc9V30wKkg,21431
116
116
  model_compression_toolkit/core/common/quantization/quantization_params_generation/__init__.py,sha256=eCDGwsWYLU6z7qbEVb4TozMW_nd5VEP_iCJ6PcvyEPw,1486
117
117
  model_compression_toolkit/core/common/quantization/quantization_params_generation/error_functions.py,sha256=_m-XkEMJMHf0gYwVIXAoHVjdRa2NXt_gYdwBlw76ZR8,24031
118
118
  model_compression_toolkit/core/common/quantization/quantization_params_generation/lut_kmeans_params.py,sha256=RL-PklAjGyC-26anSt8fU07a6pB_LBQFQy9o4e9giN0,8739
@@ -132,20 +132,20 @@ model_compression_toolkit/core/common/statistics_correction/__init__.py,sha256=s
132
132
  model_compression_toolkit/core/common/statistics_correction/apply_activation_bias_correction_to_graph.py,sha256=b05ZwQ2CwG0Q-yqs9A1uHfP8o17aGEZFCeJNP1p4IWk,4450
133
133
  model_compression_toolkit/core/common/statistics_correction/apply_bias_correction_to_graph.py,sha256=b5clhUWGoDaQLn2pDCeYkV0FomVebcKS8pMXtQTTzIg,4679
134
134
  model_compression_toolkit/core/common/statistics_correction/apply_second_moment_correction_to_graph.py,sha256=C_nwhhitTd1pCto0nHZPn3fjIMOeDD7VIciumTR3s6k,5641
135
- model_compression_toolkit/core/common/statistics_correction/compute_activation_bias_correction_of_graph.py,sha256=ov9-WYktWKqRquibwyARR81QVT9TfPWAoTTfnKOQSd0,9273
135
+ model_compression_toolkit/core/common/statistics_correction/compute_activation_bias_correction_of_graph.py,sha256=F8kK8yoYCGeTdXUsHGcM3T2tRdjSlcWg3UToGtovNOs,9196
136
136
  model_compression_toolkit/core/common/statistics_correction/compute_bias_correction_of_graph.py,sha256=LaGhYES7HgIDf9Bi2KAG_mBzAWuum0J6AGmAFPC8wwo,10478
137
137
  model_compression_toolkit/core/common/statistics_correction/statistics_correction.py,sha256=E0ZA4edimJwpHh9twI5gafcoJ9fX5F1JX2QUOkUOKEw,6250
138
138
  model_compression_toolkit/core/common/substitutions/__init__.py,sha256=sw7LOPN1bM82o3SkMaklyH0jw-TLGK0-fl2Wq73rffI,697
139
139
  model_compression_toolkit/core/common/substitutions/apply_substitutions.py,sha256=k-bifmakHIYZeZS-4T1QpZ1Et6AwAijMRgAKs7hmMKc,1390
140
140
  model_compression_toolkit/core/common/substitutions/batchnorm_folding.py,sha256=wLlTT7sqUffKHwOrMG2VV5SktQkkP54l8taW1Fq0mh0,13392
141
- model_compression_toolkit/core/common/substitutions/batchnorm_reconstruction.py,sha256=1389z4NbTKIHYGr-FB-fV1YP1Gcfta0tOu60DwfNVlI,8452
141
+ model_compression_toolkit/core/common/substitutions/batchnorm_reconstruction.py,sha256=kz1Xg2OMNXyRbCW3K-wfZpbv6jmLShJjHYUoziOUNv4,8496
142
142
  model_compression_toolkit/core/common/substitutions/batchnorm_refusing.py,sha256=dWJpVfomF4Ppeeor3VzS23TXHyBm85QI7snyLOYP_ko,9972
143
143
  model_compression_toolkit/core/common/substitutions/linear_collapsing.py,sha256=iEtzbWCDXP6EDkTZCtREQ0rpMxhQ2kM9zlcP_0KLq9I,12367
144
144
  model_compression_toolkit/core/common/substitutions/linear_collapsing_substitution.py,sha256=uoauhmncQqUBNvD-qCLIXsIbl_IzrbxSKdxiMig-5W4,2406
145
145
  model_compression_toolkit/core/common/substitutions/remove_identity.py,sha256=TKU1TIU52UIkVnl0EZvWnDhLV9nIVZ4hqi-w1i4NXMk,2637
146
146
  model_compression_toolkit/core/common/substitutions/residual_collapsing.py,sha256=N82mso5j3EJQlKt9EMHjjEJ67FmdGQeCfN8U5grOFXo,4830
147
147
  model_compression_toolkit/core/common/substitutions/scale_equalization.py,sha256=p57u25qdW2pimxzGwgMXEBV4S-LzXuTVAlIM7830WfU,10966
148
- model_compression_toolkit/core/common/substitutions/shift_negative_activation.py,sha256=oiiN16OqDrax4FPP5VeyTz0rhb0-eZJACKznTBlKkio,30013
148
+ model_compression_toolkit/core/common/substitutions/shift_negative_activation.py,sha256=1utreR5CkJYwaJS1LOCQi_EYkedsnxXzyJCnJ-ZeqQ0,30057
149
149
  model_compression_toolkit/core/common/substitutions/softmax_shift.py,sha256=R-0ZqhYAuZLEFWHvB2UTPm52L6gWHGdRdEnwGxKSeGI,2625
150
150
  model_compression_toolkit/core/common/substitutions/virtual_activation_weights_composition.py,sha256=w43dRmaG96a8SNECgghxoFCTSoZ-vUb33dXGm2PbomE,4251
151
151
  model_compression_toolkit/core/common/substitutions/weights_activation_split.py,sha256=gt07lXRUvYunJKiwv_w20zfXhcplSW4oT2C1dqiNNXc,4719
@@ -198,7 +198,7 @@ model_compression_toolkit/core/keras/hessian/activation_hessian_scores_calculato
198
198
  model_compression_toolkit/core/keras/hessian/hessian_scores_calculator_keras.py,sha256=1o7X9GXSfpEmuB5ee2AaBQ2sN2xzX4-smbrq_0qOGRU,4454
199
199
  model_compression_toolkit/core/keras/hessian/weights_hessian_scores_calculator_keras.py,sha256=Rl6NNGkHMV0ioEM5bbM4XX7yHDqG6mMp4ifN2VQBDxE,12168
200
200
  model_compression_toolkit/core/keras/mixed_precision/__init__.py,sha256=sw7LOPN1bM82o3SkMaklyH0jw-TLGK0-fl2Wq73rffI,697
201
- model_compression_toolkit/core/keras/mixed_precision/configurable_activation_quantizer.py,sha256=aW8wR13fK6P6xzbU9XGU60IO1yYzXSo_Hk4qeq486kg,5137
201
+ model_compression_toolkit/core/keras/mixed_precision/configurable_activation_quantizer.py,sha256=WFwPtCcXR3qY86OML_jyzasvdd2DGhy4-GveAGpDOt0,5075
202
202
  model_compression_toolkit/core/keras/mixed_precision/configurable_weights_quantizer.py,sha256=38Lvwux9L35oT6muck6_FH7nDdH2N8_kuGDMj4-QNpE,6647
203
203
  model_compression_toolkit/core/keras/pruning/__init__.py,sha256=3Lkr37Exk9u8811hw8hVqkGcbTQGcLjd3LLuLC3fa_E,698
204
204
  model_compression_toolkit/core/keras/pruning/pruning_keras_implementation.py,sha256=EJkblZ4OAjI5l29GKsUraam5Jn58Sogld47_rFFyr3k,12777
@@ -268,7 +268,7 @@ model_compression_toolkit/core/pytorch/hessian/activation_hessian_scores_calcula
268
268
  model_compression_toolkit/core/pytorch/hessian/hessian_scores_calculator_pytorch.py,sha256=8f_XlM8ZFVQPNGr1iECr1hv8QusYDrNU_vTkLQZE9RU,2477
269
269
  model_compression_toolkit/core/pytorch/hessian/weights_hessian_scores_calculator_pytorch.py,sha256=UzWxWDbr8koKZatEcPn8RCb0Zjm_7fKTvIGb98sp18k,8487
270
270
  model_compression_toolkit/core/pytorch/mixed_precision/__init__.py,sha256=Rf1RcYmelmdZmBV5qOKvKWF575ofc06JFQSq83Jz99A,696
271
- model_compression_toolkit/core/pytorch/mixed_precision/configurable_activation_quantizer.py,sha256=aEjqqj96iK_G_ebXEiJ8kcHLJWs9NFUevSJTipLux1s,4815
271
+ model_compression_toolkit/core/pytorch/mixed_precision/configurable_activation_quantizer.py,sha256=mcY_KOQgABIqGIMh0x6mNxaKp7SFNbkEIYavR2X7SQ4,4754
272
272
  model_compression_toolkit/core/pytorch/mixed_precision/configurable_weights_quantizer.py,sha256=zp1Xp75IDf9LN5YGO2UzeDbms_6ICQ_pSE1ORQr-SA8,6281
273
273
  model_compression_toolkit/core/pytorch/pruning/__init__.py,sha256=RAe8mgIr1V8dRIQtLf_dSG5zTUCKuQzxyybYx1dzEAs,697
274
274
  model_compression_toolkit/core/pytorch/pruning/pruning_pytorch_implementation.py,sha256=VfEEVwWEXKpVlZFnr7N6mvEjcpq85ROLg05ZvXfD1Pg,14764
@@ -527,7 +527,7 @@ model_compression_toolkit/xquant/pytorch/model_analyzer.py,sha256=b93o800yVB3Z-i
527
527
  model_compression_toolkit/xquant/pytorch/pytorch_report_utils.py,sha256=UVN_S9ULHBEldBpShCOt8-soT8YTQ5oE362y96qF_FA,3950
528
528
  model_compression_toolkit/xquant/pytorch/similarity_functions.py,sha256=CERxq5K8rqaiE-DlwhZBTUd9x69dtYJlkHOPLB54vm8,2354
529
529
  model_compression_toolkit/xquant/pytorch/tensorboard_utils.py,sha256=mkoEktLFFHtEKzzFRn_jCnxjhJolK12TZ5AQeDHzUO8,9767
530
- mct_nightly-2.3.0.20250407.1120.dist-info/METADATA,sha256=3FbL_LGv5kbK8httRgRpIX64Ff6HElqC7NSH2BU5WDQ,27099
531
- mct_nightly-2.3.0.20250407.1120.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
532
- mct_nightly-2.3.0.20250407.1120.dist-info/top_level.txt,sha256=gsYA8juk0Z-ZmQRKULkb3JLGdOdz8jW_cMRjisn9ga4,26
533
- mct_nightly-2.3.0.20250407.1120.dist-info/RECORD,,
530
+ mct_nightly-2.3.0.20250409.529.dist-info/METADATA,sha256=CXFhRMhV90llUM3CZysyq2s0qArtuF_k8oNfFSguoYY,27098
531
+ mct_nightly-2.3.0.20250409.529.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
532
+ mct_nightly-2.3.0.20250409.529.dist-info/top_level.txt,sha256=gsYA8juk0Z-ZmQRKULkb3JLGdOdz8jW_cMRjisn9ga4,26
533
+ mct_nightly-2.3.0.20250409.529.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.3.0.20250407.001120"
30
+ __version__ = "2.3.0.20250409.000529"
@@ -150,7 +150,6 @@ class FusingInfo:
150
150
  """
151
151
  return self.fusing_data
152
152
 
153
-
154
153
  @staticmethod
155
154
  def generate_fused_op_id(nodes: List['BaseNode']) -> str:
156
155
  """
@@ -166,7 +165,7 @@ class FusingInfo:
166
165
  id = FUSED_OP_ID_PREFIX + '_'.join([node.name for node in nodes])
167
166
  return id
168
167
 
169
- def validate(self, graph) -> None:
168
+ def validate(self, graph: 'Graph') -> None:
170
169
  """
171
170
  Validate that the fusing information is consistent with the given graph and generation logic.
172
171
 
@@ -267,7 +266,7 @@ class FusingInfoGenerator:
267
266
  def __init__(self, fusing_patterns):
268
267
  self._fusing_patterns = fusing_patterns
269
268
 
270
- def generate_fusing_info(self, graph) -> FusingInfo:
269
+ def generate_fusing_info(self, graph: 'Graph') -> FusingInfo:
271
270
  """
272
271
  Generate fusing information based on the graph and fusing patterns.
273
272
 
@@ -289,7 +288,7 @@ class FusingInfoGenerator:
289
288
  return FusingInfo(fusing_patterns=self._fusing_patterns)
290
289
 
291
290
  # Find max fusion
292
- max_layers_fusing = 0 if len(self._fusing_patterns) == 0 else max([len(fusing_pattern) for fusing_pattern in self._fusing_patterns])
291
+ max_layers_fusing = max([len(fusing_pattern) for fusing_pattern in self._fusing_patterns])
293
292
 
294
293
  # Travel along the graph to find layers for fusing
295
294
  nodes = graph.get_topo_sorted_nodes()
@@ -331,7 +330,7 @@ def get_valid_fusing_patterns_for_node(fusing_patterns: List[List[Any]],
331
330
  Returns only the fusing patterns where a specific layer (at index idx) matches the given node — either by type or filter params.
332
331
 
333
332
  Args:
334
- fusing_patterns: supported fusings
333
+ fusing_patterns: supported fusing patterns
335
334
  node: node to decide if it can be a part of fusion
336
335
  idx: index of layer in the fusion
337
336
 
@@ -33,6 +33,7 @@ from model_compression_toolkit.core.common.collectors.statistics_collector impor
33
33
  from model_compression_toolkit.core.common.collectors.statistics_collector import scale_statistics, shift_statistics
34
34
  from model_compression_toolkit.core.common.pruning.pruning_section import PruningSection
35
35
  from model_compression_toolkit.core.common.user_info import UserInformation
36
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import ActivationQuantizationMode
36
37
  from model_compression_toolkit.logger import Logger
37
38
  from model_compression_toolkit.target_platform_capabilities.targetplatform2framework import LayerFilterParams
38
39
  from model_compression_toolkit.target_platform_capabilities.targetplatform2framework.framework_quantization_capabilities import \
@@ -920,7 +921,7 @@ class Graph(nx.MultiDiGraph, GraphSearches):
920
921
  nodes_to_disable = [node for nodes in self.fusing_info.get_all_fused_operations().values() for node in nodes[:-1]]
921
922
  for node in nodes_to_disable:
922
923
  for qc in node.candidates_quantization_cfg:
923
- qc.activation_quantization_cfg.enable_activation_quantization = False
924
+ qc.activation_quantization_cfg.quant_mode = ActivationQuantizationMode.FLN_QUANT
924
925
 
925
926
  def validate(self):
926
927
  """
@@ -20,7 +20,8 @@ import numpy as np
20
20
 
21
21
  from model_compression_toolkit.constants import WEIGHTS_NBITS_ATTRIBUTE, CORRECTED_BIAS_ATTRIBUTE, \
22
22
  ACTIVATION_N_BITS_ATTRIBUTE, FP32_BYTES_PER_PARAMETER
23
- from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig
23
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig, \
24
+ ActivationQuantizationMode
24
25
  from model_compression_toolkit.logger import Logger
25
26
  from model_compression_toolkit.target_platform_capabilities.schema.mct_current_schema import QuantizationConfigOptions, \
26
27
  OpQuantizationConfig
@@ -116,33 +117,28 @@ class BaseNode:
116
117
  """
117
118
  return any(isinstance(key, int) for key in self.weights.keys())
118
119
 
120
+ def _is_single_quant_mode(self, q_mode: ActivationQuantizationMode) -> bool:
121
+ """ Check whether all candidates have the same unique quantization mode, and if it is 'q_mode'. """
122
+
123
+ if self.final_activation_quantization_cfg:
124
+ # if we have a final configuration, then we only care to check if it enables activation quantization.
125
+ return self.final_activation_quantization_cfg.quant_mode == q_mode
126
+
127
+ q_modes = {qc.activation_quantization_cfg.quant_mode for qc in self.candidates_quantization_cfg}
128
+ assert len(q_modes) == 1
129
+ return q_modes.pop() == q_mode
130
+
119
131
  def is_activation_quantization_enabled(self) -> bool:
120
132
  """
121
-
122
133
  Returns: Whether node activation quantization is enabled or not.
123
-
124
134
  """
125
- if self.final_activation_quantization_cfg:
126
- # if we have a final configuration, then we only care to check if it enables activation quantization
127
- return self.final_activation_quantization_cfg.enable_activation_quantization
128
-
129
- for qc in self.candidates_quantization_cfg:
130
- assert self.candidates_quantization_cfg[0].activation_quantization_cfg.enable_activation_quantization == \
131
- qc.activation_quantization_cfg.enable_activation_quantization
132
- return self.candidates_quantization_cfg[0].activation_quantization_cfg.enable_activation_quantization
135
+ return self._is_single_quant_mode(ActivationQuantizationMode.QUANT)
133
136
 
134
137
  def is_quantization_preserving(self) -> bool:
135
138
  """
136
139
  Returns: Whether node activation quantization information is preserved from its inputs.
137
140
  """
138
- if self.final_activation_quantization_cfg:
139
- # if we have a final configuration, then we only care to check if it enables activation quantization.
140
- return self.final_activation_quantization_cfg.quantization_preserving
141
-
142
- for qc in self.candidates_quantization_cfg:
143
- assert self.candidates_quantization_cfg[0].activation_quantization_cfg.quantization_preserving == \
144
- qc.activation_quantization_cfg.quantization_preserving
145
- return self.candidates_quantization_cfg[0].activation_quantization_cfg.quantization_preserving
141
+ return self._is_single_quant_mode(ActivationQuantizationMode.PRESERVE_QUANT)
146
142
 
147
143
  def is_weights_quantization_enabled(self, attr_name: str) -> bool:
148
144
  """
@@ -31,7 +31,7 @@ from model_compression_toolkit.core.common.graph.virtual_activation_weights_node
31
31
  from model_compression_toolkit.core.common.mixed_precision.resource_utilization_tools.resource_utilization import \
32
32
  RUTarget, ResourceUtilization
33
33
  from model_compression_toolkit.core.common.quantization.node_quantization_config import NodeWeightsQuantizationConfig, \
34
- NodeActivationQuantizationConfig, BaseNodeQuantizationConfig
34
+ NodeActivationQuantizationConfig, BaseNodeQuantizationConfig, ActivationQuantizationMode
35
35
  from model_compression_toolkit.core.common.substitutions.virtual_activation_weights_composition import \
36
36
  get_input_activation_if_composable
37
37
 
@@ -710,7 +710,7 @@ class ResourceUtilizationCalculator:
710
710
  """
711
711
  if act_qc:
712
712
  assert bitwidth_mode == BitwidthMode.QCustom
713
- return act_qc.activation_n_bits if act_qc.enable_activation_quantization else FLOAT_BITWIDTH
713
+ return act_qc.activation_n_bits if act_qc.quant_mode == ActivationQuantizationMode.QUANT else FLOAT_BITWIDTH
714
714
 
715
715
  if bitwidth_mode == BitwidthMode.Float or not (n.is_activation_quantization_enabled() or
716
716
  n.is_quantization_preserving()):
@@ -20,6 +20,7 @@ from typing import Callable, Any, List, Tuple
20
20
  from model_compression_toolkit.constants import AXIS
21
21
  from model_compression_toolkit.core import FrameworkInfo, MixedPrecisionQuantizationConfig
22
22
  from model_compression_toolkit.core.common import Graph, BaseNode
23
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import ActivationQuantizationMode
23
24
  from model_compression_toolkit.core.common.graph.functional_node import FunctionalNode
24
25
  from model_compression_toolkit.core.common.similarity_analyzer import compute_kl_divergence
25
26
  from model_compression_toolkit.core.common.model_builder_mode import ModelBuilderMode
@@ -207,7 +208,7 @@ class SensitivityEvaluation:
207
208
  if self.disable_activation_for_metric:
208
209
  for n in evaluation_graph.get_topo_sorted_nodes():
209
210
  for c in n.candidates_quantization_cfg:
210
- c.activation_quantization_cfg.enable_activation_quantization = False
211
+ c.activation_quantization_cfg.quant_mode = ActivationQuantizationMode.NO_QUANT
211
212
 
212
213
  model_mp, _, conf_node2layers = self.fw_impl.model_builder(evaluation_graph,
213
214
  mode=ModelBuilderMode.MIXEDPRECISION,
@@ -15,7 +15,7 @@
15
15
 
16
16
 
17
17
  from typing import Callable, Any, List, Tuple, Union, Dict, TYPE_CHECKING
18
-
18
+ from enum import Enum, auto
19
19
  import numpy as np
20
20
 
21
21
  from model_compression_toolkit.core.common.quantization.quantization_fn_selection import get_weights_quantization_fn
@@ -40,6 +40,14 @@ if TYPE_CHECKING:
40
40
  ##########################################
41
41
 
42
42
 
43
+ class ActivationQuantizationMode(Enum):
44
+ """ An enum defining the output activation quantization mode of a node. """
45
+ QUANT = auto()
46
+ FLN_QUANT = auto()
47
+ PRESERVE_QUANT = auto()
48
+ NO_QUANT = auto()
49
+
50
+
43
51
  class BaseNodeQuantizationConfig(object):
44
52
  """
45
53
  Base class for node quantization configuration
@@ -100,8 +108,14 @@ class NodeActivationQuantizationConfig(BaseNodeQuantizationConfig):
100
108
  self.activation_n_bits = op_cfg.activation_n_bits
101
109
  self.relu_bound_to_power_of_2 = qc.relu_bound_to_power_of_2
102
110
  self.activation_bias_correction_term = None
103
- self.enable_activation_quantization = op_cfg.enable_activation_quantization
104
- self.quantization_preserving = op_cfg.quantization_preserving
111
+ if op_cfg.enable_activation_quantization and op_cfg.quantization_preserving:
112
+ raise ValueError("An OpQuantizationConfig can't have both enable_activation_quantization and quantization_preserving enabled.")
113
+ if op_cfg.enable_activation_quantization:
114
+ self.quant_mode = ActivationQuantizationMode.QUANT
115
+ elif op_cfg.quantization_preserving:
116
+ self.quant_mode = ActivationQuantizationMode.PRESERVE_QUANT
117
+ else:
118
+ self.quant_mode = ActivationQuantizationMode.NO_QUANT
105
119
  self.signedness = op_cfg.signedness
106
120
  self.activation_channel_equalization = qc.activation_channel_equalization
107
121
  self.input_scaling = qc.input_scaling
@@ -113,6 +127,17 @@ class NodeActivationQuantizationConfig(BaseNodeQuantizationConfig):
113
127
  self.shift_negative_threshold_recalculation = qc.shift_negative_threshold_recalculation
114
128
  self.concat_threshold_update = qc.concat_threshold_update
115
129
 
130
+ @property
131
+ def enable_activation_quantization(self):
132
+ return self.quant_mode == ActivationQuantizationMode.QUANT
133
+
134
+ @property
135
+ def quantization_preserving(self):
136
+ return self.quant_mode == ActivationQuantizationMode.PRESERVE_QUANT
137
+
138
+ def fln_quantization(self):
139
+ return self.quant_mode == ActivationQuantizationMode.FLN_QUANT
140
+
116
141
  def quantize_node_output(self,
117
142
  tensors: Any) -> Any:
118
143
  """
@@ -181,7 +206,7 @@ class NodeActivationQuantizationConfig(BaseNodeQuantizationConfig):
181
206
  activation_params: Dictionary that contains weight quantization params.
182
207
 
183
208
  """
184
- assert self.enable_activation_quantization
209
+ assert self.quant_mode == ActivationQuantizationMode.QUANT
185
210
  for param_name, param_value in activation_params.items():
186
211
  self.activation_quantization_params[param_name] = param_value
187
212
 
@@ -203,7 +228,7 @@ class NodeActivationQuantizationConfig(BaseNodeQuantizationConfig):
203
228
  self.activation_error_method == other.activation_error_method and \
204
229
  self.activation_quantization_method == other.activation_quantization_method and \
205
230
  self.activation_n_bits == other.activation_n_bits and \
206
- self.enable_activation_quantization == other.enable_activation_quantization and \
231
+ self.quant_mode == other.quant_mode and \
207
232
  self.activation_channel_equalization == other.activation_channel_equalization and \
208
233
  self.input_scaling == other.input_scaling and \
209
234
  self.min_threshold == other.min_threshold and \
@@ -219,7 +244,7 @@ class NodeActivationQuantizationConfig(BaseNodeQuantizationConfig):
219
244
  self.activation_error_method,
220
245
  self.activation_quantization_method,
221
246
  self.activation_n_bits,
222
- self.enable_activation_quantization,
247
+ self.quant_mode,
223
248
  self.activation_channel_equalization,
224
249
  self.input_scaling,
225
250
  self.min_threshold,
@@ -412,17 +437,12 @@ class NodeWeightsQuantizationConfig(BaseNodeQuantizationConfig):
412
437
  # If no specific positional attribute config is found, fall back to the default weight attribute config.
413
438
  if len(attrs_included_in_name) == 0:
414
439
  attr_cfg = op_cfg.default_weight_attr_config
415
- # Register this attribute under the positional attributes config mapping.
416
- self.pos_attributes_config_mapping[attr] = WeightsAttrQuantizationConfig(qc=qc,
417
- weights_attr_cfg=attr_cfg,
418
- weights_channels_axis=
419
- weights_channels_axis)
420
440
  else:
421
441
  # If a specific config was found using POS_ATTR, use it.
422
442
  attr_cfg = list(attrs_included_in_name.values())[0]
423
443
 
424
- # Register this attribute under the regular attributes config mapping.
425
- self.attributes_config_mapping[attr] = WeightsAttrQuantizationConfig(qc=qc,
444
+ # Register this attribute under the positional attributes config mapping.
445
+ self.pos_attributes_config_mapping[attr] = WeightsAttrQuantizationConfig(qc=qc,
426
446
  weights_attr_cfg=attr_cfg,
427
447
  weights_channels_axis=
428
448
  weights_channels_axis)
@@ -25,7 +25,8 @@ from model_compression_toolkit.core.common.framework_info import FrameworkInfo
25
25
  from model_compression_toolkit.core.common.graph.base_graph import Graph
26
26
  from model_compression_toolkit.core.common.quantization.candidate_node_quantization_config import \
27
27
  CandidateNodeQuantizationConfig
28
- from model_compression_toolkit.core.common.quantization.node_quantization_config import NodeActivationQuantizationConfig
28
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import NodeActivationQuantizationConfig, \
29
+ ActivationQuantizationMode
29
30
  from model_compression_toolkit.core.common.quantization.quantization_config import QuantizationConfig, \
30
31
  QuantizationErrorMethod
31
32
  from model_compression_toolkit.core.common.quantization.quantization_params_fn_selection import \
@@ -191,8 +192,9 @@ def set_quantization_configs_to_node(node: BaseNode,
191
192
  node.sort_node_candidates(fw_info)
192
193
 
193
194
  for candidate_qc in node.candidates_quantization_cfg:
194
- candidate_qc.activation_quantization_cfg.enable_activation_quantization = \
195
- candidate_qc.activation_quantization_cfg.enable_activation_quantization and node.get_has_activation()
195
+ if candidate_qc.activation_quantization_cfg.quant_mode == ActivationQuantizationMode.QUANT and \
196
+ not node.get_has_activation():
197
+ candidate_qc.activation_quantization_cfg.quant_mode = ActivationQuantizationMode.NO_QUANT
196
198
 
197
199
 
198
200
  def create_node_activation_qc(qc: QuantizationConfig,
@@ -45,8 +45,7 @@ def get_previous_node_with_activation_quantization(linear_node: BaseNode,
45
45
  activation_quantization_config = prev_node.final_activation_quantization_cfg
46
46
 
47
47
  # Search for node with activation quantization
48
- if (activation_quantization_config.enable_activation_quantization and
49
- not activation_quantization_config.quantization_preserving):
48
+ if activation_quantization_config.enable_activation_quantization:
50
49
  return prev_node
51
50
  else:
52
51
  return get_previous_node_with_activation_quantization(prev_node, graph)
@@ -22,7 +22,8 @@ import numpy as np
22
22
  from model_compression_toolkit.core.common import Graph
23
23
  from model_compression_toolkit.core.common.quantization.quantization_config import QuantizationConfig
24
24
  from model_compression_toolkit.core import common
25
- from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig
25
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig, \
26
+ ActivationQuantizationMode
26
27
  from model_compression_toolkit.logger import Logger
27
28
  from model_compression_toolkit.core.common.graph.base_node import BaseNode
28
29
  from model_compression_toolkit.core.common.graph.graph_matchers import NodeOperationMatcher
@@ -127,7 +128,7 @@ class BatchNormalizationReconstruction(common.BaseSubstitution):
127
128
  bn_node.candidates_quantization_cfg = copy.deepcopy(source_node.candidates_quantization_cfg)
128
129
 
129
130
  for qc in bn_node.candidates_quantization_cfg:
130
- qc.activation_quantization_cfg.enable_activation_quantization = False
131
+ qc.activation_quantization_cfg.quant_mode = ActivationQuantizationMode.NO_QUANT
131
132
  for attr in bn_node.get_node_weights_attributes():
132
133
  if qc.weights_quantization_cfg.has_attribute_config(attr):
133
134
  # we only create a BN layer to collect statistics, so we don't need to quantize anything,
@@ -17,7 +17,8 @@ import numpy as np
17
17
  from typing import List, Tuple, Any, Callable
18
18
 
19
19
  from model_compression_toolkit.core.common.quantization.quantization_config import QuantizationConfig
20
- from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig
20
+ from model_compression_toolkit.core.common.quantization.node_quantization_config import WeightsAttrQuantizationConfig, \
21
+ ActivationQuantizationMode
21
22
  from model_compression_toolkit.logger import Logger
22
23
  from model_compression_toolkit.core.common import FrameworkInfo, Graph, BaseNode
23
24
  from model_compression_toolkit.constants import THRESHOLD, SIGNED, SHIFT_NEGATIVE_NON_LINEAR_NUM_BITS
@@ -363,7 +364,7 @@ def shift_negative_function(graph: Graph,
363
364
  mixed_precision_enable=core_config.is_mixed_precision_enabled)
364
365
 
365
366
  for candidate_qc in pad_node.candidates_quantization_cfg:
366
- candidate_qc.activation_quantization_cfg.enable_activation_quantization = False
367
+ candidate_qc.activation_quantization_cfg.quant_mode = ActivationQuantizationMode.NO_QUANT
367
368
  for attr in pad_node.get_node_weights_attributes():
368
369
  candidate_qc.weights_quantization_cfg.get_attr_config(attr).enable_weights_quantization = False
369
370
 
@@ -64,8 +64,7 @@ class ConfigurableActivationQuantizer(BaseKerasInferableQuantizer):
64
64
  verify_candidates_descending_order(self.node_q_cfg, kernel_attr)
65
65
 
66
66
  for qc in node_q_cfg:
67
- if qc.activation_quantization_cfg.enable_activation_quantization != \
68
- node_q_cfg[0].activation_quantization_cfg.enable_activation_quantization:
67
+ if qc.activation_quantization_cfg.quant_mode != node_q_cfg[0].activation_quantization_cfg.quant_mode:
69
68
  Logger.critical("Unsupported configuration: Mixing candidates with differing activation quantization states (enabled/disabled).") # pragma: no cover
70
69
 
71
70
  self.activation_quantizers = init_activation_quantizers(self.node_q_cfg)
@@ -63,8 +63,7 @@ class ConfigurableActivationQuantizer(BasePyTorchInferableQuantizer):
63
63
  verify_candidates_descending_order(self.node_q_cfg, kernel_attr)
64
64
 
65
65
  for qc in self.node_q_cfg:
66
- if qc.activation_quantization_cfg.enable_activation_quantization != \
67
- self.node_q_cfg[0].activation_quantization_cfg.enable_activation_quantization:
66
+ if qc.activation_quantization_cfg.quant_mode != self.node_q_cfg[0].activation_quantization_cfg.quant_mode:
68
67
  Logger.critical("Unsupported configuration: Mixing candidates with differing activation quantization states (enabled/disabled).") # pragma: no cover
69
68
 
70
69
  # Setting layer's activation