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

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

А в недавнем выпуске TFLite 1.0 команда TensorFlow добавила ряд функций, которые значительно упрощают развертывание. Одним из таких недооцененных вариантов использования является сравнительный анализ и профилирование.

Теперь библиотека обеспечивает подробное профилирование с показателями уровня слоя.

Для начала клонируйте репозиторий TensorFlow и переключитесь на последний код (в моем случае r2.0)

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

Затем вы можете увидеть там файл конфигурации.

./configure

Оставьте все настройки по умолчанию (или в соответствии с вашим вариантом использования), но когда вас попросят настроить WorkSpace для сборки Android, ответьте «да» и укажите соответствующие пути к SDK и NDK.

Затем нам нужно создать исполняемый файл, необходимый для тестирования:

bazel build -c opt \
  --config=android_arm \
  --cxxopt='--std=c++11' \
  --copt=-DTFLITE_PROFILING_ENABLED \
  tensorflow/lite/tools/benchmark:benchmark_model

Если у вас не установлен bazel, вы можете установить bazel через Homebrew для Mac или через conda, если у вас есть Anaconda / Miniconda. Лучший способ установить - через их веб-сайт.

На этом этапе вы должны держать свой телефон подключенным через USB и не отключать отладку по USB. Затем используйте следующую команду, чтобы скопировать исполняемый файл теста производительности во временную папку телефона:

adb push bazel-bin/tensorflow/lite/tools/benchmark/benchmark_model /data/local/tmp

Вы должны сделать команду исполняемой, поэтому вы сделаете это с помощью следующей команды:

adb shell chmod +x /data/local/tmp/benchmark_model

Теперь вам нужно скопировать модель TFLite на телефон, чтобы запустить отладку. Предположим, ваша модель называется deeplab_257.tflite и находится в текущем рабочем каталоге. Эта команда копирует модель на телефон:

adb push deeplab_257.tflite /data/local/tmp

Теперь, чтобы запустить тест, все, что нам нужно сделать, это запустить исполняемый файл в графическом файле TFLite, который вы только что скопировали в телефон:

adb shell /data/local/tmp/benchmark_model \
--graph=/data/local/tmp/deeplab_257.tflite \
--num_threads=4

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

Если вы хотите получить согласованные результаты с точки зрения профилирования, вы можете запустить его на одном процессоре и установить привязку к процессору, что можно сделать с помощью следующей команды

adb shell taskset f0 /data/local/tmp/benchmark_model --graph=/data/local/tmp/deeplab_257.tflite --num_threads=1

На изображении ниже показан более стабильный результат для одного ядра, даже если вы попробуете один и тот же эксперимент несколько раз:

Получив такую ​​детализированную информацию, вы без особого труда сможете принять решение о том, какую модель использовать. Среднюю метрику времени вывода на изображении выше можно рассматривать как время выполнения вывода модели на телефоне (для справки я использовал Pixel 2).

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

Большинство команд, которые мы рассмотрели в этом руководстве, доступны в документации TensorFlow. По сути, я просто выбирал, бил и экспериментировал, прежде чем опубликовать это как историю.

Примечание редактора: Heartbeat - это онлайн-публикация и сообщество, созданное авторами и посвященное предоставлению первоклассных образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить модели машинного обучения.