Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Квантование после обучения

Квантование после обучения - это метод преобразования, который может уменьшить размер модели, а также улучшить задержку ЦП и аппаратного ускорителя с небольшим ухудшением точности модели. Вы можете квантовать уже обученную модель TensorFlow с плавающей точкой, когда вы конвертируете ее в формат TensorFlow Lite с помощью TensorFlow Lite Converter .

Методы оптимизации

Есть несколько вариантов квантования после обучения на выбор. Вот сводная таблица вариантов и преимуществ, которые они предоставляют:

Техника Преимущества Оборудование
Квантование динамического диапазона В 4 раза меньше, ускорение в 2–3 раза ЦПУ
Полное целочисленное квантование В 4 раза меньше, в 3 раза + ускорение CPU, Edge TPU, микроконтроллеры
Квантование Float16 В 2 раза меньше, ускорение графического процессора CPU, GPU

Следующее дерево решений может помочь определить, какой метод квантования после обучения лучше всего подходит для вашего варианта использования:

варианты оптимизации после обучения

Квантование динамического диапазона

В простейшей форме посттренировочного квантования статически квантуются только веса из числа с плавающей запятой в целое число с точностью до 8 бит:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

При выводе веса преобразуются из 8-битной точности в числа с плавающей запятой и вычисляются с использованием ядер с плавающей запятой. Это преобразование выполняется один раз и кэшируется для уменьшения задержки.

Чтобы еще больше уменьшить задержку, операторы «динамического диапазона» динамически квантуют активации в соответствии с их диапазоном до 8-битных значений и выполняют вычисления с 8-битными весовыми коэффициентами и активациями. Эта оптимизация обеспечивает задержки, близкие к выводу с полностью фиксированной точкой. Однако выходные данные по-прежнему сохраняются с использованием чисел с плавающей запятой, так что ускорение с помощью операций динамического диапазона меньше, чем полное вычисление с фиксированной запятой.

Полное целочисленное квантование

Вы можете получить дополнительные улучшения задержки, сокращение пикового использования памяти и совместимость с аппаратными устройствами или ускорителями только для целых чисел, убедившись, что вся математика модели целочисленно квантована.

Для полного целочисленного квантования вам необходимо измерить динамический диапазон активаций и входов путем подачи выборки входных данных в преобразователь. Обратитесь к функции representative_dataset_gen() используемой в следующем коде.

Целое число с резервным значением с плавающей запятой (с использованием ввода / вывода с плавающей запятой по умолчанию)

Чтобы полностью квантовать модель целыми числами, но использовать операторы с плавающей запятой, когда они не имеют целочисленной реализации (чтобы преобразование происходило плавно), выполните следующие действия:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
tflite_quant_model = converter.convert()

Только целое число

Создание только целочисленных моделей - распространенный вариант использования TensorFlow Lite для микроконтроллеров и TPU Coral Edge .

Кроме того, чтобы обеспечить совместимость с целочисленными устройствами (такими как 8-битные микроконтроллеры) и ускорителями (такими как Coral Edge TPU), вы можете принудительно применить полное целочисленное квантование для всех операций, включая ввод и вывод, выполнив следующие действия:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Квантование Float16

Вы можете уменьшить размер модели с плавающей запятой, квантовав веса до float16, стандарта IEEE для 16-битных чисел с плавающей запятой. Чтобы включить квантование весов float16, выполните следующие действия:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

Преимущества квантования float16 следующие:

  • Это уменьшает размер модели почти вдвое (так как все веса становятся вдвое меньше исходного размера).
  • Это вызывает минимальную потерю точности.
  • Он поддерживает некоторые делегаты (например, делегат графического процессора), которые могут работать непосредственно с данными типа float16, что приводит к более быстрому выполнению, чем вычисления с плавающей точкой 32.

Недостатки квантования float16 следующие:

  • Это не уменьшает задержку так сильно, как квантование по математике с фиксированной запятой.
  • По умолчанию, квантованная модель float16 будет «деквантовать» значения весов до float32 при запуске на CPU. (Обратите внимание, что делегат GPU не будет выполнять это деквантование, так как он может работать с данными типа float16.)

Только целое число: 16-битные активации с 8-битными весами (экспериментально)

Это экспериментальная схема квантования. Это похоже на схему «только целое число», но активации квантуются на основе их диапазона до 16 бит, веса квантуются в 8-битовое целое число, а смещение квантуется в 64-битное целое число. Далее это называется квантованием 16x8.

Основное преимущество этого квантования заключается в том, что оно может значительно повысить точность, но лишь немного увеличить размер модели.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

Если квантование 16x8 не поддерживается для некоторых операторов в модели, то модель все равно можно квантовать, но неподдерживаемые операторы остаются в плавающем положении. Для этого в target_spec необходимо добавить следующую опцию.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

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

Недостатком такого квантования является:

  • В настоящее время вывод заметно медленнее, чем 8-битное полное целое число, из-за отсутствия оптимизированной реализации ядра.
  • В настоящее время он несовместим с существующими делегатами TFLite с аппаратным ускорением.

Учебное пособие по этому режиму квантования можно найти здесь .

Точность модели

Поскольку веса квантуются после обучения, возможна потеря точности, особенно для небольших сетей. Предварительно обученные полностью квантованные модели предоставляются для конкретных сетей в репозитории моделей TensorFlow Lite . Важно проверить точность квантованной модели, чтобы убедиться, что любое ухудшение точности находится в допустимых пределах. Существуют инструменты для оценки точности модели TensorFlow Lite .

В качестве альтернативы, если падение точности слишком велико, рассмотрите возможность использования обучения с учетом квантования . Однако для этого требуются модификации во время обучения модели, чтобы добавить поддельные узлы квантования, тогда как методы квантования после обучения на этой странице используют существующую предварительно обученную модель.

Представление квантованных тензоров

8-битное квантование приближает значения с плавающей запятой по следующей формуле.

$$real\_value = (int8\_value - zero\_point) \times scale$$

Представление состоит из двух основных частей:

  • По оси (также по каналу) или по тензору веса, представленные int8 двумя дополнительными значениями в диапазоне [-127, 127] с нулевой точкой, равной 0.

  • Активации / входы на тензор, представленные int8 двумя дополнительными значениями в диапазоне [-128, 127], с нулевой точкой в ​​диапазоне [-128, 127].

Для детального просмотра нашей схемы квантования, пожалуйста, смотрите нашу спецификацию квантования . Производителям оборудования, которые хотят подключиться к интерфейсу делегата TensorFlow Lite, рекомендуется реализовать описанную там схему квантования.