Привет, Хабр.

Относительно недавно, в этом, 2019 году, NVIDIA анонсировала одноплатный компьютер совместимого с Raspberry Pi форм-фактора, ориентированный на AI и ресурсоемкие расчеты.



После его появления в продаже, стало интересно посмотреть, как это работает и что на нем можно делать. Стандартные бенчмарки использовать не так интересно, так что придумаем свои, для всех тестов в тексте приведены исходники. Для тех, кому интересно что получилось, продолжение под катом.

Hardware


Для начала, технические характеристики с сайта NVIDIA:



Из интересного, здесь можно отметить несколько моментов.

Первое — это GPU, имеющий 128 ядер, соответственно, на плате можно запускать GPU-ориентированные задачи, вроде CUDA (поддерживается и установлен из «коробки») или Tensorflow. Основной процессор 4х ядерный, и как будет показано ниже, вполне неплохой. Память 4Гб, общая между CPU и GPU.

Второе — это совместимость с Raspberry Pi. Плата имеет 40-пиновый разъем с различными интерфейсами (I2C, SPI и пр), также имеется разъем камеры, который тоже совместим с Raspberry Pi. Можно предположить, что большое количество уже имеющихся аксессуаров (экраны, платы управления моторами и пр) будут работать (возможно, придется использовать удлиннительный кабель, т.к. Jetson Nano все же отличается по габаритам).

Третье — на плате имеется 2 видеовыхода, Gigabit-Ethernet и USB 3.0, т.е. Jetson Nano в целом даже чуть более функциональна чем «прообраз». Питание 5В, может браться как по Micro USB, так и через отдельный разъем, который рекомендуется для майнинга биткоинов ресурсоемких задач. Так же как и в Raspberry Pi, софт грузится с SD-карты, образ которой нужно предварительно записать. В целом, по идеологии, плата вполне похоже на Raspberry Pi, что видимо и задумывалось в NVIDIA. Но вот WiFi на плате нет, что есть определенный минус, желающим придется использовать USB-WiFi модуль.

Если присмотреться внимательно, то можно увидеть, что конструктивно устройство состоит из двух модулей — собственно модуля Jetson Nano, и нижней платы с коннекторами, соединение осуществляется через разъем.



Т.е. плату можно отсоединить и использовать отдельно, это может быть удобно для встраиваемых решений.

Кстати о цене. Оригинальная цена Jetson Nano в США 99$, цена в Европе с наценкой в местных магазинах порядка 130Евро (если ловить скидки, наверно можно найти и дешевле). Сколько стоит Nano в России, неизвестно.

Software


Как упоминалось выше, загрузка и установка мало отличается от Raspberry Pi. Загружаем образ на SD-карту через Etcher или Win32DiskImager, попадаем в Linux, ставим необходимые библиотеки. Отличное по подробности пошаговое руководство есть здесь, я пользовался им. Перейдем сразу к тестам — попробуем запустить разные программы под Nano, и посмотрим как они работают. Для сравнения я использовал три компьютера — свой рабочий ноутбук (Core I7-6500U 2.5ГГц), Raspberry Pi 3B+ и Jetson Nano.

Тест CPU

Для начала, скриншот команды lscpu.

Raspberry Pi 3B+:



Jetson nano:



Для расчетов начнем с чего-нибудь простого, но требующего процессорного времени. Например, с вычисления числа Пи. Я взял несложную программу на Python со stackoverflow.

Не знаю, является ли она оптимальной или нет, но нам это и не важно — нам интересно относительное время.

Исходный код под спойлером
import time

# Source: https://stackoverflow.com/questions/9004789/1000-digits-of-pi-in-python

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(10000):
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2

t1 = time.time()

pi_array = []
for i in make_pi():
    pi_array.append(str(i))

pi_array = pi_array[:1] + ['.'] + pi_array[1:]
pi_array_str = "".join(pi_array)

print("PI:", pi_array_str)
print("dT:", time.time() - t1)


Как и ожидалось, программа работает не быстро. Результат для Jetson Nano: 0.8c.



