Hey! Sie scheinen aus United Kingdom zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Der NVIDIA Jetson Nano im praktischen Einsatz

Main44_89e0ef83789db8a4304a8751595fe67f48c4af94.jpg

Das kompakte, kostengünstige Modul liefert CUDA-Rechenpower für KI-Projekte und mehr. 

Künstliche Intelligenz (KI) bietet ein immenses Potenzial für den Einsatz in einer nahezu endlosen Liste von Anwendungen, die von selbstfahrenden Autos bis zur Analyse medizinischer Bilder reicht. In der Regel ist jedoch sehr viel mehr Rechenleistung erforderlich – und zwar um Größenordnungen – als beispielsweise bei einem herkömmlichen Computer-Vision-Algorithmus. Dies bringt zwar viele Vorteile mit sich, schränkt aber den Einsatz von KI aufgrund von Leistungs-, Kosten- und Größenbeschränkungen tendenziell ein.

In den letzten Jahren hat sich das geändert, und mit der Entwicklung spezieller Hardwarebeschleunigung und der Anwendung leistungsstarker GPU-Technologie wurden bedeutende Fortschritte erzielt. Letztere wird mit der NVIDIA Jetson-Produktfamilie in den Embedded-Bereich integriert, wobei der Nano die kompakteste und günstigste Lösung darstellt. Dank der CUDA-Plattform, deren Einsatzmöglichkeiten keineswegs auf Grafik- und KI-Anwendungen beschränkt sind.

CUDA 101embedded-jetson-sw-stack-diagram_e8c416ee46451e6868c1192a12376dd9b6938464.jpgDer Jetson Software Stack

Laut Wikipedia ist CUDA (Compute Unified Device Architecture) eine von NVIDIA entwickelte Plattform für parallele Berechnungen und ein API-Modell (Application Programming Interface). Sie ermöglicht die Verwendung einer GPU (Graphics Processing Unit) für allgemeine Anwendungen, auch GPGPU genannt. Dies ist deshalb interessant, weil ein moderner Grafikprozessor hinsichtlich seiner Leistung vor nicht allzu langer Zeit noch als Supercomputer angesehen worden wäre.

Allerdings ist es bei Supercomputern so, dass man selten, wenn überhaupt, einfach seinen Code neu kompiliert und dann plötzlich das volle Potenzial der Maschine ausschöpft. Das Gleiche gilt für eine GPU, die ihre blitzschnelle Leistung über hochspezialisierte Recheneinheiten erzielt, auf denen man nicht einfach ein Betriebssystem starten und dann alle vorhandenen Anwendungen ausführen kann.

Hier kommt CUDA ins Spiel, das eine Reihe von beschleunigten Bibliotheken bereitstellt, welche die Leistung eines NVIDIA-Grafikprozessors nutzen können, zusätzlich zur Erweiterung von C/C++ und der Bereitstellung einer FORTRAN-Implementierung, die im HPC-Bereich (High Performance Computing) nach wie vor beliebt ist. Darüber hinaus gibt es Wrapper für zahlreiche andere Programmiersprachen sowie ein ständig erweitertes Ökosystem von domänenspezifischen Frameworks und Anwendungen.

HardwaredeveloperKit_d36b8eff7a28e679d7c33ec4b462f478d0461bfa.jpg

Die Jetson-Familie gibt es seit einiger Zeit und mit der TK1 Platine, die vor fast 6 Jahren auf den Markt kam, hat NVIDIA das Potenzial für GPGPU in Embedded-Anwendungen längst erkannt. Der Nano wurde im März 2019 vorgestellt und brachte CUDA-Leistung zu einem deutlich niedrigeren Preis als zuvor und in einem viel kleineren Formfaktor, wodurch die Technologie für viel mehr Märkte und Anwendungen nutzbar wurde.

