Serhii Polishchuk profile picture Serhii Polishchuk

Jetson Nano - оглядини найдешевшого компьютера для машинного навчання

May 23, 2019

    На сайті Nvidia зовсім недавно з’явилася нова модель із серії Jetson-ів - Nano. З назви стає зрозуміло що це щось невелике проте так як вся серія призна до глибинного навчання (DL), то стало цікаво на що здатна ця крихітка.

    Замовити Nano можна на сайті Nvidia. Є також російськомовна версія де можна прочитати про технічні характеристики. Для доставки в Україну я скористався службою доставки MEEST AMERICA Inc. Доставка через Делавер (без податку США) обійшлась у 8 USD та приблизно 3 тижні. Чек за доставку Податок в Україні також сплачуватись не довелось - на данний момент посилки до 100 Євро не обкладаються податком.

    Характеристики та архітектура

    Девайс складається з двох частин. Базова плата з чотирьох ядерним процесором ARM Cortex®-A57 і 4Гб ОЗУ на борту, має усі необхідні порти для підключення переферійних пристроїв - HDMI, Display Port, 4xUSB, gigabit ethernet, 2 роз’єми жилення, GPIO і роз’єм для камери сумісний з Raspbery Pi. Взагалі то вся базова плата подібна до популярного Raspberry Pi, от тільки bluetooth і wifi доведеться підключати окремо.

    Верхня плата з радіатором, яка вставлена в роз’єм та міцно прикручена гвинтами є основною відмінністю від вже згаданої Raspberry Pi, і головним об’єктом досліджень. На ній розташований 128 ядерний GPU від Nvidia, Maxwell архітектури.

    Для живлення плати з GPU потрібно 10 Ватт потужності у стандартному режимі живлення. Роз’єм microUSB від 2А блока живлення може надати таку потужність, проте в такому разі не вистачить на інші перефірійні пристрої й на роботу всієї системи в цілому, тому система може підвисати і працювати не стабільно. Для цього на платі є barrel роз’єм, він дозволяє подати одразу 4А. Між barrel роз’ємом (J25) та роз’ємом камери (J13) розташований коннектор J48 на який слід встановити джампер задля переключення живлення з microUSB (по замовчанню) на barrel роз’єм. Про це написано на самій платі - “ADD JUMBER TO DISABLE uUSD PWR”.

    джампер живлення USB -> Barrel

    Для живлення я використав БЖ Chieftec CDP-085ITX +12В / 7.5А та підстроєчний стабілізатор напруги:

    стабілізатор напруги

    Початок роботи

    Для початку знадобиться SD карта, мінімум 16 Гб. Краще одразу 32 Гб, бо 16 вистачить всього на пару днів експерементів - розпаковка моделей потребує додаткових МегаБайтів. На карту буде одразу записано Ubuntu з усіма необхідними для роботи драйверами. Інструкція по запису імейджу на карту знаходиться на оф сайті , єдине що скачати доволі об’ємний образ в мене вийшло не з першого разу через нестабільний конект із сервером прийшлось докачувать через консоль:

    wget -c --retry-connrefused --tries=0 --timeout=5 https://developer.nvidia.com/embedded/dlc/jetson-nano-dev-kit-sd-card-image
    

    Інструкція з установки на оф сайті, проте вона мало чим відрізняється від установки Raspbian, if you know what I mean ;) Єдина можлива відмінність, що для запису я скористався графічною утилітою balenaEtcher(Linux, Win, Mac). Для любителів консолі, все залишається незмінно - комманда dd сконвертує і запише образ на диск.

    Після першої загрузки, та настройки робочого оточення треба скачати на встановити необхідні демо матеріали. Інструкція та сам код знаходяться на GitHub, короткий огляд демо матеріалів нижче.

    Привіт Світ (Hello World)

    Документація розділена на дві умовні частини:

    • Hello AI World - тут розглядається робота з вже натренерованими моделями
    • Two Days to a Demo - тренування своїх власних моделей і робота з ними

    Для другої частини знадобиться комп’ютер з відеокартою, або хмара, але на данний момент вони дуже дорогі. Рекомендована сайтом timdettmers.com (General GPU Recommendations) відеокарта RTX 2070 на 05.2019 коштує десь 700 USD. Тому я зосередився на першій частині, а другу залишив до часу коли зберу стипендії на відеокарту ;)

    1. Встановлення JetPack

    Перша частина про встановлення JetPack, але т.я. я встяновив образ на SD карту одразу, то він уже є, тому окремо ставити його не треба. Але є ідея спробувати поставити Raspbian, щоб трохи зекономити ресурсів, і тоді вже спробувати поставити JetPack. Але це задача на далеке майбутнє, спрешу треба спробувати працювать з Jetson без X сервер взагалі.

    2. Готуємо код

    Друга частина розказує про те як скачати та встановити код для роботи з Hello AI World. Спершу переконаємось що cmake встановлено:

    sudo apt-get install git cmake
    

    Потім скачаємо код з GitHub репозиторію та ініціалізуємо сабмодулі:

    git clone https://github.com/dusty-nv/jetson-inference
    cd jetson-inference
    git submodule update --init
    

    Під час запуску cmake, спеціальний скрипт (CMakePreBuild.sh) буде запущено перед інсталяцією, який встановить необхідні залежності. Скрипт потребує прав супер користувача. Необхідні моделі будуть скачані з мережі.

    mkdir build
    cd build
    cmake ../
    

    Тепер можна компілити код:

    make
    sudo make install
    

    3. Розпізнавання об’єктів (image recognition)

    Існує багато типів нейронних мереж, які різняться за своїм призначенням. Можна виділити такі типи як розпізнавання, локалізація та сегментація.

    Для тренування нейромереж був створений популярний на данний час серві ImageNet. ImageNet - це база данних аннотованих фотограій. Кожне фото може бути позначене одним або декількома тегами(іменниками). Таким чином ImageNet є однією з найбільших сховищ яке використовують для тренування нейромереж.

    Нейронка яка поставляється разом з Jetson Nano натренована розпізнавати до 1000 різних об’єктів Консольна комманда imagenet-console здатна розпізнати натреновані об’єкти по фотографії. Команда приймає два аргументи - повний або відносний шлях до фотографії яку треба розпізнати а також шлях куди скаладати результат роботи. На фотографії в результаті буде встановлено клас та відсоток впевненості.

    Для початку переконаймося що ми у папці з скомпільованими програмами: cd ~/jetson-inference/build/aarch64/bin

    Далі запустимо программу розпізнавання:

    ./imagenet-console path/to/input-image.jpg path/to/output-image.jpg

    Розпізнавання апельсину пройшло успішно:

    апельсин розпізнано