Skip to content

Commit 616631c

Browse files
irenabirenab
authored andcommitted
check final ru satisfies target ru in all mp tests
1 parent c0e4c48 commit 616631c

File tree

3 files changed

+56
-33
lines changed

3 files changed

+56
-33
lines changed

tests/keras_tests/feature_networks_tests/feature_networks/mixed_precision/requires_mixed_precision_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def get_resource_utilization(self):
9292
total_memory=ru_data.total_memory - 1 if self.total_memory else np.inf,
9393
bops=int(ru_data.bops * 0.05) if self.bops else np.inf)
9494

95-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
95+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
9696
if self.weights_memory or self.activation_memory or self.total_memory or self.bops:
9797
self.unit_test.assertTrue(any([i != 0 for i in quantization_info.mixed_precision_cfg]))
9898
else:

tests/keras_tests/feature_networks_tests/feature_networks/mixed_precision_tests.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
# ==============================================================================
15+
import typing
1516

17+
import abc
1618

1719
import numpy as np
1820
import tensorflow as tf
@@ -94,10 +96,18 @@ def create_networks(self):
9496
model = keras.Model(inputs=inputs, outputs=outputs)
9597
return model
9698

99+
@typing.final
97100
def compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
98-
# This is a base test, so it does not check a thing. Only actual tests of mixed precision
99-
# compare things to test.
100-
raise NotImplementedError
101+
# call concrete validation of the specific test
102+
self._compare(quantized_model, float_model, input_x, quantization_info)
103+
# make sure the final utilization satisfies the target constraints
104+
self.unit_test.assertTrue(
105+
self.get_resource_utilization().is_satisfied_by(quantization_info.final_resource_utilization))
106+
107+
@abc.abstractmethod
108+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
109+
# test-specific validation, to be implemented by each test
110+
raise NotImplementedError()
101111

102112
def verify_quantization(self, quantized_model, input_x, weights_layers_idx, weights_layers_channels_size,
103113
activation_layers_idx, unique_tensor_values):
@@ -120,8 +130,6 @@ def verify_quantization(self, quantized_model, input_x, weights_layers_idx, weig
120130
# verifying fake quant nodes output
121131
for layer_out in layer_outs:
122132
self.unit_test.assertTrue(np.unique(layer_out).flatten().shape[0] <= unique_tensor_values)
123-
124-
125133
class MixedPrecisionActivationSearchTest(MixedPrecisionActivationBaseTest):
126134
def __init__(self, unit_test):
127135
super().__init__(unit_test, activation_layers_idx=[1, 2, 4])
@@ -274,7 +282,7 @@ def create_networks(self):
274282
def get_resource_utilization(self):
275283
return ResourceUtilization(3071, 2079)
276284

277-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
285+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
278286
# verify chosen activation bitwidth config
279287
# resource utilization is infinity -> should give best model - 8bits
280288
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
@@ -314,7 +322,7 @@ def get_tpc(self):
314322
def get_resource_utilization(self):
315323
return ResourceUtilization(activation_memory=6507)
316324

317-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
325+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
318326
# verify chosen activation bitwidth config
319327
# resource utilization is infinity -> should give best model - 8bits
320328
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
@@ -361,7 +369,7 @@ def get_tpc(self):
361369
def get_resource_utilization(self):
362370
return ResourceUtilization(np.inf, 6407)
363371

364-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
372+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
365373
# verify chosen activation bitwidth config
366374
# resource utilization is infinity -> should give best model - 8bits
367375
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
@@ -389,7 +397,7 @@ def create_networks(self):
389397
model = keras.Model(inputs=inputs, outputs=x)
390398
return model
391399

392-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
400+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
393401
# verify chosen activation bitwidth config
394402
# resource utilization is infinity -> should give best model - 8bits
395403
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
@@ -436,7 +444,7 @@ def create_networks(self):
436444
model = keras.Model(inputs=[inputs_1, inputs_2, inputs_3, inputs_4], outputs=outputs)
437445
return model
438446

439-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
447+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
440448
# verify chosen activation bitwidth config
441449
# resource utilization is infinity -> should give best model - 8bits
442450
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
@@ -458,7 +466,7 @@ def get_resource_utilization(self):
458466
# 17920: 8-bit weights, 6176: max cut of input+conv_bn
459467
return ResourceUtilization(np.inf, np.inf, total_memory=(17920 + 6176) * 4 / 8)
460468

461-
def compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
469+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
462470
# verify chosen activation bitwidth config
463471
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)[1:]
464472
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in holder_layers]
@@ -480,7 +488,7 @@ def get_resource_utilization(self):
480488
activation = 6176 * 4 / 8
481489
return ResourceUtilization(weights, activation, total_memory=weights + activation)
482490

