Найти тему
Мысли на разные темы.

TensorFlow Lite теперь быстрее с мобильными GPU

https://hpc.postech.ac.kr/wordpress/wp-content/uploads/2015/07/resize_mobile_gpu1.jpg
https://hpc.postech.ac.kr/wordpress/wp-content/uploads/2015/07/resize_mobile_gpu1.jpg

Запущенный вывод на компьютерных тяжелых моделей машинного обучения на мобильных устройствах является ресурсоёмким в связи с ограниченной обработкой данных устройств и их мощностью. В то время как преобразование в модель с фиксированной точкой является одним из способов ускорения, наши пользователи обратились к нам за поддержкой GPU в качестве опции для ускорения вывода исходных моделей с плавающей точкой без дополнительной сложности и потенциальной потери точности квантования.
Мы слушали и рады объявить, что теперь вы сможете использовать мобильные
GPU для некоторых моделей (перечисленных ниже) с выходом предварительного просмотра разработчиками бэкэнда GPU для TensorFlow Lite; он вернется к CPU умозаключениям для тех частей модели, которые не поддерживаются. В ближайшие месяцы мы продолжим добавлять дополнительные опции и улучшать общее предложение бэкэнда GPU.

Мы обнаружили, что в целом новый бэкэнд GPU работает в 2-7 раз быстрее, чем CPU с плавающей запятой для широкого спектра различных моделей глубоких нейронных сетей. Ниже мы сравнили 4 публичные и 2 внутренние модели, охватывающие общие случаи использования, с которыми сталкиваются разработчики и исследователи в наборе устройств Android и Apple.

Что такое ускорение прямо сейчас?
Бэкэнд
GPU в настоящее время поддерживает некоторые операции. Ваша модель будет работать быстрее, если содержит только эти операции; неподдерживаемые операции GPU автоматически вернутся на CPU.
Как это работает?
Глубокие нейронные сети выполняют сотни
операций последовательно, что делает их отлично подходящими для GPU, которые проектируются с учетом вычислительно-ориентированных параллельных рабочих нагрузок.
Делегат
GPU инициализируется при вызове Interpreter::ModifyGraphWithDelegate() в Objective-C++ или опосредованно при вызове конструктора интерпретатора с помощью Interpreter. Options в Java. На этом этапе инициализации на основе полученного из фреймворка плана выполнения строится каноническое представление входной нейросети. При этом новом представлении применяется набор правил преобразования. Они включают в себя, но не ограничиваются ими:
выстраивание ненужных опций
Замена операционных систем на другие эквивалентные операционные системы, которые имеют лучшую производительность
Слияние опций для уменьшения конечного количества генерируемых шейдерных программ

На основе этого оптимизированного графика генерируются и компилируются вычислительные шейдеры; в настоящее время мы используем вычислительные шейдеры
OpenGL ES 3.1 на Android и вычислительные шейдеры Metal на iOS. При создании этих вычислительных шейдеров мы также используем различные оптимизации, специфичные для архитектуры:
Применение специализаций определенных операционных систем вместо их (
более медленных) общих реализаций.
Расслабляющее давление в регистре
Подбор оптимальных размеров рабочей группы
Безопасная точность обрезки
упорядочение явных математических операций

В конце этих оптимизаций компилируются шейдерные программы, которые могут занимать от нескольких миллисекунд до половины секунды, как и мобильные игры. Как только шейдерные программы скомпилированы, новый
GPU движок вывода готов к работе.
После вывода для каждого входа:
Входы при необходимости переносятся на
GPU: Входные тензоры, если они еще не хранятся в памяти GPU, становятся доступными для GPU через фреймворк, создавая GL буферы/текстуры или MTLBuffers, а также потенциально копируя данные. Так как GPU наиболее эффективны с 4-канальными структурами данных, тензоры с размерами каналов, не равными 4, преобразуются в более удобную для GPU компоновку.
Шейдерные программы выполняются: Вышеупомянутые шейдерные программы вставляются в очередь командного буфера, и
GPU их выполняет. На этом шаге мы также управляем памятью GPU для промежуточных тензоров, чтобы сохранить как можно меньшую площадь памяти нашего бэкэнда.
При необходимости выходы перемещаются на
CPU: После того, как глубокая нейронная сеть закончит обработку, фреймворк копирует результат из памяти GPU в память CPU, если только выход из сети не может быть визуализирован непосредственно на экране, и эта передача не требуется.
Для лучшего опыта мы рекомендуем оптимизировать копию тензора входа/выхода и/или сетевую архитектуру. Подробности о таких оптимизациях можно найти в документации по
TensorFlow Lite GPU. Для ознакомления с лучшим опытом работы, пожалуйста, прочтите это руководство.
Насколько она велика?
Делегат от
GPU добавит около 270 КБ к APK для Android armeabi-v7a и 212 КБ для iOS на включенную архитектуру. Однако, бэкэнд является необязательным, и поэтому, если вы не используете GPU делегата, вам не нужно включать его.
Будущая работа
Это только начало наших усилий по поддержке
GPU. Наряду с обратной связью с общественностью, мы намерены добавить следующие улучшения:
Расширение охвата операций
Дальнейшая оптимизация производительности
Разработать и доработать API.