Хотя развитие мобильных телефонов меняется с каждым днем, и частота смены мобильных телефонов также ускорилась, нельзя отрицать, что производительность мобильных телефонов все еще далека от производительности ПК. Для машинного обучения мы можем обучить модель на компьютере и применить модель на мобильном телефоне, но некоторые сложные модели по-прежнему очень медленно обрабатываются на мобильном телефоне. Некоторое время назад я изучал добавление функции определения желтого цвета в мобильные браузеры, используя модель yahoo open_nsfw, и фактический тест все еще был слишком медленным, поэтому мне пришлось сдаться.
Мобильные телефоны — отличный носитель для приложений искусственного интеллекта, и я слежу за последними достижениями в области машинного обучения на мобильной стороне, особенно с TensorFlow Lit. Это переведенная статья, оригинальное название: TensorFlow Lite теперь быстрее с мобильными графическими процессорами (предварительная версия для разработчиков), нажмите, чтобы прочитать исходный текст, вы можете перейти к исходной ссылке, вам нужно опрокинуть стену!
Использование моделей машинного обучения с интенсивными вычислениями для логических выводов на мобильных устройствах очень ресурсоемко из-за ограниченной производительности процессора и емкости аккумулятора. Хотя возможен один путь ускорения: преобразование в модели с фиксированной точкой, пользователи запросили поддержку графического процессора в качестве опции для ускорения логического вывода на необработанных моделях с плавающей запятой без дополнительной сложности и потенциальной потери точности квантования.
Мы выслушали наших пользователей и рады сообщить, что теперь вы можете использовать недавно выпущенную предварительную версию TensorFlow Lite для разработчиков на стороне графического процессора, чтобы воспользоваться ускорением мобильного графического процессора для определенных моделей (перечисленных ниже); для некоторых моделей, которые не поддерживается, затем откат к выводу ЦП. В течение следующих нескольких месяцев мы продолжим добавлять дополнительные операции (ops) и улучшать работу графического процессора в целом.
Этот новый сервер использует:
- OpenGL ES 3.1 на устройствах Androidвычислительный шейдер(Вычислительные шейдеры)
- на iOS-устройствахМеталлический вычислительный шейдер(металлические вычислительные шейдеры)
Сегодня мы выпускаем предварительно скомпилированный двоичный предварительный просмотр нашего нового бэкэнда GPU, давая разработчикам и исследователям машинного обучения возможность опробовать эту замечательную новую технологию. Мы планируем выпустить полную версию с открытым исходным кодом позднее в 2019 году с отзывами, полученными в результате ваших экспериментов.
Сегодня мы используем логический вывод с плавающей запятой ЦП TensorFlow Lite для обнаружения контуров лица (не распознавания лиц), а с новым бэкендом графического процессора в будущем скорость логического вывода на Pixel 3 и Samsung S9 может быть улучшена примерно в 4 раза, а на iPhone7 может ускориться до ~6 раз.
Сравнение производительности GPU и CPU
В Google мы уже несколько месяцев используем новый бэкенд GPU в продуктах, ускоряя работу в сетях с интенсивными вычислениями и предоставляя нашим пользователям важные варианты использования.
В портретном режиме на Pixel 3 логический вывод Tensorflow Lite GPU сравнивается с логическим выводом ЦП с точностью с плавающей запятой.Модель сегментации переднего плана и фонав 4 раза быстрее,Новая модель оценки глубиныв 10 раз быстрее. существуетYouTube StoriesиPlayground Stickers, нашМодель сегментации видео в реальном времениВ 5-10 раз быстрее на разных телефонах.
Мы обнаружили, что для широкого спектра моделей глубоких нейронных сетей новые серверные части GPU часто работают быстрее, чем реализации CPU с плавающей запятой.в 2-7 раз быстрее. Ниже мы оцениваем 4 общедоступные модели и 2 внутренние модели, охватывая распространенные варианты использования, с которыми разработчики и исследователи сталкиваются на устройствах Android и Apple:
Выложите модель:
- Классификация изображений MobileNet v1 (224x224)[скачать] (Модели классификации изображений, разработанные для мобильных и встроенных приложений машинного зрения)
- PoseNet для оценки позы[скачать] (Визуальная модель для оценки позы людей на изображениях или видео)
- [Модель сегментации DeepLab (257x257)]Любовь. Google blog.com/2018/03/colorblind…)[скачать] (Назначьте семантические метки (например, собака, кошка, автомобиль) модели сегментации изображения на уровне пикселей во входном изображении.)
- Обнаружение объектов MobileNet SSD[скачать] (Модель классификации изображений с использованием ограничивающих рамок для обнаружения нескольких объектов)
Частный случай Google:
- MLKitконтуры лица, используемые в
- Playground StickersиYouTube Storiesсегментация видео в реальном времени, используемая в
Таблица 1. Средняя производительность графического процессора удвоилась по сравнению с базовой производительностью процессора 6 моделей на различных устройствах Android и Apple. Чем выше множитель, тем лучше производительность.
Чем сложнее модели нейронных сетей, тем важнее ускорение графического процессора, и эти модели могут лучше использовать графический процессор, например, в задачах прогнозирования, сегментации или классификации, требующих больших вычислительных ресурсов. На очень маленьких моделях может быть небольшое ускорение, и может быть более выгодно использовать ЦП, чтобы избежать штрафа за задержку, связанного с передачей памяти.
Как я могу его использовать?
руководство
Самый простой способ начать — подписаться на нашуруководство, используя демонстрационное приложение TensorFlow Lite с поддержкой графического процессора. Далее следует краткий обзор их использования. Для получения дополнительной информации см. нашполная документация.
Пошаговое руководство смотрите в видео:
Использование Java для Android
Мы подготовили полный архив Android (AAR), который включает TensorFlow Lite с серверной частью GPU. Отредактируйте файл gradle, чтобы включить этот AAR вместо текущей версии выпуска, и добавьте следующий фрагмент в код инициализации Java.
// Initialize interpreter with GPU delegate.
GpuDelegate delegate = new GpuDelegate();
Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
Interpreter interpreter = new Interpreter(model, options);
// Run inference.
while (true) {
writeToInputTensor(inputTensor);
interpreter.run(inputTensor, outputTensor);
readFromOutputTensor(outputTensor);
}
// Clean up.
delegate.close();
Использование С++ для iOS
Шаг 1. Загрузите бинарную версию TensorFlow Lite.
Шаг 2. Измените код для вызова ModifyGraphWithDelegate() после создания модели.
// Initialize interpreter with GPU delegate.
std::unique_ptr<Interpreter> interpreter;
InterpreterBuilder(model, op_resolver)(&interpreter);
auto* delegate = NewGpuDelegate(nullptr); // default config
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
// Run inference.
while (true) {
WriteToInputTensor(interpreter->typed_input_tensor<float>(0));
if (interpreter->Invoke() != kTfLiteOk) return false;
ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));
}
// Clean up.
interpreter = nullptr;
DeleteGpuDelegate(delegate);
Что ускоряется сейчас?
Серверная часть GPU в настоящее время поддерживает операции выбора (см.Документация). Если ваша модель содержит только эти операции, она будет выполняться быстрее, а неподдерживаемые операции графического процессора автоматически перейдут к центральному процессору.
Как это работает?
Глубокие нейронные сети выполняют сотни операций последовательно, что делает их идеальными для графических процессоров, которые разработаны с учетом ориентированных на пропускную способность параллельных рабочих нагрузок.
При вызове Interpreter::ModifyGraphWithDelegate() в Objective-C++ или вызове конструктора Interpreter с Interpreter.Options в Java инициализируется прокси-сервер GPU. На этом этапе инициализации каноническое представление входной нейронной сети строится на основе плана выполнения, полученного от фреймворка. Используя это новое представление, будет применяться набор правил преобразования, включая, помимо прочего:
- Избавьтесь от ненужных операций
- Замените операции другими эквивалентными операциями с более высокой производительностью.
- Объедините операции, чтобы уменьшить количество генерируемых окончательных шейдерных программ.
На основе этого графа оптимизации сгенерируйте и скомпилируйте вычислительный шейдер. В настоящее время мы используем вычислительные шейдеры OpenGL ES 3.1 на Android и вычислительные шейдеры Metal на iOS. При создании этих вычислительных шейдеров мы также используем различные оптимизации для конкретных архитектур, такие как:
- Применять специализации некоторых операций вместо их (более медленных) универсальных реализаций.
- Уменьшить давление регистра
- Выберите оптимальный размер рабочей группы
- Безопасное снижение точности
- Изменение порядка явных математических операций
По окончании этих оптимизаций компилируется шейдерная программа, которая может занимать от нескольких миллисекунд до полсекунды, как в мобильной игре. Как только шейдерная программа скомпилирована, новый механизм логического вывода GPU может работать.
При выводе каждого входа:
- Ввод будет перемещен в GPU при необходимости: входной тензор, если он еще не сохранен в памяти графического процессора, к которому может получить доступ фреймворк на графическом процессоре путем создания буферов/текстур GL или MTLBuffers, возможно, путем копирования данных. Поскольку графические процессоры наиболее эффективны в 4-канальных структурах данных, тензоры с размером канала, отличным от 4, будут преобразованы в более удобную для графического процессора компоновку.
- выполнить шейдерную программу: Вставьте указанные выше шейдерные программы в очередь командного буфера, и GPU выведет эти программы. На этом этапе мы также управляем памятью графического процессора для промежуточных тензоров, чтобы свести к минимуму объем памяти, занимаемой серверной частью.
- При необходимости переместите вывод на ЦП: как только глубокая нейронная сеть завершает обработку, фреймворк копирует результаты из памяти графического процессора в память центрального процессора, за исключением случаев, когда вывод сети может быть отображен непосредственно на экране и такая передача не требуется.
Для получения наилучших результатов мы рекомендуем оптимизировать репликацию тензора ввода-вывода и/или сетевую архитектуру. Дополнительные сведения о такой оптимизации см.Документация по графическому процессору TensorFlow Lite. Для получения рекомендаций по производительности прочитайте эторуководство.
Насколько оно большое?
Агент графического процессора добавит примерно 270 КБ к Android armeabi-v7a APK и 212 КБ к каждой включенной архитектуре для iOS. Однако серверная часть не является обязательной, поэтому вам не нужно включать ее, если вы не используете прокси-сервер GPU.
Будущая работа
Это только начало нашей работы по поддержке GPU. В дополнение к отзывам сообщества мы намерены внести следующие улучшения:
- Расширить сферу деятельности
- Дальнейшая оптимизация производительности
- Развитый и в конечном итоге исправленный API
Мы рекомендуем вам оставлять свои мысли и комментарии на нашемGitHubиStackOverflowна странице.
Примечание: эта статья содержит много ссылок, но общедоступная учетная запись WeChat не может содержать внешние ссылки.Пожалуйста, посетите мою колонку о Nuggets. Ссылки в статье должны быть через стену для доступа.