Совместимость операторов LiteRT и TensorFlow

Операторы машинного обучения (ML), которые вы используете в своей модели, могут повлиять на процесс преобразования модели TensorFlow в формат LiteRT. Конвертер LiteRT поддерживает ограниченное количество операций TensorFlow, используемых в общих моделях вывода, а это означает, что не каждая модель может быть преобразована напрямую. Инструмент конвертера позволяет включать дополнительные операторы, но преобразование модели таким способом также требует изменения среды выполнения LiteRT, которую вы используете для выполнения модели, что может ограничить ваши возможности использования стандартных вариантов развертывания среды выполнения, таких как службы Google Play .

LiteRT Converter предназначен для анализа структуры модели и применения оптимизаций, чтобы сделать ее совместимой с напрямую поддерживаемыми операторами. Например, в зависимости от операторов ML в вашей модели преобразователь может исключать или объединять эти операторы, чтобы сопоставить их с их аналогами LiteRT.

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

Поддерживаемые операторы

Встроенные операторы LiteRT — это подмножество операторов, которые являются частью базовой библиотеки TensorFlow. Ваша модель TensorFlow также может включать пользовательские операторы в форме составных операторов или новых операторов, определенных вами. На диаграмме ниже показаны отношения между этими операторами.

Операторы TensorFlow

Из этого диапазона операторов моделей ML есть 3 типа моделей, поддерживаемых процессом преобразования:

  1. Модели только со встроенным оператором LiteRT. ( Рекомендуется )
  2. Модели со встроенными операторами и избранными основными операторами TensorFlow.
  3. Модели со встроенными операторами, базовыми операторами TensorFlow и/или пользовательскими операторами.

Если ваша модель содержит только операции, которые изначально поддерживаются LiteRT, вам не нужны дополнительные флаги для ее преобразования. Это рекомендуемый путь, поскольку этот тип модели будет плавно конвертироваться, его проще оптимизировать и запускать с использованием среды выполнения LiteRT по умолчанию. У вас также есть дополнительные варианты развертывания вашей модели, например, сервисы Google Play . Вы можете начать работу с руководством по конвертеру LiteRT . См. страницу LiteRT Ops для получения списка встроенных операторов.

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

По возможности избегайте последнего варианта включения пользовательских операторов в преобразованную модель. Пользовательские операторы — это либо операторы, созданные путем объединения нескольких примитивных операторов ядра TensorFlow, либо определение совершенно нового. При преобразовании пользовательских операторов они могут увеличить размер общей модели за счет зависимостей за пределами встроенной библиотеки LiteRT. Пользовательские операции, если они не созданы специально для развертывания мобильных устройств или устройств, могут привести к ухудшению производительности при развертывании на устройствах с ограниченными ресурсами по сравнению с серверной средой. Наконец, так же, как и при включении некоторых основных операторов TensorFlow, пользовательские операторы требуют изменения среды выполнения модели , что ограничивает возможность использования стандартных сервисов времени выполнения, таких как сервисы Google Play .

Поддерживаемые типы

Большинство операций LiteRT предназначены как для вывода с плавающей запятой ( float32 ), так и для квантованного вывода ( uint8 , int8 ), но многие операции еще не предназначены для других типов, таких как tf.float16 и строки.

Помимо использования разных версий операций, еще одно различие между моделями с плавающей запятой и квантованными моделями заключается в способе их преобразования. Квантованное преобразование требует информации о динамическом диапазоне для тензоров. Это требует «ложного квантования» во время обучения модели, получения информации о диапазоне через набор калибровочных данных или выполнения оценки диапазона «на лету». См. квантование для более подробной информации.

Простые преобразования, постоянное свертывание и слияние

LiteRT может обрабатывать ряд операций TensorFlow, даже если они не имеют прямого эквивалента. Это относится к операциям, которые можно просто удалить из графа ( tf.identity ), заменить тензорами ( tf.placeholder ) или объединить в более сложные операции ( tf.nn.bias_add ). Даже некоторые поддерживаемые операции иногда могут быть удалены с помощью одного из этих процессов.

Вот неисчерпывающий список операций TensorFlow, которые обычно удаляются из графа:

  • tf.add
  • tf.debugging.check_numerics
  • tf.constant
  • tf.div
  • tf.divide
  • tf.fake_quant_with_min_max_args
  • tf.fake_quant_with_min_max_vars
  • tf.identity
  • tf.maximum
  • tf.minimum
  • tf.multiply
  • tf.no_op
  • tf.placeholder
  • tf.placeholder_with_default
  • tf.realdiv
  • tf.reduce_max
  • tf.reduce_min
  • tf.reduce_sum
  • tf.rsqrt
  • tf.shape
  • tf.sqrt
  • tf.square
  • tf.subtract
  • tf.tile
  • tf.nn.batch_norm_with_global_normalization
  • tf.nn.bias_add
  • tf.nn.fused_batch_norm
  • tf.nn.relu
  • tf.nn.relu6

Экспериментальные операции

Следующие операции LiteRT присутствуют, но не готовы для пользовательских моделей:

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF