Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Делегаты TensorFlow Lite

Вступление

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

По умолчанию TensorFlow Lite использует ядра ЦП, оптимизированные для набора инструкций ARM Neon . Однако ЦП - это многоцелевой процессор, который не обязательно оптимизирован для тяжелой арифметики, которая обычно встречается в моделях машинного обучения (например, матричная математика, используемая в свертке и плотных слоях).

С другой стороны, большинство современных мобильных телефонов содержат чипы, которые лучше справляются с этими тяжелыми операциями. Их использование для операций нейронной сети дает огромные преимущества с точки зрения задержки и энергоэффективности. Например, графические процессоры могут обеспечить пятикратное ускорение задержки, в то время как Qualcomm® Hexagon DSP в наших экспериментах показал снижение энергопотребления до 75%.

Каждый из этих ускорителей имеет связанные API-интерфейсы, которые позволяют настраивать вычисления, такие как OpenCL или OpenGL ES для мобильных графических процессоров и Qualcomm® Hexagon SDK для DSP. Как правило, для запуска нейронной сети через эти интерфейсы приходится писать много специального кода. Все становится еще сложнее, если учесть, что каждый ускоритель имеет свои плюсы и минусы и не может выполнять все операции в нейронной сети. API делегата TensorFlow Lite решает эту проблему, выступая в качестве моста между средой выполнения TFLite и этими API нижнего уровня.

время выполнения с делегатами

Выбор делегата

TensorFlow Lite поддерживает несколько делегатов, каждый из которых оптимизирован для определенных платформ и конкретных типов моделей. Обычно для вашего варианта использования будет несколько делегатов, в зависимости от двух основных критериев: целевой платформы (Android или iOS?) И типа модели (с плавающей запятой или квантованной?), Который вы пытаетесь ускорить. .

Делегаты по платформам

Кроссплатформенность (Android и iOS)

  • Делегат GPU - делегат GPU можно использовать как на Android, так и на iOS. Он оптимизирован для запуска 32-битных и 16-битных моделей с плавающей запятой, где доступен графический процессор. Он также поддерживает 8-битные квантованные модели и обеспечивает производительность графического процессора на уровне их версий с плавающей запятой. Дополнительные сведения о делегате GPU см. В разделе TensorFlow Lite на GPU . Пошаговые инструкции по использованию делегата GPU с Android и iOS см. В разделе TensorFlow Lite GPU Delegate Tutorial .

Android

  • Делегат NNAPI для новых устройств Android - делегат NNAPI можно использовать для ускорения моделей на устройствах Android с доступными GPU, DSP и / или NPU. Он доступен в Android 8.1 (API 27+) или выше. Обзор делегата NNAPI, пошаговые инструкции и лучшие практики см. В разделе Делегат NNAPI в TensorFlow Lite .
  • Делегат Hexagon для старых устройств Android - делегат Hexagon может использоваться для ускорения моделей на устройствах Android с Qualcomm Hexagon DSP. Его можно использовать на устройствах под управлением более старых версий Android, не поддерживающих NNAPI. Подробнее см. Делегат TensorFlow Lite Hexagon .

iOS

  • Делегат Core ML для новых iPhone и iPad - для новых iPhone и iPad, где доступен Neural Engine, вы можете использовать делегат Core ML для ускорения вывода для 32-битных или 16-битных моделей с плавающей запятой. Neural Engine доступен для мобильных устройств Apple с процессором A12 SoC или выше. Обзор делегата Core ML и пошаговые инструкции см. В разделе Делегат Core ML TensorFlow Lite .

Делегаты по типу модели

Каждый ускоритель разработан с учетом определенной разрядности данных. Если вы предоставите делегату модель с плавающей запятой, которая поддерживает только 8-битные квантованные операции (например, делегат Hexagon ), он отклонит все свои операции, и модель будет работать полностью на ЦП. Чтобы избежать таких сюрпризов, в таблице ниже представлен обзор поддержки делегатов в зависимости от типа модели:

Тип модели GPU ННАПИ Шестиугольник CoreML
С плавающей точкой (32 бита) да да Нет да
Посттренировочное квантование float16 да Нет Нет да
Квантование динамического диапазона после тренировки да да Нет Нет
Целочисленное квантование после обучения да да да Нет
Обучение с учетом квантования да да да Нет

Проверка производительности

