Что это
Jetson nano позиционируется как платформа для запуска нейросетей или других сложных программ которым требуется CUDA, в которой есть GPIO порты.
Характеристики
GPU 128-core Maxwell™ GPU
CPU Quad-core ARM A57 @1.43 GHz
RAM 2 GB 64-bit LPDDR4 | 25.6 GB/s
Хранилище - microSD
1x MIPI-CSI camera connector
Питание через USB C - 5V 3A
40-pin GPIO
12-pin header: Power and related signals, UART
4-pin разъём под вентилятор
Размеры: 100mm x 80mm x 29mm
Нет wifi
Настройка CUDA
Первым делом я попытался запустить CUDA на официальном образе, в стоке. Но установщик выдавал рекурсивную ошибку. На просторах интернета был найден репозиторий с готовым образом. Записав его на microSD карточку(для комфортной работы надо минимум 64 гига, т.к. сам образ занимает 31 гиг), и открыв jtop(htop но специально под jetson, отображающий его GPU, и статус некоторых библиотек) я увидел заветные “CUDA: 10.2.300”.
Тестирование YOLOv8
Начнём с того, что я буду тестировать Yolo V8 (подробнее про запуск тут). Сначала нужно установить yolo, которая входит в пакет Ultralytics, а он вместе с собой доставляет ещё кучу всего, так что нужно активировать виртуальное окружение
// создаём и переходим в папку
mkdir yolo_test
cd yolo_test
// активируем виртуальное окружение
python3 -m venv yolo_test
source venv/bin/activate
// Ставим YOLO
pip install ultralytics
Активируем jetson-clock, снимаем ограничение на питание, врубаем вентилятор
sudo nvpmodel -m 0 // отключаем ограничение потребления
sudo jetson_clocks // Фиксируем частоты
sudo bash -c "echo 255 > /sys/devices/pwm-fan/target_pwm" //Ставим вентилятору максимальные обороты
Код для запуска тестов нейросети взял (тут)
Запускаем….
Jetson намертво завис, решаем отключением питания.
Отключаем графический интерфейс sudo systemctl stop gdm
, cнова запускаем.
Скрипт начинает работу, но система убивает его, из-за недостатка оперативки. Расширяем swap:
git clone https://github.com/JetsonHacksNano/resizeSwapMemory
./setSwapFileSize [ [-g #gigabytes ] | [ -m #megabytes ] | [ -h ]
Снова запускаем и получаем результаты
Диаграмма FPS на 2х моделях(минимальной и модели для сегментации(подробнее тут, тут))
Как мы видим, fps на cpu очень низкий(1 кадр в секунду), и использовать его будет сложно реально. А фпс на CUDA отличается в лучшую сторону, 11 фпс это хороший результат при потреблении максимум в 9-10 вт.
Энергопотребление
Jetson nano крайне требовательный к питанию(по оф сайту 5в 2а, но на самой плате написано 5v 3a 😁). У меня получалось так, что при минимальной просадке напряжения меньше 5 в, jetson выдаёт OS ALARM 0x0000001, и начинает тротлить. Из-за этого необходимо найти хороший блок питания, который не будет просаживать напряжение при скачках потребления. Я пробовал на нескольких блоках питания(и на 1 повербанке) с одинаковыми характеристиками(выдают 5v 3А). В итоге, получились такие результаты:
Noname повербанк: в пиках нагрузки периодически возникает os alram.
Xiaomi блок питания 33w: работает идеально, никаких os alarm нет.
Лабораторный блок питания(Wanptek APS3010H) выставленный на 5.15v, 8А, питающий jetson через порезанный type-c провод: В пиках выдает многократные os alram.
Xiaomi блок питания 33w, в нём usb тестер fnirsi: В пиках выдает многократные os alram.
Тесты проводились на блоке питания Xiaomi. Так-же вентилятор который я поставил(подробнее позже) кушает неплохо, с его учётом jetson потребляет в пике 2.2А, без него 1.8А
Корпус
Одна из проблем это голые контакты снизу платы, а следовательно риск замыкания от установки на металлическую поверхность, решается самым обычным корпусом. Корпус был найден на grabcad(корпус, подходит для обычного jetson nano и jetson nano 2gb), распечатан на 3D принтере, зашкурен и покрашен в чёрный цвет.
Охлаждение
Сразу после того, как он попал ко мне в руки, я заменил штатную термопасту на arctic mx-6. В режиме простоя jetson греется не сильно, градусов 30-40 максимум, благодаря хорошему радиатору. А вот во время активной работы, радиатор нагревается до такого состояния, что касаться больно, но при этом температура gpu и cpu не превышает 45 градусов. Для решения проблемы был куплен кулер NIDEC UltraFlo R40W12BS5AC-65(не судите строго, искал на авито, с подходящими размерами 40х40 и 4х пиновым штекером), и установил его пользуясь шпильками и гайками.
WiFi
В качестве WiFi модуля был выбран tplink wn725n, система его сразу опознала, подключение к wifi сети делается командой nmcli d wifi connect <network_name> password <password>
Возможно мне ‘повезло’, но у меня jetson подключался к сети примерно каждый 2 ребут)
Вывод
По моему мнению, данное устройство имеет смысл покупать если вам нужно запускать нейросети в поле, и при этом вам нужен gpio(например для общения с arduino(вдруг вы решите сделать турель с автонаведением)) или если вам нужны ядра CUDA, и вы не можете экспортировать модель например в openvino. Если вам нужны CUDA ядра(их тут 128), и нужна мобильность то имеет смысл покупать jetson nano, но на 4GB памяти(его цена отличается не сильно). В случаях если вам надо запускать нейросеть, и при этом нужен GPIO, имеет смысл брать jetson nano но на 4гб. В случаях когда CUDA не принципиально нужна(можно экспортировать например в openvine), энергопотребление не важно и GPIO тоже не нужно, я бы посоветовал присмотреться к мини пк с N100 или с другими процессороми Intel.