Измерение производительности

Инструменты тестирования

Инструменты тестирования TensorFlow Lite в настоящее время измеряют и рассчитывают статистику по следующим важным показателям производительности:

  • Время инициализации
  • Время вывода состояния прогрева
  • Время вывода установившегося состояния
  • Использование памяти во время инициализации
  • Общее использование памяти

Инструменты тестирования доступны в виде приложений для тестирования производительности для Android и iOS, а также в виде собственных двоичных файлов командной строки, и все они используют одну и ту же основную логику измерения производительности. Обратите внимание, что доступные параметры и форматы вывода немного отличаются из-за различий в среде выполнения.

Android-приложение для тестирования производительности

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

Это тестовое приложение для Android не имеет пользовательского интерфейса. Установите и запустите его с помощью команды adb и получите результаты с помощью команды adb logcat .

Загрузите или создайте приложение

Загрузите готовые ночные тестовые приложения Android, используя ссылки ниже:

Что касается приложений для тестирования производительности Android, которые поддерживают операции TF через делегата Flex , используйте ссылки ниже:

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

Подготовьте тест

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

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

Запустить тест

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph является обязательным параметром.

  • graph : string
    Путь к файлу модели TFLite.

Вы можете указать дополнительные параметры для запуска теста.

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

Просмотрите результаты с помощью команды logcat :

adb logcat | grep "Inference timings"

Результаты тестов представлены как:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

Собственный бинарный тест

Инструмент тестирования производительности также предоставляется в виде встроенной двоичной benchmark_model . Вы можете запустить этот инструмент из командной строки оболочки на Linux, Mac, встроенных устройствах и устройствах Android.

Загрузите или создайте двоичный файл

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

Что касается ночных готовых двоичных файлов, которые поддерживают операции TF через делегата Flex , используйте ссылки ниже:

Для тестирования с делегатом TensorFlow Lite Hexagon мы также предварительно создали необходимые файлы libhexagon_interface.so (подробности об этом файле см. здесь ). После загрузки файла соответствующей платформы по ссылкам ниже переименуйте файл в libhexagon_interface.so .

Вы также можете собрать собственный двоичный файл эталонного теста из исходного кода на своем компьютере.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Для сборки с помощью набора инструментов Android NDK вам необходимо сначала настроить среду сборки, следуя этому руководству , или использовать образ Docker, как описано в этом руководстве .

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

Запустить тест

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

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

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

Профилирование операций модели

Бинарная тестовая модель также позволяет вам профилировать операции модели и получать время выполнения каждого оператора. Для этого передайте флаг --enable_op_profiling=true в benchmark_model во время вызова. Подробности описаны здесь .

Собственный двоичный тест для нескольких вариантов производительности за один запуск

Также предоставляется удобный и простой двоичный файл C++ для тестирования нескольких параметров производительности за один запуск. Этот двоичный файл создан на основе вышеупомянутого инструмента тестирования производительности, который может одновременно тестировать только один вариант производительности. Они используют один и тот же процесс сборки/установки/запуска, но целевое имя BUILD этого двоичного файла — benchmark_model_performance_options , и оно принимает некоторые дополнительные параметры. Важным параметром для этого двоичного файла является:

perf_options_list : string (по умолчанию = «все»)
Разделенный запятыми список параметров производительности TFLite для тестирования.

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

Приложение для тестирования iOS

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

Тесты производительности для известных моделей

В этом разделе перечислены тесты производительности TensorFlow Lite при запуске известных моделей на некоторых устройствах Android и iOS.

Тесты производительности Android

Эти показатели производительности были сгенерированы с помощью встроенного двоичного файла тестов .

Для тестов Android привязка ЦП настроена на использование больших ядер устройства, чтобы уменьшить дисперсию (см. подробности ).

Предполагается, что модели были загружены и разархивированы в каталог /data/local/tmp/tflite_models . Бинарный тест теста создается с использованием этих инструкций и предполагается, что он находится в каталоге /data/local/tmp .

Чтобы запустить тест:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

Чтобы работать с делегатом nnapi, установите --use_nnapi=true . Чтобы работать с делегатом графического процессора, установите --use_gpu=true .

Приведенные ниже значения производительности измерены на Android 10.

Название модели Устройство Процессор, 4 потока графический процессор ННАПИ
Mobilenet_1.0_224(с плавающей точкой) Пиксель 3 23,9 мс 6,45 мс 13,8 мс
Пиксель 4 14,0 мс 9,0 мс 14,8 мс
Mobilenet_1.0_224 (количественный) Пиксель 3 13,4 мс --- 6,0 мс
Пиксель 4 5,0 мс --- 3,2 мс
NASNet мобильный Пиксель 3 56 мс --- 102 мс
Пиксель 4 34,5 мс --- 99,0 мс
SqueezeNet Пиксель 3 35,8 мс 9,5 мс 18,5 мс
Пиксель 4 23,9 мс 11,1 мс 19,0 мс
Начало_ResNet_V2 Пиксель 3 422 мс 99,8 мс 201 мс
Пиксель 4 272,6 мс 87,2 мс 171,1 мс
Начало_V4 Пиксель 3 486 мс 93 мс 292 мс
Пиксель 4 324,1 мс 97,6 мс 186,9 мс