Welche Leistungsmerkmale bietet der Jetson Nano also genau?

  • NVIDIA Maxwell Architektur mit128 NVIDIA CUDA® cores 0.5 TFLOPs (FP16)
  • Quad-core ARM® Cortex®-A57 MPCore processor
  • 4 GB 64-bit LPDDR4
  • 16 GB eMMC 5.1 Flash
  • Videokodierung (250MP/sec) und decode (500MP/sec)
  • Kamera interface: 12 lanes (3x4 or 4x2) MIPI CSI-2 DPHY 1.1 (18 Gbps)
  • HDMI 2.0 or DP1.2 | eDP 1.4 | DSI (1 x2) 2 simultan
  • 1 x1/2/4 PCIE, 1x USB 3.0, 3x USB 2.0
  • 1x SDIO / 2x SPI / 4x I2C / 2x I2S / GPIOs -> I2C, I2S
  • 10/100/1000 BASE-T Ethernet

Und das alles in einem 69,6 x 45 mm großen Modul mit SO-DIMM-Formfaktor.

Wie nicht anders zu erwarten, ist auch ein Entwicklerkit (199-9831) erhältlich, bei dem das Modul zusammen mit einer Trägerplatine mit USB-, HDMI-, Kamera- usw. Anschlüssen geliefert wird. Es verfügt sogar über einen M.2-Steckplatz, d. h. es besteht die Möglichkeit, neben einem Micro-SD-Kartensteckplatz und dem integrierten 16-GB-Flash-Speicher des Jetson-Moduls auch eine SSD mit hoher Kapazität und Leistung unterzubringen.

Über eine 40-polige Anschlussleiste, die der des Raspberry Pi ähnelt, stehen zahlreiche GPIOs zur Verfügung, die über eine Bibliothek unterstützt werden, die dieselbe API hat wie die beliebte RPi.GPIO-Bibliothek. Daher sollte die Portierung von Anwendungen, die dies zur Integration einfacher Ein- und Ausgaben nutzen, problemlos möglich sein. Darüber hinaus ist das Developer Kit mit der Raspberry Pi-Kamera (913-2664) kompatibel.

Kurz gesagt, selbst wenn Sie die GPU nicht nutzen, ist der Jetson Nano hinsichtlich seiner Basisperformance und der integrierten E/A immer noch ein ziemlich attraktives Gerät.

Einrichtung

NVIDIA hat einen getting started guide in dem ein 5V 2A Micro USB Netzteil empfohlen wird. Es wird darauf hingewiesen, dass ein anderes als ein qualitativ hochwertiges Netzteil möglicherweise nicht den erforderlichen Strom liefert. Alternativ kann das Entwicklungskit auch über einen Gleichstrom-Hohlstecker (5,5/2,1mm) mit Strom versorgt werden. In diesem Fall wird ein 4-A-Netzteil empfohlen.

Das offizielle Raspberry Pi-Netzteil (187-3416) mit 3 A sollte gut geeignet sein, wenn die Stromversorgung über Mikro-USB erfolgt. Bei Verwendung des Hohlsteckers sollte ein 5 V 4 A RS PRO Desktop-Netzteil (175-3274) auch genügend Reservekapazität für die angeschlossenen Peripheriegeräte bieten. Beachten Sie, dass bei Verwendung des Hohlsteckers eine Brücke über J48 gelegt werden muss.

annotatedBoard_accfcb1737496c607efddbb638547581d365dc6c.jpg

Der Leitfaden bietet einen Download-Link für ein Micro-SD-Karten-Image und eine Anleitung zum Extrahieren und Kopieren des Images. Nach dem Herunterladen wurde die Datei entpackt und dann auf einen Linux-PC kopiert mit em Befehl:

$ sudo dd if=sd-blob-b01.img of=/dev/mmcblk0 bs=4M status=progress conv=fdatasync

Wie immer ist bei der Verwendung des dd-Befehls Vorsicht geboten, da das Argument of= bei anderen Computern möglicherweise anders lautet. Mit dem Argument conv=fdatasync möchten wir die Puffer vor dem Beenden per Flush-Befehl leeren (sync), so dass wir nach Beendigung des dd-Befehls nicht mehr sudo sync eingeben müssen.

Nach dem Einsetzen der Micro-SD-Karte und dem Anschließen des Netzteils sollten eine Tastatur, ein Monitor und eine Maus angeschlossen werden. Allerdings ist zu beachten, dass DVI-Monitore und ein Adapterkabel nicht funktionieren. Stattdessen muss ein Monitor mit einer geeigneten HDMI- oder DisplayPort-Schnittstelle verwendet werden. Wenn wir eine der Live-Kameraerkennungs-Demos durchführen wollen, muss natürlich auch eine Kamera angeschlossen sein, z. B. die Raspberry Pi-Kamera v2 (913-2664) .

