Варианты имплементации нейронных сетей
После успешного сбора мини-компьютера Jetson Nano хочется поближе познакомиться с его возможностями. Но если обычный пользователь не увидит разительных отличий от стандартного дистрибутива Ubuntu, то мы обратим внимание на инструменты, которые помогут нам в дальнейшем имплементировать обученную нейронную сеть на стенд, или, как говорят датасаентисты, «выкатить модель в прод».
Но прежде, чем бросаться реализовывать нейронные сети, давайте знакомиться.
Кратко о системе Jetson Nano
Для получения исчерпывающей информации о версии программного обеспечения и параметрах «железа» вашего Jetson Nano удобно использовать утилиту jtop. Запуск простой команды в Terminal Jetson Nano:
$ jtop — приоткрывает внутренний мир нашего устройства
Важно в дальнейшем помнить про версию Jetpack 4.5.1 (L4T 32.5.1) – от нее зависит некоторые версии дополнительных утилит (например, версия образа docker для имплементации решений на базе Tensorflow).
Помимо всего прочего данная утилита полезна при наблюдении за температурой и загрузкой процессорных ядер и графического ускорителя во время выполнения программы.
Убедившись в мощности нашего устройства и запомнив версию прошивки, далее перейдем к насущным вопросам.
Какими способами можно имплементировать модели на Jetson Nano?
В силу специфики элементной базы, на которой построен Jetson Nano, нельзя просто скопировать и развернуть нейронную сеть, обученную на стандартной машине в вашем любимом фреймворке на подобии Tensorflow, Pytorch, Caffe и т.д. Однако выход из такой неудобной ситуации все-таки есть, а точнее даже три:
- Конвертация моделей в TensorRT
- Использование контейнеризации (docker)
- Использование сторонних пакетов (jetson-inference), выступающих в качестве высокоуровневого интерфейса взаимодействия с TensorRT моделями
Теперь по порядку.
Конвертация моделей в TensorRT
Tensor RT в широком смысле это отдельный комплект разработки программного обеспечения, позволяющий оптимизировать выполнение операций нейронной сети на чипах Nvidia. Для нас достаточно того факта, что практически все популярные фреймворки позволяют сконвертировать модели в формат TensorRT и оптимизировать их. Для подробной информации можно обратиться к документации.
Мы пока не останавливаемся на деталях имплементации моделей на TensorRT. Давайте просто убедимся, что в базовом окружении python, поставляемым с дистрибутивом системы, действительно имеется предустановленный пакет tensorrt. Для этого достаточно ввести следующую команду в Terminal Jetson Nano:
$ pip3 list
На экране мы увидим все доступные нам пакеты и модули python, нас же интересует строка:
Убедившись в наличии tensorrt, мы спокойно можем переносить модели нейронных сетей на наше устройство.
Хоть у нас теперь и есть решение «в лоб», но время не стоит на месте, и все большую популярность набирает следующая парадигма.
Использование контейнеризации (docker)
Мода последних лет на микро сервисные архитектуры программного обеспечения не обошла стороной разработки инженеров Nvidia. В комплекте программного обеспечения Jetson Nano идет встроенная поддержка docker.
По данной ссылке можно найти множество вариантов образов контейнеров под практически любые задачи. Основное удобство состоит в том, что один раз собрав контейнер, вы может с легкостью переносить его на другие устройства Jetson Nano с аналогичной прошивкой. Масштабируемость за бесплатно – пользуйтесь.
В нашем случае мы взяли образ TensorFlow Container. Для скачивания образа вводим в Terminal команду
$ sudo docker pull nvcr.io/nvidia/ l4t-tensorflow:r32.5.0-tf2.3-py3
которая предоставит образ для нашей версии прошивки с предустановленным внутри Tensorflow 2.3.
Для запуска контейнера достаточно воспользоваться следующей командой Terminal:
$ sudo docker run -it —rm —runtime nvidia —network host nvcr.io/nvidia/ l4t-tensorflow:r32.5.0-tf2.3-py3
После сборки контейнера вы получаете среду с пакетами python, необходимыми для имплементации моделей нейроных сетей.
Продемонстрируем наш образ, хранящийся на Jetson Nano, выполнив команду Terminal
$ sudo docker image ls
Наличие готовых контейнеров с необходимыми пакетами, легкость и простота масштабирования решения – что может быть лучше?
Использование сторонних пакетов (jetson-inference)
Компания Nvidia прикладывает все усилия не только к монополизации рынка графических вычислителей, но и созданию собственных высокопроизводительных компьютеров с мощными процессорами. И это еще не все. Инженерами Nvidia делается попытка создания собственной экосистемы разработки, которая включает высокоуровневое программное обеспечения, позволяющее «на коленке» создавать рабочие прототипы решений на базе подходов с использованием искусственного интеллекта. Такая прибыльная ниша как микро-компьютеры не осталась без внимания.
Мы рассмотрим (не прорекламируем) пакет jetson-inference. Для работы с ним необходимо пройти путь установки и тестирования для чего есть отличное видео. Мы не будем останавливаться на деталях установки и полном разборе имеющихся возможностей, но приведем часть наиболее важных инструментов.
Использование ранее обученных нейронных сетей для непосредственного запуска. Идея состоит в том, что часто для построения прототипа достаточно просто попробовать уже готовое решение. И Jetson Nano дает вам такую возможность. Представим на секунду, что ваша бизнес-задача — это детектирования предметов на стуле на кухне вечером, на который смотрит веб камера. Для того, чтобы ее успешно решить достаточно пройти следующие шаги:
1. Проверить подключение к вашей камере с использованием команды Terminal:
$ v4l2-ctl –list-devices
в нашем случае результат положительный
2. Найти в папке с пакетом скрипт по детектированию предметов:
jetson-inference/build/aarch64/bin/my-detection.py
3. Запустить скрипт командой Terminal:
$ python3 my-detection.py
и наблюдать запуск TensorRT
4. Если все прошло успешно, то вы сможете начать анализировать возможность решения вашей бизнес-задачи и писать отчет. В нашем случае вывод прост: задачу можно решать методами искусственного интеллекта при небольших доработках исходной модели. А результат на экране — кружка и бутылка:
Использование дообучения имеющихся моделей на ваших данных. Такой способ часто используется на практике, и мы с вами подробно познакомимся с ним в следующих частях нашей серии статей.
Использование предобученных моделей нейронных сетей для реализации извлечения признаков из данных. С этим вы можете подробно ознакомиться самостоятельно в документации к пакету.
Как итог
Сегодня мы познакомились со способами имплементации решений на основе нейронных сетей в Jetson Nano. Кратко проговорили про каждый из трех подходов. Нельзя выделить из них лучший – данный вопрос решается индивидуально в рамках конкретной бизнес-задачи. Далее нас ждет сквозной пример выработки решения для задачи детектирования объектов – от подготовки данных до выкатки решения на стенде Jetson Nano.