тесты производительности iOS

Эти показатели производительности были получены с помощью приложения для тестирования производительности iOS .

Для запуска тестов iOS приложение для тестирования было изменено, чтобы включить соответствующую модель, а benchmark_params.json был изменен, чтобы установить для num_threads значение 2. Для использования делегата графического процессора были выбраны параметры "use_gpu" : "1" и "gpu_wait_type" : "aggressive" также добавлено в benchmark_params.json .

Название модели Устройство Процессор, 2 потока графический процессор
Mobilenet_1.0_224(с плавающей точкой) айфон хз 14,8 мс 3,4 мс
Mobilenet_1.0_224 (количественный) айфон хз 11 мс ---
NASNet мобильный айфон хз 30,4 мс ---
SqueezeNet айфон хз 21,1 мс 15,5 мс
Начало_ResNet_V2 айфон хз 261,1 мс 45,7 мс
Начало_V4 айфон хз 309 мс 54,4 мс

Отслеживание внутренних компонентов TensorFlow Lite

Отслеживание внутренних компонентов TensorFlow Lite в Android

Внутренние события интерпретатора TensorFlow Lite приложения Android могут фиксироваться инструментами трассировки Android . Это те же события, что и в Android Trace API, поэтому захваченные события из кода Java/Kotlin отображаются вместе с внутренними событиями TensorFlow Lite.

Некоторые примеры событий:

  • Вызов оператора
  • Изменение графика делегатом
  • Тензорное распределение

Среди различных вариантов сбора трассировок в этом руководстве рассматриваются профилировщик ЦП Android Studio и приложение System Tracing. Дополнительные параметры см. в инструменте командной строки Perfetto или в инструменте командной строки Systrace .

Добавление событий трассировки в код Java

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

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

Включить трассировку TensorFlow Lite

Чтобы включить трассировку TensorFlow Lite, перед запуском приложения Android установите для системного свойства Android debug.tflite.trace значение 1.

adb shell setprop debug.tflite.trace 1

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

После того как вы записали все трассировки, отключите трассировку, установив для свойства значение 0.

adb shell setprop debug.tflite.trace 0

Профилировщик процессора Android Studio

Запишите трассировки с помощью профилировщика ЦП Android Studio, выполнив следующие действия:

  1. Выберите «Выполнить» > «Приложение профиля» в верхнем меню.

  2. Щелкните в любом месте временной шкалы ЦП, когда появится окно профилировщика.

  3. Выберите «Отслеживать системные вызовы» среди режимов профилирования ЦП.

    Выберите «Отслеживать системные вызовы».

  4. Нажмите кнопку «Запись».

  5. Нажмите кнопку «Стоп».

  6. Исследуйте результат трассировки.

    Трассировка Android Studio

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

Приложение для отслеживания системы

Сохраняйте трассировки без Android Studio, выполнив действия, описанные в приложении System Tracing .

В этом примере одни и те же события TFLite были записаны и сохранены в формате Perfetto или Systrace в зависимости от версии устройства Android. Захваченные файлы трассировки можно открыть в пользовательском интерфейсе Perfetto .

Перфетто след

Отслеживание внутренних компонентов TensorFlow Lite в iOS

Внутренние события интерпретатора TensorFlow Lite приложения iOS можно фиксировать с помощью инструмента «Инструменты» , включенного в Xcode. Это события указателя iOS, поэтому захваченные события из кода Swift/Objective-C отображаются вместе с внутренними событиями TensorFlow Lite.

Некоторые примеры событий:

  • Вызов оператора
  • Изменение графика делегатом
  • Тензорное распределение

Включить трассировку TensorFlow Lite

Установите переменную среды debug.tflite.trace , выполнив следующие действия:

  1. Выберите «Продукт» > «Схема» > «Редактировать схему...» в верхнем меню Xcode.

  2. Нажмите «Профиль» на левой панели.

  3. Снимите флажок «Использовать аргументы и переменные среды действия «Выполнить».

  4. Добавьте debug.tflite.trace в раздел «Переменные среды».

    Установить переменную среды

Если вы хотите исключить события TensorFlow Lite при профилировании приложения iOS, отключите трассировку, удалив переменную среды.

Инструменты XCode

Запишите следы, выполнив следующие действия:

  1. Выберите «Продукт» > «Профиль» в верхнем меню Xcode.

  2. Нажмите «Ведение журнала среди шаблонов профилирования» при запуске инструмента «Инструменты».

  3. Нажмите кнопку «Старт».

  4. Нажмите кнопку «Стоп».

  5. Нажмите «os_signpost», чтобы развернуть элементы подсистемы ведения журнала ОС.

  6. Нажмите «org.tensorflow.lite» подсистема ведения журнала ОС.

  7. Исследуйте результат трассировки.

    Трассировка инструментов Xcode

В этом примере вы можете увидеть иерархию событий и статистику для каждого времени оператора.

Использование данных трассировки

Данные трассировки позволяют выявить узкие места производительности.

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

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