Слои поддельного квантования TensorFlow также вызываются из TF-Lite - PullRequest
1 голос
/ 17 июня 2020

Я использую TensorFlow 2.1 для обучения моделей с обучением с учетом квантования.

Код для этого:

import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)

Это добавит узлы поддельного квантования в график. Эти узлы должны корректировать веса модели, чтобы их было легче квантовать в int8 и работать с данными int8.

Когда обучение заканчивается, я конвертирую и квантую модель в TF-Lite следующим образом:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = [give data provider]
quantized_tflite_model = converter.convert()

На этом этапе я бы не ожидал увидеть слои поддельного квантования на графике TL-Lite. Но, что удивительно, я их вижу. Более того, когда я запускаю эту квантованную модель в TF-Lite C ++ sample app , я вижу, что она также запускает узлы поддельного квантования во время вывода. В дополнение к этому, он также деквантовывает и квантовывает активации между каждым слоем.

Это пример вывода кода C ++:

Встроенный код оператора узла 0 80 FAKE_QUANT
Входы: 1
Выходы: 237
Встроенный код оператора узла 1 114 QUANTIZE
Входы: 237
Выходы: 238
Встроенный код оператора узла 2 3 CONV_2D
Входы: 238 59 58
Выходы: 167
Времена: 378
Встроенный код оператора узла 3 6 DEQUANTIZE
Входы: 167
Выходы: 239
Встроенный код оператора узла 4 80 FAKE_QUANT
Входы: 239
Выходы: 166
Встроенный код оператора узла 5 114 QUANTIZE
Входы: 166
Выходы: 240
Встроенный код оператора узла 6 3 CONV_2D
Входы: 240 61 60
Выходы: 169

Так что я нахожу все это очень странным, учитывая также тот факт, что эта модель должна работать только на int8, и фактически узлы фальшивого квантования получают float32 в качестве входных данных.

Любая помощь ей e был бы признателен.

Ответы [ 2 ]

0 голосов
/ 26 июня 2020

Вы можете заставить TF Lite использовать только операции INT:

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

Если возникает ошибка, значит, на некоторых уровнях вашей сети еще нет реализации INT8.

Более того. вы также можете попробовать исследовать свою сеть, используя Netron .

Тем не менее, если вы также хотите иметь входы и выход INT8, вам также необходимо настроить их:

converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

Однако в настоящее время существует нерешенная проблема, касающаяся ввода и вывода, см. Issue # 38285

0 голосов
/ 23 июня 2020

Репрезентативный набор данных в основном используется для квантования после обучения.

Сравнивая ваши команды с примером QAT, вы, вероятно, захотите удалить эту строку.

https://www.tensorflow.org/model_optimization/guide/quantization/training_example

converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

quantized_tflite_model = converter.convert()


# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()

# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')

with open(quant_file, 'wb') as f:
  f.write(quantized_tflite_model)

with open(float_file, 'wb') as f:
  f.write(float_tflite_model)

print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))
...