Рекомендации по повышению эффективности

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

Выберите лучшую модель для поставленной задачи

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

Graph of model size vs
accuracy

Graph of accuracy vs latency

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

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

Профилируйте свою модель

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

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

Профилируйте и оптимизируйте операторов на графике

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

Оптимизируйте свою модель

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

Подробности можно найти в документации по оптимизации модели .

Настройте количество потоков

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

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

Устраните лишние копии

Если ваше приложение не разработано тщательно, при подаче входных данных и чтении выходных данных модели могут возникнуть избыточные копии. Обязательно удалите лишние копии. Если вы используете API более высокого уровня, например Java, обязательно внимательно проверьте документацию на предмет проблем с производительностью. Например, Java API работает намного быстрее, если в качестве входных данных используются ByteBuffers .

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

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

Оцените, выигрывает ли ваша модель от использования аппаратных ускорителей, доступных на устройстве.

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

  • Делегат графического процессора доступен на Android и iOS с использованием OpenGL/OpenCL и Metal соответственно. Чтобы опробовать их, смотрите делегат GPU .
  • Возможно создание собственного делегата, если у вас есть доступ к нестандартному оборудованию. Дополнительные сведения см. в разделе делегаты LiteRT .

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