483-
def compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
491+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
484492
# verify chosen activation bitwidth config
485493
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)[1:]
486494
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in holder_layers]
@@ -509,7 +517,7 @@ def get_resource_utilization(self):
509517
activation = 6176 * 4 / 8 # max cut of input + conv_bn
510518
return ResourceUtilization(weights, activation, total_memory=(weights + activation) / 2)
511519

512-
def compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
520+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
513521
# verify chosen activation bitwidth config
514522
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)[1:]
515523
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in holder_layers]
@@ -565,7 +573,7 @@ def create_networks(self):
565573
model = keras.Model(inputs=inputs, outputs=x)
566574
return model
567575

568-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
576+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
569577
# verify chosen activation bitwidth config
570578
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
571579
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in holder_layers]
@@ -602,7 +610,7 @@ def create_networks(self):
602610
model = keras.Model(inputs=inputs, outputs=x)
603611
return model
604612

605-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
613+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
606614
# verify chosen activation bitwidth config
607615
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
608616
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in
@@ -668,7 +676,7 @@ def get_tpc(self):
668676
def get_resource_utilization(self):
669677
return ResourceUtilization(np.inf, 5410)
670678

671-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
679+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
672680
holder_layers = get_layers_from_model_by_type(quantized_model, KerasActivationQuantizationHolder)
673681

674682
activation_bits = [layer.activation_holder_quantizer.get_config()['num_bits'] for layer in holder_layers]

tests/keras_tests/feature_networks_tests/feature_networks/weights_mixed_precision_tests.py

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
# ==============================================================================
15+
import abc
1516

17+
import typing
1618

1719
import numpy as np
1820
import tensorflow as tf
@@ -65,10 +67,23 @@ def create_networks(self):
6567
model = keras.Model(inputs=inputs, outputs=outputs)
6668
return model
6769

70+
def get_resource_utilization(self):
71+
raise NotImplementedError()
72+
73+
@typing.final
6874
def compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
69-
# This is a base test, so it does not check a thing. Only actual tests of mixed precision
70-
# compare things to test.
71-
raise NotImplementedError
75+
# call concrete validation of the specific test
76+
self._compare(quantized_model, float_model, input_x, quantization_info)
77+
# make sure the final utilization satisfies the target constraints
78+
target_ru = self.get_resource_utilization()
79+
if target_ru.is_any_restricted():
80+
self.unit_test.assertTrue(
81+
target_ru.is_satisfied_by(quantization_info.final_resource_utilization))
82+
83+
@abc.abstractmethod
84+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info: UserInformation = None):
85+
# test-specific validation, to be implemented by each test
86+
raise NotImplementedError()
7287

7388

7489
class MixedPrecisionManuallyConfiguredTest(MixedPrecisionBaseTest):
@@ -95,7 +110,7 @@ def get_resource_utilization(self):
95110
# set manually)
96111
return ResourceUtilization(1)
97112

98-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
113+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
99114
assert quantization_info.mixed_precision_cfg == [2, 1]
100115
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
101116
self.unit_test.assertTrue(np.unique(conv_layers[0].weights[0]).flatten().shape[0] <= 4)
@@ -114,7 +129,7 @@ def get_mixed_precision_config(self):
114129
return mct.core.MixedPrecisionQuantizationConfig(num_of_images=1,
115130
distance_weighting_method=self.distance_metric)
116131

117-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
132+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
118133
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
119134
self.unit_test.assertTrue(any([b != 0 for b in quantization_info.mixed_precision_cfg]),
120135
"At least one of the conv layers is expected to be quantized to meet the required "
@@ -147,7 +162,7 @@ def get_mixed_precision_config(self):
147162
distance_weighting_method=self.distance_metric,
148163
use_hessian_based_scores=True)
149164

150-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
165+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
151166
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
152167
self.unit_test.assertTrue(any([b != 0 for b in quantization_info.mixed_precision_cfg]),
153168
"At least one of the conv layers is expected to be quantized to meet the required "
@@ -220,7 +235,7 @@ def create_networks(self):
220235
def get_resource_utilization(self):
221236
return ResourceUtilization(1790)
222237

223-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
238+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
224239
# We just needed to verify that the graph finalization is working without failing.
225240
# The actual quantization is not interesting for the sake of this test, so we just verify some
226241
# degenerated things to see that everything worked.
@@ -242,7 +257,7 @@ def get_resource_utilization(self):
242257
# Resource Utilization is for 4 bits on average
243258
return ResourceUtilization(17920 * 4 / 8)
244259

245-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
260+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
246261
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
247262
assert (quantization_info.mixed_precision_cfg == [1, 1]).all()
248263
for i in range(32): # quantized per channel
@@ -283,7 +298,7 @@ def create_networks(self):
283298
model = keras.Model(inputs=inputs, outputs=outputs)
284299
return model
285300

286-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
301+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
287302
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
288303
self.unit_test.assertTrue((quantization_info.mixed_precision_cfg != 0).any())
289304

@@ -308,7 +323,7 @@ def get_resource_utilization(self):
308323
# Resource Utilization is for 2 bits on average
309324
return ResourceUtilization(17920 * 2 / 8)
310325

311-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
326+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
312327
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
313328
assert (quantization_info.mixed_precision_cfg == [2, 2]).all()
314329
for i in range(32): # quantized per channel
@@ -335,7 +350,7 @@ def __init__(self, unit_test):
335350
def get_resource_utilization(self):
336351
return self.target_total_ru
337352

338-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
353+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
339354
# No need to verify quantization configuration here since this test is similar to other tests we have,
340355
# we're only interested in the ResourceUtilization
341356
self.unit_test.assertTrue(quantization_info.final_resource_utilization.activation_memory <=
@@ -351,7 +366,7 @@ def __init__(self, unit_test):
351366
def get_resource_utilization(self):
352367
return self.target_total_ru
353368

354-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
369+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
355370
# No need to verify quantization configuration here since this test is similar to other tests we have,
356371
# we're only interested in the ResourceUtilization
357372
self.unit_test.assertTrue(
@@ -373,7 +388,7 @@ def create_networks(self):
373388
model = keras.Model(inputs=inputs, outputs=x)
374389
return model
375390

376-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
391+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
377392
self.unit_test.assertTrue(len(quantization_info.mixed_precision_cfg) == 1)
378393
self.unit_test.assertTrue(quantization_info.mixed_precision_cfg[0] == 1)
379394

@@ -426,7 +441,7 @@ def get_resource_utilization(self):
426441
# resource utilization is infinity -> should give best model - 8bits
427442
return ResourceUtilization(17919)
428443

429-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
444+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
430445
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
431446
assert (quantization_info.mixed_precision_cfg == [0, 1]).all()
432447
for i in range(32): # quantized per channel
@@ -449,7 +464,7 @@ def get_mixed_precision_config(self):
449464
def get_resource_utilization(self):
450465
return ResourceUtilization(17919)
451466

452-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
467+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
453468
conv_layers = get_layers_from_model_by_type(quantized_model, layers.Conv2D)
454469
assert any([(quantization_info.mixed_precision_cfg == [1, 0]).all(),
455470
(quantization_info.mixed_precision_cfg == [0, 1]).all()])
@@ -526,7 +541,7 @@ def get_tpc(self):
526541
def get_resource_utilization(self):
527542
return ResourceUtilization(1535)
528543

529-
def compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
544+
def _compare(self, quantized_model, float_model, input_x=None, quantization_info=None):
530545
wrapper_layers = get_layers_from_model_by_type(quantized_model, KerasQuantizationWrapper)
531546
weights_bits = wrapper_layers[0].weights_quantizers[KERNEL].num_bits
532547
self.unit_test.assertTrue(weights_bits == 4)

0 commit comments

Comments
 (0)