Raspberry Pi 3B+ показал заметно большее время: 3.06c. «Образцовый» ноутбук выполнил задачу за 0.27с. В общем, даже без использования GPU, основной процессор в Nano вполне неплох для своего форм-фактора. Желающие могут проверить на Raspberry Pi 4, у меня ее в наличии нет.

Наверняка найдутся желающие написать в комментариях, что Python не лучший выбор для таких расчетов, еще раз повторюсь, что нам важно было сравнить время, необходимости его минимизировать здесь нет. Понятно, что есть программы, вычисляющие число Пи гораздо быстрее.

PyCUDA

Перейдем к более интересному, расчетам с помощью GPU, для чего разумеется (плата ведь от NVIDIA), будем использовать CUDA. Библиотека PyCUDA потребовала некоторого шаманства при установке, она не находила cuda.h, помогло использование команды «sudo env „PATH=$PATH“ pip install pycuda», возможно есть другой способ (еще варианты обсуждались на форуме devtalk.nvidia.com).

Для теста я взял несложную программу SimpleSpeedTest для PyCUDA, которая просто в цикле считает синусы, ничего полезного такой тест не делает, но время оценить им вполне можно, и его код простой и понятный.

Исходный код под спойлером
# SimpleSpeedTest.py
# https://wiki.tiker.net/PyCuda/Examples/SimpleSpeedTest

import pycuda.driver as drv
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy
import time


blocks = 64
block_size = 128
nbr_values = blocks * block_size
n_iter = 100000

print("Calculating %d iterations" % (n_iter))
print()

#####################
# SourceModule SECTION

# create two timers so we can speed-test each approach
start = drv.Event()
end = drv.Event()

mod = SourceModule("""__global__ void gpusin(float *dest, float *a, int n_iter)
                      {
                          const int i = blockDim.x*blockIdx.x + threadIdx.x;
                          for(int n = 0; n < n_iter; n++) {
                            a[i] = sin(a[i]);
                          }
                          dest[i] = a[i];
                      }""")

gpusin = mod.get_function("gpusin")

# create an array of 1s
a = numpy.ones(nbr_values).astype(numpy.float32)
# create a destination array that will receive the result
dest = numpy.zeros_like(a)

start.record() # start timing
gpusin(drv.Out(dest), drv.In(a), numpy.int32(n_iter), grid=(blocks,1), block=(block_size,1,1) )
end.record() # end timing
# calculate the run length
end.synchronize()
secs = start.time_till(end)*1e-3
print("PyCUDA time and first three results:")
print("%fs, %s" % (secs, str(dest[:3])))
print()

#############
# CPU SECTION
# use numpy the calculate the result on the CPU for reference

a = numpy.ones(nbr_values).astype(numpy.float32)
t1 = time.time()

for i in range(n_iter):
    a = numpy.sin(a)

print("CPU time and first three results:")
print("%fs, %s" % (time.time() - t1, str(a[:3])))


Как можно видеть, вычисление делается с помощью GPU через CUDA и с помощью CPU, через numpy.

Результаты:
Jetson nano — 0.67c GPU, 13.3c CPU.
Raspberry Pi 3B+ — 41.85c CPU, GPU — данных нет, CUDA на RPi не работает.
Ноутбук — 0.05с GPU, 3.08c CPU.

Все вполне ожидаемо. Расчеты на GPU гораздо быстрее расчетов на CPU (все же 128 ядер), Raspberry Pi отстает весьма значительно. Ну и разумеется, сколько волка не корми, у слона все равно больше ноутбучная видеокарта гораздо быстрее карты в Jetson Nano — вполне вероятно, что вычислительных ядер в ней гораздо больше.

Заключение


Как можно видеть, плата у NVIDIA получилась вполне интересной и весьма производительной. Она немного больше по размеру и дороже, чем Raspberry Pi, но если кому-то нужна большая вычислительная мощность при компактном размере, то оно вполне стоит того. Разумеется, нужно это не всегда — чтобы например, отправлять температуру на narodmon, хватит и Raspberry Pi Zero, причем с многократным запасом. Так что Jetson Nano не претендует на замену Raspberry и клонов, но для ресурсоемких задач она весьма интересна (это могут быть не только дроны или мобильные роботы, но и например, камера для дверного звонка с распознаванием лиц).