Информация в этом разделе служит приблизительным руководством для составления короткого списка делегатов, которые могут улучшить ваше приложение. Однако важно отметить, что у каждого делегата есть предопределенный набор поддерживаемых им операций, которые могут выполняться по-разному в зависимости от модели и устройства; например, делегат NNAPI может выбрать использование Google Edge-TPU на телефоне Pixel при использовании DSP на другом устройстве. Поэтому обычно рекомендуется выполнить некоторый сравнительный анализ, чтобы оценить, насколько полезен делегат для ваших нужд. Это также помогает оправдать увеличение размера двоичного файла, связанное с подключением делегата к среде выполнения TensorFlow Lite.

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

Инструменты для оценки

Задержка и объем памяти

Инструмент тестирования TensorFlow Lite можно использовать с подходящими параметрами для оценки производительности модели, включая среднюю задержку вывода, накладные расходы на инициализацию, объем памяти и т. Д. Этот инструмент поддерживает несколько флагов для определения наилучшей конфигурации делегата для вашей модели. Например, --gpu_backend=gl можно указать с помощью --use_gpu для измерения производительности графического процессора с помощью OpenGL. Полный список поддерживаемых параметров делегата определен в подробной документации .

Вот пример запуска квантованной модели с графическим процессором через adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Вы можете скачать готовую версию этого инструмента для Android с 64-битной архитектурой ARM здесь ( подробнее ).

Точность и правильность

Делегаты обычно выполняют вычисления с точностью, отличной от точности их аналогов ЦП. В результате возникает (обычно незначительный) компромисс с точностью, связанный с использованием делегата для аппаратного ускорения. Обратите внимание, что это не всегда так; например, поскольку графический процессор использует точность с плавающей запятой для запуска квантованных моделей, может быть небольшое улучшение точности (например, <1% улучшения Top-5 в классификации изображений ILSVRC).

В TensorFlow Lite есть два типа инструментов для измерения того, насколько точно делегат ведет себя для данной модели: на основе задач и без привязки к задачам . Все инструменты, описанные в этом разделе, поддерживают расширенные параметры делегирования, используемые инструментом тестирования из предыдущего раздела. Обратите внимание, что в подразделах ниже основное внимание уделяется оценке делегата (выполняет ли делегат то же, что и ЦП?), А не оценке модели (подходит ли сама модель для этой задачи?).

Оценка на основе задач

В TensorFlow Lite есть инструменты для оценки корректности двух задач, связанных с изображениями:

Готовые двоичные файлы этих инструментов (Android, 64-разрядная архитектура ARM) вместе с документацией можно найти здесь:

В приведенном ниже примере демонстрируется оценка классификации изображений с помощью NNAPI с использованием Google Edge-TPU на Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

Ожидаемый результат - это список показателей Top-K от 1 до 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Оценка, не зависящая от задачи

Для задач, для которых нет установленного на устройстве инструмента оценки, или если вы экспериментируете с пользовательскими моделями, в TensorFlow Lite есть инструмент Inference Diff . (Android, 64-битная двоичная архитектура ARM здесь )

Inference Diff сравнивает выполнение TensorFlow Lite (с точки зрения задержки и отклонения выходного значения) в двух параметрах:

Для этого инструмент генерирует случайные гауссовские данные и передает их через два интерпретатора TFLite: один запускает однопоточные ядра ЦП, а другой параметризует аргументы пользователя.

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

Для модели с одним выходным тензором выходные данные могут выглядеть следующим образом:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Это означает, что для выходного тензора с индексом 0 элементы выходных данных ЦП отличаются от выходных данных делегата в среднем на 1.96e-05 .

Обратите внимание, что интерпретация этих чисел требует более глубокого знания модели и значения каждого выходного тензора. Если это простая регрессия, которая определяет какую-то оценку или вложение, разница должна быть небольшой (в противном случае это ошибка делегата). Однако такие выходные данные, как «класс обнаружения» для моделей SSD, интерпретировать немного сложнее. Например, с помощью этого инструмента можно показать разницу, но это может не означать, что с делегатом что-то действительно не так: рассмотрите два (поддельных) класса: «TV (ID: 10)», «Monitor (ID: 20)» - если делегат немного отклонился от золотой истины и показывает монитор вместо телевизора, выходная разница для этого тензора может быть примерно 20-10 = 10.