Что это
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.
Комментарии (9)
DustCn
19.06.2024 19:36>> Как мы видим, fps на cpu очень низкий
https://docs.ultralytics.com/integrations/neural-magic/#benefits-of-integrating-neural-magics-deepsparse-with-yolov8 же или это тестирование ARM vs GPU внутри Jettison-а?
Yapokhozhnakota
19.06.2024 19:36+1А масштабировать можно производительность?
Например: исходный кадр 100*100 разбиваем на 4 по 50*50 и каждый обрабатываем на отдельном Jetson nano.
Dynasaur
19.06.2024 19:36+1А что делать с объектом распознавания, у которого ухо попадёт в один джетсон, а нос в другой? Можно поступить иначе - выделять из видеопотока каждый четвёртый кадр и обрабатывать на отдельном джетсоне, но и тут будут проблемы с отслеживанием объекта. Один распознает пульт управления как мобилу, а другой как клавиатуру и с разными ИД, координатами и размерами. А третий вообще не выделит. А четвёртый два объекта примет за один. Потом надо будет ещё понять, что это один и тот же объект.
Да и слишком громоздко это выйдет. В таком случае проще будет запустить на обычном PC с нормальной видеокартой.
Technik12345 Автор
19.06.2024 19:36+1Ну да, за счет 4х джетсонов можно купить комп с нормальной видяхой, с 4060 иди даже 4070, и будет больше 3000 CUDA ядер(4 * 128 = 512 CUDA у 4х джетсонов), нормальная память(у видяхи будет своя память, и не придётся брать свапом с CD карточки, и нейросеть будет работать быстрее), но разве что будет большое энергопотребление, и в условном роботе с 18650 будет сложно запускать.
ViktorPavlovA
19.06.2024 19:36+1не корректное сравнение.Все таки jetson nano это про автономность без излишнего энергопотребления, хотя тоже сейчас он безбожно устарел и надо крутить на npu rk3588-e привет
Bo_K_S
спасибо что указали репу откуда взяли код) я мельком глянул там и не увидел оптимизации модели в tensorrt, только openvino через onnx. если джетсон нано смог выдавить из ванильной yolo8n 11 фпс - то это сам по себе уже почётный результат) а вот если конвертнуть её в tensorrt с квантированием в int8, и картинки кидать какие-нить 128х128 то я бы тогда посмотрел на фпс)
ret77876
К сожалению, с TensorRT возникли проблемы, начиная с экспорта.
https://habr.com/ru/articles/822917/ (ближе к концу статьи есть информация про Jetson Nano)
Saz_An
На Jetson Nano с int8 есть проблемки
https://forums.developer.nvidia.com/t/why-jetson-nano-not-support-int8/84060