В одну часть все задуманное не уместилось. Во второй части будут тесты AI-части — тесты Keras/Tensorflow и задач по классификации и распознаванию изображений.

Комментарии (38)


  1. Ivanii
    19.07.2019 23:57

    В рабочем ноуте какая видеокарта?


    1. DmitrySpb79 Автор
      20.07.2019 01:47

      По памяти не помню, в понедельник посмотрю и напишу.


  1. IgorPie
    20.07.2019 00:56

    Немного отдалет субъективностью: Raspberry Pi v.4 c А72 вряд ли медленнее А57.
    В целом, железка занятная. Можно предварительно фильтровать видео перед сжатием и отправкой. Можно сделать игровую консоль. Цена только — не юзер френдли. Как раньше, сервер печати для стареньких принтеров + интернет радио за $13 — не поднимешь.


    1. DmitrySpb79 Автор
      20.07.2019 01:47

      Да, в тексте написано что тестировалась Raspberry Pi 3B+, Pi 4 у меня нет. Исходники выложены, если кто запустит тесты, добавлю результаты в текст.


    1. Tremere
      20.07.2019 10:47
      +2

      джетсон сделан не для этих целей, а для мобильных решений где например нужно запускать нейронную сеть


  1. bvbr
    20.07.2019 02:05

    M.2 Key E это PCIe ?2 ( плюс USB 2.0, I2C, SDIO, UART and PCM)
    можно пробовать подключать уже достаточно интересную периферию, но дороговато


  1. zoonman
    20.07.2019 06:55

    Десятый iPhone выпущенный больше года назад мощнее этой карточки. Он даже 4K@60 умеет кодировать, а тут специализированное решение не в состоянии справиться с этой элементарной для компании производящий видеокарты задачей.
    Аналогично 4-й малинке нет NVMe. Чем люди думают, когда делают эти железки?
    Какой смысл в этой железяке, если к ней банально нельзя подключить быстрый диск?


    1. Alex_ME
      20.07.2019 12:33
      +2

      NVidia Jetson не про кодирование видео. Больше ориентировано на всякие задачи робототехники, компьютерное зрение, ИИ и так далее. Если мало произвольности — ну вы можете купить Jetson Xavier, там GPU на базе Volta (512 cuda cores, 64 tensor cores).


    1. JerleShannara
      20.07.2019 16:32
      +7

      А чертов нож-открывашка пивных банок не может завалить медведя, хотя мой старый нож-кинжал, выпущеный в 1871 году делает это наура. Чем люди думают, когда делают эти ножи?
      Какой смысл в этом ноже, если им банально нельзя завалить медведя?


    1. yleo
      21.07.2019 03:12
      +2

      Десятое "сплющенное яблоко" стоит кратно больше $99, при (наверное) в 100000 раз большем тираже и при этом тоже не имеет NVMe ;-)


      1. iproger
        21.07.2019 06:38

        Не совсем.

        Появившиеся в сентябре 2015 смартфоны Apple iPhone 6s и iPhone 6s Plus стали первыми мобильными устройствами, оснащёнными встроенными NVMe-накопителями
        NVM Express


        1. yleo
          22.07.2019 16:28

          Спасибо что поправили меня, не ожидал что оно там уже появилось.


  1. Zifix
    20.07.2019 08:24

    Сколько стоит Nano в России, неизвестно.
    По предзаказу на официальном сайте 8 990 рублей, курьерская доставка по России (самолётом) входит в стоимость.
    Но вот WiFi на плате нет, что есть определенный минус, желающим придется использовать USB-WiFi модуль.
    Либо комбинированную плату типа такой + антенну NGFF


  1. yarston
    20.07.2019 10:59
    +1

    По производительности в нейросетях этот джетсон нано примерно как разогнанный kendrite K210 за $8 (460 gmulps). И распознование лиц там тоже работает. И с wifi вариант есть. www.youtube.com/watch?v=TaoEwmwEAE8


    1. Punk_Joker
      21.07.2019 06:05

      У kendrite K210 заявленно VGA@30, а здесь вроде как повыше разрешение. Да и ресурсов побольше.


    1. NetBUG
      21.07.2019 12:40
      +1

      Только хотел про K210 упомянуть. Но у него памяти 8 мегабайт. Если туда можно уложить нужную сетку — прекрасно, он ничего не жрёт и неплохо работает. Но банальный face encoder у меня упихать в него не получилось: каскад на распознавание лиц работает, а кодировщик занимает мегабайт 20.


  1. Andrey_Dolg
    20.07.2019 11:10
    -1

    Я так думаю, это больше для автопроизводителей, для которых, это не такой уж и большой ценник.


    1. IgorPie
      20.07.2019 19:22
      +1

      У автопроизводителей — невероятные требования по надежности. Там такая погремушка не пройдет.


  1. b0r1s
    20.07.2019 11:16
    -2

    Что там с процессорным майнингом Monero в Xmrig? Судя по наличию поддержки процессором SHA1 инструкций хешрейт майнинга должен быть выше чем у малинки.


    1. NetBUG
      21.07.2019 12:40
      +2

      Вы бы ещё на банковских карточках пытались майнить :)


      1. Dioxin
        22.07.2019 07:51

        Это не круто.
        Вот на симкарте — да.


        1. safari2012
          22.07.2019 16:04

          Это, по сути, одно и то же.


  1. alsoijw
    20.07.2019 16:35
    +2

    ИМХО важно указать — насколько нужны блобы


  1. MoHcTpoo
    20.07.2019 22:14
    +2

    Спасибо за обзор. Чуть больше года искал энергоэффективное решение для полевой обработки данных. А именно обработка видео и распознованием обьектов с камеры

    Хотели уже с интеловскими модулями для нейросетей делать, а тут оп, у нвидии 9к рублей, 10 ватт потребление да и без каких либо костылей с Pi4 работать будет. Да еще с мониторами уложимся в 35 ватт потребления и все питается от 5 вольт. Чет прям сказка

    Спасибо за обзор, пошел заказывать и собирать тестовый образец.


  1. daggert
    21.07.2019 11:15

    DmitrySpb79 попробуйте пожалуйста, если есть возможность, запустить ffmpeg с кудой (-c:v h264_nvenc) на данном устройстве. Я себе его давно присматриваю для работы в архиве, но все еще не уверен упрется-ли он в iops или скорей в gpu.


    1. DmitrySpb79 Автор
      21.07.2019 16:05
      +1

      Выложите кусок видео секунд на 10, который надо кодировать и командную строку для ffmpeg, попробую завтра.


      1. daggert
        21.07.2019 23:58

        Спасибо!


        ffmpeg -i out.mp4 -c:v h264_nvenc -preset slow out_h264.mp4


        http://disk.karelia.pro/lSaH5Yp/out.mp4 (это местный файлообменник, иногда выскакивает окно о вирусах). Интересует показатель speed, который в конце строки и fps во втором столбце. Если не сработает — видимо ffmpeg в репах без nvenc и тут затык ибо собирать его еще тот геморрой.


        1. a5b
          22.07.2019 04:07

          Судя по форумам, nvenc в jetson, в т.ч. nano отличается от настоящих видекарт, а ffmpeg его не умеет. Предлагают gstreamer
          https://devtalk.nvidia.com/default/topic/1041988/jetson-agx-xavier/ffmpeg-problem-solved-/
          https://devtalk.nvidia.com/default/topic/1050960/jetson-nano/support-for-nvdec-nvidia-video-codec-for-the-jetson-nano/post/5333805/#5333805
          https://devtalk.nvidia.com/default/topic/988535/jetson-tx1/nvenc-and-nvdec-apis-for-tegra-x1/
          документация
          https://docs.nvidia.com/jetson/l4t-multimedia/index.html
          https://developer.download.nvidia.com/embedded/L4T/r32_Release_v1.0/Docs/Accelerated_GStreamer_User_Guide.pdf?
          ACCELERATED GSTREAMER USER GUIDE DA_07303-4.0 | March 18, 2019 Release 32.1
          gst-omx (omxh264enc omxh265enc omxvp8enc) / gst-v4l2 (nvv4l2h264enc nvv4l2h265enc nvv4l2vp8enc)
          стр 14:
          gst-launch-1.0 videotestsrc! \
          'video/x-raw, format=(string)I420, width=(int)640, \
          height=(int)480'! omxh264enc! \
          'video/x-h264, stream-format=(string)byte-stream'! h264parse! \
          qtmux! filesink location=test.mp4 -e


          Для ffmpeg https://developer.nvidia.com/ffmpeg указывают на матрицу с настоящими gpu — https://developer.nvidia.com/video-encode-decode-gpu-support-matrix


        1. DmitrySpb79 Автор
          22.07.2019 11:23

          > ffmpeg -i out.mp4 -c:v h264_nvenc -preset slow out_h264.mp4

          Попробовал, не запустилось: Unknown encoder 'h264_nvenc'

          «ffmpeg -i out.mp4 -c:v libx264 -preset slow out_h264.mp4» дает fps=3-4:
          fps=3.4 q=31.0 size= 1461kB time=00:00:01.96 bitrate=6098.0kbits/s speed=0.0584x

          Еще здесь посмотрите
          devtalk.nvidia.com/default/topic/1050950/jetson-nano/h-264-h-265-encoding-using-jetson-nano-gpu


          1. daggert
            22.07.2019 16:21

            Спасибо за тест, буду тогда смотреть далее в сторону решений в виде quadro.


  1. DirectX
    21.07.2019 17:57

    У меня к девайсу пока главные вопросы — это питание и теплоотвод. Играюсь с ним в свободное время и результаты пока такие: на ресурсоемких примерах он стабильно виснет минут через 5-10.

    Радиатор при этом достаточно горячий. Сначала грешил на питание, мол радиатор горячий, но возможно это рабочий режим и зависание из-за просадки по питанию. Взял качественный блок питания на 3+ Ампера и качественный micro USB кабель. Все аналогично. Взял в блок питания с бочонком 5В/4А. Аналогично. Поставил кулер, правда работающий на 5 вольтах 12 вольтовый, особо не улучшилась ситуация.

    Может Micro SD дефектный оказался, не знаю, но без нагрузки в целом все работает. У кого какой опыт есть по локализации таких проблем? Может что из логов может пролить свет на причины?


    1. DmitrySpb79 Автор
      21.07.2019 19:14

      Я бы как минимум, выводил в лог температуру процессора. Питание по USB можно посмотреть девайсом типа usb doctor, но если блок питания на 4А, то вряд ли дело в питании.

      Попробуйте на devtalk.nvidia.com/default/board/371/jetson-nano спросить, приложив код, который вешает Nano.

      Наконец, может плату и радиатор разобрать, термопастой какой-нибудь смазать.

      PS: А проблема точно не программная? Может утечка памяти/дескрипторов/еще чего-нибудь, вот оно минут через 10 и виснет? Стандартные бенчмарки какие-нибудь пробовали?


      1. DirectX
        21.07.2019 21:34
        +1

        Просто на чистой системе собирал github.com/dusty-nv/jetson-inference и запускал примеры. Запуск любого примера в итоге перегревает плату. Если без радиатора, то вообще без вариантов виснет.


    1. alex518
      21.07.2019 19:17

      Здесь пишут про некую перемычку J48, которой включают питание по DC на 5В/4А.


      1. DirectX
        21.07.2019 20:20
        +1

        Перемычку переключал для активации разъема, без нее бы не заработал.


    1. glebasterBajo
      22.07.2019 09:51

      Попробуйте Micro SD поменять всё же.
      Мы гоняли >7000 фотографий (720х480, 2.3 секунды на 1 фото) — ничего не зависало.


    1. green16
      22.07.2019 15:19

      Использовал в работе, тоже вис постоянно, грешил на питание, так как много usb устройств было подключено. В итоге при переходе на 5в/4а зависания исчезли, но и куллер в этот же момент поставил. Ставил кулер noctua. В целом плата очень горячая и чисто с радиатором использовать на полную не выйдет.


  1. cahbe
    22.07.2019 14:28
    -1

    Синтетика под линухой — верх ананизма. Банально погонять на этой машинке вин10 с мелкими казуалками было бы куда информативнее чем деление на ноль числа пи.