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

Я использую 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 ++ пример приложения, я вижу, что оно также запускает узлы фиктивного квантования во время вывода. В дополнение к этому, он также деквантовывает и квантовывает активации между каждым слоем.

Это образец вывода кода C ++:

Встроенный код оператора узла 0 80 FAKE_QUANT
Входы: 1
Выходы: 237
Встроенный код оператора узла 1 114 QUANTIZE
Входы: 237
Выходы: 238
Встроенный код оператора узла 2 3 CONV_2D
Входы: 238 59 58
Выходы: 167
Времена: 378
Встроенный код оператора узла 3 6 ДЕКВАНТИРОВАТЬ
Входы: 167
Выходы: 239
Встроенный оператор узла 4 Код 80 FAKE_QUANT
Входы: 239
Выходы: 166
Встроенный код оператора узла 5 114 QUANTIZE
Входы: 166
Выходы: 240
Встроенный код оператора узла 6 3 CONV_2D
Входы: 240 61 60
Выходы: 169

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

Любая помощь здесь будет оценена по достоинству.


person Ohad Meir    schedule 17.06.2020    source источник
comment
Сравнима ли ваша производительность с неквантованной моделью? То есть, может быть, фальшивые узлы не имеют значения?   -  person Florida Man    schedule 07.10.2020


Ответы (3)


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

Сравнивая ваши команды с примером 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))
person Tiezhen    schedule 22.06.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

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

person lennart    schedule 26.06.2020
comment
К сожалению, это не удаляет слои поддельного квантования с графика, и они все равно вызываются во время вывода. - person Ohad Meir; 26.06.2020
comment
Привет, Меир, ты уже нашел решение? Если да, не могли бы вы добавить это к своему вопросу. Спасибо - person Florida Man; 07.10.2020

Я столкнулся с той же проблемой. В моем случае размер квантованной tflite-модели увеличивается примерно в 3 раза с поддельным квантованием. Вам это приходит в голову? Проверка графа tflite в Netron показывает, что слои квантования вставляются между каждыми операциями.

Мой обходной путь до сих пор состоит в том, чтобы создать новую копию модели без поддельного квантования, а затем загрузить веса по слоям из обученной модели с учетом квантования. Он не может напрямую устанавливать веса для всей модели, потому что поддельные слои квантования тоже имеют параметры.

person iamaman    schedule 17.02.2021