- PyTorch Mobile Now Supports Android NNAPI
- Как перенести нейросеть на мобильное устройство
- Нейросеть до конвертации.
- Конвертация нейросети.
- Как работает модель в tensorflow-lite
- Загрузка модели, выделение тензоров
- Прогнозирование, использование модели
- Перенос модели на android устройство (мобильный телефон)
- Создаем новый проект в Android Studio
- Теперь добавим в проект саму модель нейросети tf-lite
- Привяжем модель нейросети к android приложению
- Создадим .apk и перенесем его на мобильный телефон
PyTorch Mobile Now Supports Android NNAPI
Author: David Reiss, Software Engineer, AI Mobile Platform, Facebook
T oday, we are announcing a prototype feature in PyTorch: support for Android’s Neural Networks API (NNAPI). PyTorch Mobile aims to combine a best-in-class experience for ML developers with high-performance execution on all mobile hardware. The support for NNAPI is essential to meeting that goal since it expands the set of hardware that we can use to quickly execute models. This initial release includes fully-functional support for a small but powerful set of features and operators, and we will be expanding support in the coming months.
NNAPI allows Android apps to run computationally intensive neural networks on the most powerful and efficient parts of the chips that power mobile phones, including GPUs (Graphics Processing Units) and NPUs (specialized Neural Processing Units). It was introduced in Android 8 (Oreo) and significantly expanded in Android 10 and 11 to support a richer set of AI models. While NNAPI provides a conveniently unified interface to various hardware drivers, it is a low-level API that requires significant integration work. Higher-level frameworks like PyTorch make these benefits accessible to more application developers.
NNAPI doesn’t have a native on-disk model format, so we have chosen to encapsulate the model definition within an ordinary TorchScript model. Developers will prepare their model for execution on NNAPI after training. Then the saved model can be packaged in an Android app (or delivered over the network), then loaded and run using PyTorch Mobile’s Java API or the libtorch C++ API. For applications already using PyTorch Mobile, no code changes are required. Developers can simply replace their CPU model with an NNAPI model.
Accessing and utilizing Android’s NNAPI for PyTorch developers is especially appealing for always-on, real-time models, such as on-device computer vision. These models tend to be compute-intensive, latency-sensitive, and power-hungry. This trifecta of requirements is challenging to concurrently satisfy and makes these models great candidates to leverage hardware acceleration. This is one of the reasons that Facebook is interested in NNAPI. The AI model that enables the virtual background experience on our Portal devices is now being tested using NNAPI within the Messenger application to enable the immersive 360 backgrounds feature.
As seen in Table 1 below, utilizing Android’s NNAPI for this model on a Pixel 3 enables performance between single-core CPU and 2-core CPU, with the benefit of freeing up the CPU for non-ML application code. Additionally, on newer devices like the Pixel 4 and Pixel 5, NNAPI enables higher levels of performance, which could be harnessed by a more complex ML model.
Similarly, many real-time audio models are also being introduced in mobile applications. With similar concurrency, latency, and power requirements, features such as background noise reduction would also benefit from NNAPI-based hardware acceleration.
Converting machine learning models between frameworks or APIs is always tricky, and this was no exception. While PyTorch and NNAPI were both developed to run the same types of neural networks, lots of small differences in semantics need to be bridged when converting from one to the other. For example:
- NNAPI uses an integer bias for quantized convolution operations, while PyTorch uses floating point.
- PyTorch and NNAPI expect different memory ordering for weight tensors in convolutions.
- PyTorch previously had a complicated internal representation of upsampling operations, which had to be simplified for easier conversion to NNAPI.
- PyTorch and NNAPI have different representations of NHWC tensors. NNAPI only supports contiguous tensors, so an explicit NHWC representation is required. PyTorch supports strided tensors, so the convention is to always use NCHW semantics, but optionally combine with channels-last memory format to get NHWC behavior under the hood.
This first prototype release of NNAPI support in PyTorch enables well-known linear convolutional and MLP models, when deployed on Android 10 devices and above. Upcoming releases of PyTorch will add additional features, such as:
- Support for additional operators to unblock additional model types.
- Support for accelerated models based on the Mask R-CNN architecture. Learn more about Mask R-CNN on mobile at https://research.fb.com/blog/2018/01/enabling-full-body-ar-with-mask-r-cnn2go/.
- Support for the earlier Android versions, 8 (Oreo) and 9 (Pie).
- Support for models that utilize Control Flow semantics.
- Models that can utilize NNAPI when available on a user’s Android phone, but automatically fall back to execution on the CPU otherwise.
Using the same phones reflected in Table 1, Table 2 showcases that benchmarking the open-source MobileNetV2 model results in similar CPU-offload and even more significant performance benefits as seen in the 360 Background-Enabling model.
For more information on how to use PyTorch and Android NNAPI in your app, and reproducing the same MobileNet v2 based benchmark, please see our tutorial.
We’d like to thank the Android NNAPI team, without whom this work could not have been possible. Throughout our partnership, they have demonstrated a strong commitment to bringing accelerated neural networks to millions of Android users. We appreciate the work they have done to help make it possible for PyTorch to provide a path to NNAPI for our developers. We’d specifically like to thank Jean-Luc Brouillet, Miao Wang, Xusong Wang, Andy Dyer-Smith, and Oli Gaymond.
Источник
Как перенести нейросеть на мобильное устройство
В статье поговорим как обучить несложную CNN сеть с помощью tensorflow, конвертировать готовое с помощью tensoflow-lite и перенести на мобильное устройство под управлением android.
Описывается личный опыт автора, поэтому нет претензий на всеохватывающее руководство.
Нейросеть до конвертации.
Для старта возьмем не слишком сложную нейросеть, код которой приведен ниже:
Краткое пояснение по коду. После импорта пакетов tensorflow,numpy мы формируем модель нейросети. Модель представляет из себя только один слой и только один нейрон.
Сама структура модели представляет из себя два набора данных, в которых:
Данные наборы «укладываются» в формулу Y = 2X – 1. Таким образом, для каждого Y из набора прослеживается зависимость.
После формирования модели производится ее компиляция с оптимизатором sgd и функцией потерь mean_squared_error.
Далее в модель попадают наборы данных и производится обучение на протяжении 500 эпох
(model.fit(xs, ys, epochs=500).
*Нейросеть лучше обучать на железе помощнее либо в Google colab для ускорения процесса, так как 500 эпох могут занять до 2-3 часов времени.
И, наконец, модель проверяется путем подачи ей на вход числа 10.0. То есть мы пытаемся выяснить с помощью модели значение Y при X=10.0. В идеале, согласно формуле, Y должен быть 19.0. Но в итоге будет число, сильно приближенное по значению к 19.0.
Так работает созданная нейросеть. Именно ее мы и будем конвертировать и переносить на android устройство.
Конвертация нейросети.
Для целей переноса модели на мобильное устройство воспользуемся tensorflow-lite. Сам по себе tensorflow-lite представляется из себя набор утилит, преследующий две основные цели. Первая из которых — сделать из нейросети модель, приемлемую для мобильного устройства. Обычно под этим подразумевается уменьшение размера и сложности сети, что, в свою очередь, приводит к небольшому падению точности работы. Тем не менее это необходимый компромисс между аккуратностью работы нейросети и ее размерами на мобильном устройстве. Вторая цель — создание среды выполнения для различных мобильных платформ, включая android, ios, микроконтроллеры.
Важной чертой tensorflow-lite является то, что с ее помощью невозможно тренировать модель. Нейросеть должна быть сначала обучена с помощью tensorflow и далее конвертирована в формат tensorflow-lite.
Зачем вообще переносить нейросеть на мобильное устройство?
Вопрос риторический, но из аргументов «за» — приватность используемых данных и отсутствие необходимости использования сетей связи при работе, например, с облачными решениями.
Говоря о конвертации в приемлемый tensorflow-lite формат, вернемся к коду нейросети из предыдущего блока.
Необходимо сперва сохранить готовую модель:
В результате получится файл «model.pb».
Теперь очередь конвертации:
Далее сохраним сконвертированную модель в формате .tflite используя pathlib:
Готовую model.tflite модель можно использовать в различных окружениях, например, android или ios.
Как работает модель в tensorflow-lite
Загрузка модели, выделение тензоров
Загрузим модель в интерпретатор, выделим тензоры, которые будут использоваться для ввода данных в модель для прогнозирования, а затем прочитаем то, что выводит модель.
Здесь проявляется главное отличие tensorflow-lite от Tensorflow. Если во втором случае возможно просто использовать model.predict(что-то) и сразу получить результат, то в tensorflow-lite необходимо поработать с сходными и выходными тензорами, приводя свои данные для соответствия их формату.
Посмотрим как это выглядит:
В результате вывод будет следующим:
В выводе input_details необходимо обратить внимание на shape(размерность) — массив 1,1 и класс данных — numpy.float32. Эти параметры будут определять входные данные и их формат.
Используя данную информацию, определим Y для X=10.0:
В выводе output_details формат данных схож, поэтому ответ нейросети будет в виде [[y]], также как и [[x]]:
Прогнозирование, использование модели
Чтобы заставить интерпретатор выполнить прогнозирование, необходимо задать входной тензор со значением для прогнозирования:
Так как у нас очень простая модель, в которой есть только один параметр ввода, поэтому это input_details[0], к нему мы и обращаемся в индексе.
Затем мы вызываем интерпретатор с помощью метода invoke.
Теперь мы осуществим прогнозирование с помощью модели, используя выражение get_tensor:
Опять же, существует только один выходной тензор, поэтому он будет выглядеть как output_details[0].
В целом код выглядит следующим образом:
Где 10 — это входное значение или X, а 18.97 — предсказанная величина, близкая к 19 (формула нейросети та же Y=2X – 1).
Перенос модели на android устройство (мобильный телефон)
После создания модели нейросети и ее конвертации в формат tensorflow-lite,
создадим приложение для Android.
Для этих целей воспользуемся IDE — Android Studio, которая в особом представлении не нуждается.
Скачивание и установка Android Studio может занять время, поэтому, если с этим возникнут сложности, лучше обратиться к сторонним мануалам. Язык, который будет использоваться при создании нашего приложения — Kotlin.
Приложение, которое будет перенесено на android — это простая нейросеть, которая была создана и конвертирована выше по тексту. При вводе значения Х пользователем, нейросеть будет предсказывать Y, выводя результат на экране смартфона.
Создаем новый проект в Android Studio
Цепочка действий после запуска Android Studio следующая:
File → New → New Project→ Empty Activity
Далее заполним поля проекта, не забыв указать язык — Kotlin:
После нажатия Finish, Android Studio создаст проект.
*На картинке уже готовый проект, при создании дизайн выглядит иначе.
Заменим код, который там приведен на
Это сформирует внешний вид приложения.
Добавим зависимости Tensorflow lite
Нам нужны build.gradle файлы. Их в проекте два, и нужен тот, который содержит app в названии и расположен в директории app:
В этом файле, в конце, надо добавить зависимость tensorflow lite согласно установленной версии на ПК. В моем случае установлен «древний» tensorflow 1.9.0, поэтому добавлена эта зависимость —
*Как узнать версию tensorflow lite? Выполнить в cmd — pip freeze и посмотреть версию tensorflow либо через idle python — import tensorflow as tf; print(tf.__version__) .
В этом же файле также необходимо добавить:
Полностью файл build.gradle будет выглядеть так:
Теперь добавим в проект саму модель нейросети tf-lite
В папке main создадим папку assets и перенесем туда ранее сконвертированную модель —
Привяжем модель нейросети к android приложению
Откроем файл MainActivity.kt:
Перенесем в него
После этого, можно протестировать готовое приложение, нажав на кнопку Run ‘app’
Тестирование проведем в эмуляторе android устройства:
После ввода X, приложение выдаст значение Y, приближенное к расчетному значению по формуле Y=2X-1, то есть нейросеть работает.
Создадим .apk и перенесем его на мобильный телефон
Выберем Build ->Build bundle.
Android Studio сформирует приложение с расширением .apk, которое можно забрать из
\app\build\outputs\apk\debug и, подключив смартфон к ПК, перенести на смартфон.
В принципе, все, теперь простая нейросеть живет на смартфоне, занимая всего 10Мб.
- не конвертированная нейросеть — скачать
- конвертированная в tf-lite нейросеть — скачать
- apk приложение для android — скачать
Может быть интересно:
Источник