Beim ersten Start wird ein Einrichtungsprozess initiiert und die Tastatursprache, Zeitzone usw. konfiguriert. Dabei wird unter anderem ein erstes Benutzerkonto erstellt. Wenn dieser Vorgang nicht erfolgreich abgeschlossen wird, werden Sie beim nächsten Start dazu aufgefordert, die Einrichtung über eine Terminalsitzung an der UART-Anschlussleiste abzuschließen. Es ist daher wichtig, beim ersten Start sicherzustellen, dass ein kompatibler Monitor sowie eine USB-Tastatur und -Maus angeschlossen sind.

Nach der Ersteinrichtung wird der vertraute Ubuntu-Desktop angezeigt und der Jetson Nano kann wie jeder andere kleine Computer verwendet werden. Als nächster Schritt bietet es sich an, ein Terminal zu öffnen und die gesamte installierte Software mit auf die neuesten Versionen zu aktualisieren:

 

$ sudo apt update

$ sudo apt dist-upgrade

Ein SSH-Server wird standardmäßig installiert und gestartet, so dass es auch möglich ist, sich über das Netzwerk zu verbinden, um solche Vorgänge auszuführen.

JetPackJetpack_78d721f8c961e4fda89bb7dfc39d72f35a055ed4.jpg

NVIDIA JetPack SDK umfasst Betriebssystem-Images, Bibliotheken, APIs, Beispiele, Entwicklertools und Dokumentation. In Kombination mit einem entsprechend konfigurierten Linux-Kernel und NVIDIA-Treibern ist das Ubuntu-basierte Betriebssystem-Image, das wir bereits beschrieben haben, bereits mit JetPack bestückt und bietet die folgenden Bibliotheken und Beispiele:

Dadurch ersparen wir uns die Mühe, diese selbst zu installieren, und können wesentlich schneller mit der Arbeit beginnen.

Demosbuild_7f87a2cf6e5a263dbee95163f2bce1a4456b9579.jpg

Es werden nicht nur Beispiele bereitgestellt, sondern auch ein Online-Training zum Selbststudium sowie eine ständig erweiterte Sammlung von Projekten von NVIDIA und der Community. Dazu gehört auch „Two Days to a Demo“, eine Reihe von Deep-Learning-Tutorials für den Einsatz von KI und Computer Vision in der Praxis mit NVIDIA Jetson AGX Xavier, Jetson TX2, Jetson TX1 und Jetson Nano – die, wie der Name schon sagt, von Anfang bis Ende etwa zwei Tage in Anspruch nimmt. Dazu gehört auch „Hello AI World“, eine Sammlung von Demos zu Deep- Learning-Interferenz.

Um die Demos einzurichten, müssen wir die folgenden Befehle ausführen:

$ sudo apt update

$ sudo apt install git cmake libpython3-dev python3-numpy

$ git clone --recursive https://github.com/dusty-nv/jetson-inference

$ cd jetson-inference

$ mkdir build

$ cd build

$ cmake ../

$ make

$ sudo make install

$ sudo ldconfig

Hierbei werden wir aufgefordert, auszuwählen, welche vortrainierten neuronalen Netze wir herunterladen möchten.

modelDownload_7a33955e241e568ad1e64b9456c7bbec2c1cd688.jpg

Wir werden auch aufgefordert, PyTorch zu installieren, was erforderlich ist, wenn wir eine Demo mit Transfer Learning durchführen wollen, bei der ein bereits trainiertes Modell als Ausgangspunkt für ein Modell für eine andere Aufgabe verwendet wird. Weitere Modelle und PyTorch können bei Bedarf später installiert werden. Details dazu finden Sie in der Dokumentation im GitHub Repo.

Kommen wir nun endlich dazu, die Demo zu starten!

Hello AI World ist grob in die folgenden Kategorien unterteilt:

  • Classifying images with ImageNet
  • Locating objects with DetectNet
  • Semantic Segmentation with SegNet
  • Transfer Learning with PyTorch

