Инструменты тестирования
Инструменты тестирования LiteRT в настоящее время измеряют и рассчитывают статистику по следующим важным показателям производительности:
- Время инициализации
- Время вывода состояния прогрева
- Время вывода установившегося состояния
- Использование памяти во время инициализации
- Общее использование памяти
Инструменты тестирования доступны в виде приложений для тестирования производительности для 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.
Вы можете указать дополнительные параметры для запуска теста.
-
num_threads
:int
(по умолчанию = 1)
Количество потоков, используемых для запуска интерпретатора TFLite. -
use_gpu
:bool
(по умолчанию = false)
Используйте делегат графического процессора . -
use_xnnpack
:bool
(по умолчанию =false
)
Используйте делегат XNNPACK .
В зависимости от используемого вами устройства некоторые из этих параметров могут быть недоступны или не иметь никакого эффекта. Обратитесь к параметрам , чтобы узнать больше о параметрах производительности, которые можно запустить с помощью эталонного приложения.
Просмотрите результаты с помощью команды 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 , используйте ссылки ниже:
Вы также можете собрать собственный двоичный файл эталонного теста из исходного кода на своем компьютере.
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, вам необходимо собрать приложение из исходного кода . Поместите файл модели LiteRT в каталог Benchmark_data дерева исходного кода и измените файл benchmark_params.json
. Эти файлы упаковываются в приложение, и приложение считывает данные из каталога. Посетите приложение для тестирования iOS для получения подробных инструкций.
Тесты производительности для известных моделей
В этом разделе перечислены тесты производительности LiteRT при запуске известных моделей на некоторых устройствах 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
Чтобы работать с делегатом графического процессора, установите --use_gpu=true
.
Приведенные ниже значения производительности измерены на Android 10.
Название модели | Устройство | Процессор, 4 потока | графический процессор |
---|---|---|---|
Mobilenet_1.0_224(с плавающей точкой) | Пиксель 3 | 23,9 мс | 6,45 мс |
Пиксель 4 | 14,0 мс | 9,0 мс | |
Mobilenet_1.0_224 (количественный) | Пиксель 3 | 13,4 мс | --- |
Пиксель 4 | 5,0 мс | --- | |
NASNet мобильный | Пиксель 3 | 56 мс | --- |
Пиксель 4 | 34,5 мс | --- | |
SqueezeNet | Пиксель 3 | 35,8 мс | 9,5 мс |
Пиксель 4 | 23,9 мс | 11,1 мс | |
Начало_ResNet_V2 | Пиксель 3 | 422 мс | 99,8 мс |
Пиксель 4 | 272,6 мс | 87,2 мс | |
Начало_V4 | Пиксель 3 | 486 мс | 93 мс |
Пиксель 4 | 324,1 мс | 97,6 мс |
тесты производительности 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 мс |
Отслеживание внутренних компонентов LiteRT
Отслеживание внутренних компонентов LiteRT в Android
Внутренние события интерпретатора LiteRT приложения Android могут фиксироваться средствами трассировки Android . Это те же события, что и в Android Trace API, поэтому захваченные события из кода Java/Kotlin отображаются вместе с внутренними событиями LiteRT.
Некоторые примеры событий:
- Вызов оператора
- Изменение графика делегатом
- Тензорное распределение
Среди различных вариантов сбора трассировок в этом руководстве рассматриваются профилировщик ЦП Android Studio и приложение System Tracing. Дополнительные параметры см. в инструменте командной строки Perfetto или в инструменте командной строки Systrace .
Добавление событий трассировки в код Java
Это фрагмент кода из примера приложения классификации изображений . Интерпретатор LiteRT работает в разделе recognizeImage/runInference
. Этот шаг не является обязательным, но он полезен, чтобы помочь заметить, где выполняется вызов вывода.
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
Включить трассировку LiteRT
Чтобы включить трассировку LiteRT, перед запуском приложения Android установите для системного свойства Android debug.tflite.trace
значение 1.
adb shell setprop debug.tflite.trace 1
Если это свойство установлено при инициализации интерпретатора LiteRT, ключевые события (например, вызов оператора) из интерпретатора будут отслеживаться.
После того как вы захватили все трассировки, отключите трассировку, установив для свойства значение 0.
adb shell setprop debug.tflite.trace 0
Профилировщик процессора Android Studio
Запишите трассировки с помощью профилировщика ЦП Android Studio , выполнив следующие действия:
Выберите «Выполнить» > «Приложение профиля» в верхнем меню.
Щелкните в любом месте временной шкалы ЦП, когда появится окно профилировщика.
Выберите «Отслеживать системные вызовы» среди режимов профилирования ЦП.
Нажмите кнопку «Запись».
Нажмите кнопку «Стоп».
Исследуйте результат трассировки.
В этом примере вы можете увидеть иерархию событий в потоке и статистику для каждого времени оператора, а также увидеть поток данных всего приложения между потоками.
Приложение для отслеживания системы
Сохраняйте трассировки без Android Studio, выполнив действия, описанные в приложении System Tracing .
В этом примере одни и те же события TFLite были записаны и сохранены в формате Perfetto или Systrace в зависимости от версии устройства Android. Захваченные файлы трассировки можно открыть в пользовательском интерфейсе Perfetto .
Отслеживание внутренних компонентов LiteRT в iOS
Внутренние события интерпретатора LiteRT приложения iOS могут быть зафиксированы с помощью инструмента «Инструменты» , включенного в Xcode. Это события указателя iOS, поэтому захваченные события из кода Swift/Objective-C отображаются вместе с внутренними событиями LiteRT.
Некоторые примеры событий:
- Вызов оператора
- Изменение графика делегатом
- Тензорное распределение
Включить трассировку LiteRT
Установите переменную среды debug.tflite.trace
, выполнив следующие действия:
Выберите «Продукт» > «Схема» > «Редактировать схему...» в верхнем меню Xcode.
Нажмите «Профиль» на левой панели.
Снимите флажок «Использовать аргументы и переменные среды действия «Выполнить».
Добавьте
debug.tflite.trace
в раздел «Переменные среды».
Если вы хотите исключить события LiteRT при профилировании приложения iOS, отключите трассировку, удалив переменную среды.
Инструменты XCode
Запишите следы, выполнив следующие действия:
Выберите «Продукт» > «Профиль» в верхнем меню Xcode.
Нажмите «Ведение журнала среди шаблонов профилирования» при запуске инструмента «Инструменты».
Нажмите кнопку «Старт».
Нажмите кнопку «Стоп».
Нажмите «os_signpost», чтобы развернуть элементы подсистемы ведения журнала ОС.
Нажмите «org.tensorflow.lite» подсистема ведения журнала ОС.
Исследуйте результат трассировки.
В этом примере вы можете увидеть иерархию событий и статистику для каждого времени оператора.
Использование данных трассировки
Данные трассировки позволяют выявить узкие места производительности.
Вот несколько примеров информации, которую вы можете получить от профилировщика, и потенциальных решений для повышения производительности:
- Если количество доступных ядер ЦП меньше количества потоков вывода, то накладные расходы на планирование ЦП могут привести к снижению производительности. Вы можете перепланировать другие задачи, интенсивно использующие ЦП, в своем приложении, чтобы избежать дублирования результатов вашей модели, или настроить количество потоков интерпретатора.
- Если операторы делегированы не полностью, то некоторые части графа модели выполняются на ЦП, а не на ожидаемом аппаратном ускорителе. Вы можете заменить неподдерживаемые операторы аналогичными поддерживаемыми операторами.