Благодарим за настройку Google I/O. Посмотреть все сеансы по запросу Смотреть по запросу

Делегаты TensorFlow Lite

Введение

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

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

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

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

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

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

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

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

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

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

Андроид

  • Делегат NNAPI для более новых устройств Android . Делегат NNAPI можно использовать для ускорения моделей на устройствах Android с доступными GPU, DSP и/или NPU. Он доступен в Android 8.1 (API 27+) или выше. Обзор делегата NNAPI, пошаговые инструкции и рекомендации см. в разделе Делегат TensorFlow Lite NNAPI .
  • Делегат 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 с SoC A12 или выше. Обзор делегата Core ML и пошаговые инструкции см. в разделе Делегат Core ML для TensorFlow Lite .

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

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

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

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

Информация в этом разделе служит ориентиром для составления короткого списка делегатов, которые могут улучшить ваше приложение. Однако важно отметить, что у каждого делегата есть предопределенный набор поддерживаемых им операций, которые могут выполняться по-разному в зависимости от модели и устройства; например, делегат NNAPI может использовать Edge-TPU Google на телефоне 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% улучшение в пятерке лучших в классификации изображений ILSGRC).

В 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, немного сложнее интерпретировать. Например, это может показать разницу с помощью этого инструмента, но это может не означать, что что-то действительно не так с делегатом: рассмотрим два (фальшивых) класса: «ТВ (ID: 10)», «Монитор (ID: 20)» — если делегат немного отклоняется от золотой истины и показывает монитор вместо телевизора, разница на выходе для этого тензора может достигать 20-10 = 10.