Der erste Bereich ist die Bilderkennung, bei der es darum geht, Szenen und Objekte zu identifizieren. Im zweiten Schritt gehen wir noch weiter und lokalisieren Objekte innerhalb des Frames. Bei der semantischen Segmentierung geht es um die Klassifizierung auf Pixelebene, was insbesondere für die Wahrnehmung von Umgebungen nützlich ist, wie sie beispielsweise bei einem selbstfahrenden Auto verwendet werden könnte. Das Konzept des Transfer Learning haben wir zuvor bereits angerissen.kurz erwähnt.

Schauen wir uns eine Demo zur ersten Kategorie an, der Klassifizierung von Bildern. Es besteht aus zwei Teilen: einem Konsolenprogramm, das mit Standbildern gefüttert wird, und einem weiteren, das einen Live-Videostream als Input erhält. Wir verwenden Letzteres und setzen eine Pi-Kamera für Videos ein.

Um dies mit den Standardoptionen auszuführen, geben wir einfach Folgendes in den Terminal ein:

$ imagenet-camera

Nach einer kurzen Verzögerung sollte dann ein Videofenster erscheinen, in dem am oberen Bildrand ein Text mit dem klassifizierten Objekt/Szene und einer Konfidenzzahl angezeigt wird.

Standardmäßig wird das neuronale Faltungsnetz GoogleNet verwendet, das mit dem ImageNet-Datensatz trainiert wurde, der 1.000 Objektklassen enthält. Wie man sehen kann, springt die Ausgabe umher, wenn die Szene vielleicht unklar ist und es sich nicht um etwas handelt, für das es trainiert wurde, es zu erkennen, mit vielen Klassifizierungen mit geringem Konfidenzniveau. Sobald jedoch ein Objekt, auf dessen Erkennung er trainiert wurde, in der Szene im Vordergrund steht, gelingt die Erkennung des Objekts sehr gut.

Gut zu wissen: Mit dem Argument „--network“ können auch andere Netze angegeben werden, z. B. AlexNet, ResNet-152 und Inception-v4, die alle als vortrainierte Modelle bereitgestellt werden. Darüber hinaus können diese – von Grund auf oder durch Transfer Learning – mit benutzerdefinierten Datensätzen trainiert werden, die für eine bestimmte Anwendung viel besser geeignet sind. Dies könnte zum Beispiel ein Netz sein, das trainiert wurde, um die Qualitätskontrolle in einer Fabrikumgebung als bestanden oder nicht bestanden zu klassifizieren, oder eine potenziell gefährliche Situation am Arbeitsplatz.

Entscheidend ist hier, wie schnell das neuronale Netz Schlussfolgerungen zieht, wobei der Spitzenwert bei über 70 Bildern pro Sekunde (FPS) liegt, was ziemlich schnell ist. Natürlich variiert die Leistung je nach Netz, aber das ist dennoch beeindruckend.

Apropos Leistung: Es steht ein TegraStats-Dienstprogramm zur Verfügung, das Informationen über die CPU-Auslastung, die Temperatur usw. liefert. Dies kann mit folgendem Befehl ausgeführt werden:

$ tegrastats

tegrastats_9384f978cd9dc692aea711907c72ecbab668bfc3.jpg

Auf dem obigen Screenshot sieht man, dass sich die CPU anfangs im Leerlauf befindet und dann etwa auf halber Strecke die Anwendung „Imagenet-Kamera“ gestartet wird, woraufhin die CPU-Auslastung sprunghaft ansteigt, da das Netz geladen wird und der Videostream beginnt.

Abschließende Worte

Im Jetson Nano ist eine Menge in einem kleinen Formfaktor untergebracht, und er bietet KI und andere Funktionen für Embedded-Anwendungen, die zuvor vielleicht nicht praktikabel gewesen wären. Wir haben hier nur an der Oberfläche gekratzt und eine der offensichtlicheren Demos zur Inferenz neuronaler Netze ausgeführt, aber es gibt noch viele weitere Beispiele und Lernressourcen, die von NVIDIA und der breiteren Community bereitgestellt werden.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin