Introduce DEFAULT_OPTIMIZE that is the recommendation to users.

PiperOrigin-RevId: 244947265
This commit is contained in:
Suharsh Sivakumar 2019-04-23 16:24:31 -07:00 committed by TensorFlower Gardener
parent d7cd03f139
commit 4c71972982
4 changed files with 39 additions and 29 deletions

View File

@ -75,6 +75,14 @@ class Optimize(enum.Enum):
Some optimizations may come at the cost of accuracy.
"""
# Default optimization strategy.
#
# Converter will do its best to improve size and latency based on the
# information provided.
# Enhanced optimizations can be gained by providing a representative_dataset.
# Currently this is recommended, and is equivalent to the modes below.
DEFAULT = "DEFAULT"
# Optimize for size.
#
# Optimizations that reduce the size of the model.
@ -153,12 +161,7 @@ class TFLiteConverterV2(object):
target_spec: Experimental flag, subject to change. Specification of target
device.
optimizations: Experimental flag, subject to change. A list of optimizations
to apply when converting the model. The converter applies the
optimizations by giving priority to the optimizations specified earlier in
the list. E.g. `[optimize.OPTIMIZE_FOR_SIZE,
optimize.OPTIMIZE_FOR_LATENCY]` requires the converter to do both size and
latency optimizations giving priority to size optimizations over latency
optimizations.
to apply when converting the model. E.g. `[Optimize.DEFAULT]
representative_dataset: A representative dataset that can be used to
generate input and output samples for the model. The converter can use the
dataset to evaluate different optimizations.
@ -332,8 +335,10 @@ class TFLiteConverterV2(object):
# training optimizations.
post_training_optimize = bool(
len(
set(self.optimizations)
& set([Optimize.OPTIMIZE_FOR_LATENCY, Optimize.OPTIMIZE_FOR_SIZE])))
set(self.optimizations).intersection([
Optimize.OPTIMIZE_FOR_LATENCY, Optimize.OPTIMIZE_FOR_SIZE,
Optimize.DEFAULT
])))
# Do weights only quantization if there is no dataset for calibration.
weights_only_quantize_flag = (
post_training_optimize and (self.representative_dataset is None))
@ -355,7 +360,8 @@ class TFLiteConverterV2(object):
if self.representative_dataset and post_training_optimize:
calibrate_quantize = _calibrator.Calibrator(result)
result = calibrate_quantize.calibrate_and_quantize(
self.representative_dataset.input_gen)
self.representative_dataset.input_gen, constants.FLOAT,
constants.FLOAT)
return result
@ -416,7 +422,7 @@ class TFLiteConverter(object):
these to the TensorFlow Lite runtime with a custom resolver.
(default False)
post_training_quantize: deprecated, please specify
`[optimize.OPTIMIZE_FOR_SIZE]` for `optimizations` instead. Boolean
`[Optimize.DEFAULT]` for `optimizations` instead. Boolean
indicating whether to quantize the weights of the converted float model.
Model size will be reduced and there will be latency improvements
(at the cost of accuracy). (default False)
@ -429,13 +435,8 @@ class TFLiteConverter(object):
target_ops: Experimental flag, subject to change. Set of OpsSet
options indicating which converter to use.
(default set([OpsSet.TFLITE_BUILTINS]))
optimizations: Experimental flag, subject to change, A list of
optimizations to apply when converting the model. The converter applies
the optimizations by giving priority to the optimizations specified
earlier in the list. E.g.
`[optimize.OPTIMIZE_FOR_SIZE, optimize.OPTIMIZE_FOR_LATENCY]` requires
the converter to do both size and latency optimizations giving priority
to size optimizations over latency optimizations.
optimizations: Experimental flag, subject to change. A list of optimizations
to apply when converting the model. E.g. `[Optimize.DEFAULT]`
representative_dataset: A representative dataset that can be used to
generate input and output samples for the model. The converter can use
the dataset to evaluate different optimizations.
@ -733,11 +734,10 @@ class TFLiteConverter(object):
def __setattr__(self, name, value):
if name == "post_training_quantize":
warnings.warn("Property %s is deprecated, "
"please use optimizations=[Optimize.OPTIMIZE_FOR_SIZE]"
"please use optimizations=[Optimize.DEFAULT]"
" instead." % name)
if value:
# Use OPTIMIZE_FOR_SIZE for post training for now.
self.optimizations = [Optimize.OPTIMIZE_FOR_SIZE]
self.optimizations = [Optimize.DEFAULT]
else:
self.optimizations = []
return
@ -746,9 +746,9 @@ class TFLiteConverter(object):
def __getattribute__(self, name):
if name == "post_training_quantize":
warnings.warn("Property %s is deprecated, "
"please use optimizations=[Optimize.OPTIMIZE_FOR_SIZE]"
"please use optimizations=[Optimize.DEFAULT]"
" instead." % name)
return Optimize.OPTIMIZE_FOR_SIZE in set(self.optimizations)
return Optimize.DEFAULT in set(self.optimizations)
return object.__getattribute__(self, name)
def convert(self):
@ -805,8 +805,11 @@ class TFLiteConverter(object):
"Provide an input generator for representative_dataset")
post_training_optimize = bool(
len(set(self.optimizations) & set([Optimize.OPTIMIZE_FOR_LATENCY,
Optimize.OPTIMIZE_FOR_SIZE])))
len(
set(self.optimizations).intersection([
Optimize.OPTIMIZE_FOR_LATENCY, Optimize.OPTIMIZE_FOR_SIZE,
Optimize.DEFAULT
])))
# Do weights only quantization if there is no dataset for calibration.
weights_only_quantize_flag = (
post_training_optimize and (self.representative_dataset is None))

View File

@ -502,8 +502,7 @@ class FromSessionTest(test_util.TensorFlowTestCase):
quantized_converter.post_training_quantize = True
self.assertTrue(quantized_converter.post_training_quantize)
self.assertEqual(quantized_converter.optimizations,
[lite.Optimize.OPTIMIZE_FOR_SIZE])
self.assertEqual(quantized_converter.optimizations, [lite.Optimize.DEFAULT])
quantized_tflite = quantized_converter.convert()
self.assertTrue(quantized_tflite)
@ -531,7 +530,7 @@ class FromSessionTest(test_util.TensorFlowTestCase):
# Convert quantized weights model.
quantized_converter = lite.TFLiteConverter.from_session(
sess, [in_tensor_1], [out_tensor])
quantized_converter.optimizations = [lite.Optimize.OPTIMIZE_FOR_SIZE]
quantized_converter.optimizations = [lite.Optimize.DEFAULT]
quantized_tflite = quantized_converter.convert()
self.assertTrue(quantized_tflite)
@ -563,7 +562,7 @@ class FromSessionTest(test_util.TensorFlowTestCase):
# Convert quantized weights model.
quantized_converter = lite.TFLiteConverter.from_session(
sess, [inp], [output])
quantized_converter.optimizations = [lite.Optimize.OPTIMIZE_FOR_SIZE]
quantized_converter.optimizations = [lite.Optimize.DEFAULT]
quantized_converter.representative_dataset = calibration_gen
quantized_tflite = quantized_converter.convert()
self.assertTrue(quantized_tflite)
@ -608,7 +607,7 @@ class FromSessionTest(test_util.TensorFlowTestCase):
sess, [inp], [output])
quantized_converter.inference_input_type = lite_constants.INT8
quantized_converter.inference_output_type = lite_constants.INT8
quantized_converter.optimizations = [lite.Optimize.OPTIMIZE_FOR_SIZE]
quantized_converter.optimizations = [lite.Optimize.DEFAULT]
quantized_converter.representative_dataset = calibration_gen
quantized_tflite = quantized_converter.convert()
self.assertTrue(quantized_tflite)

View File

@ -1,6 +1,10 @@
path: "tensorflow.lite.Optimize"
tf_class {
is_instance: "<enum \'Optimize\'>"
member {
name: "DEFAULT"
mtype: "<enum \'Optimize\'>"
}
member {
name: "OPTIMIZE_FOR_LATENCY"
mtype: "<enum \'Optimize\'>"

View File

@ -1,6 +1,10 @@
path: "tensorflow.lite.Optimize"
tf_class {
is_instance: "<enum \'Optimize\'>"
member {
name: "DEFAULT"
mtype: "<enum \'Optimize\'>"
}
member {
name: "OPTIMIZE_FOR_LATENCY"
mtype: "<enum \'Optimize\'>"