Oft kommt in Verbindung mit Machine Learning und Embedded das Thema der richtigen Hardware auf. In meiner Wahrnehmung wird gleich danach die Jetson-Familie erwähnt (Naja, ist halt ne selektive Wahrnehmung 😊). Der Kleine in der Familie ist der Jetson Nano. Den ich in dieser Serie verwende. Er hat als “Bastler” Hardware einen entscheiden Vorteil gegenüber beispielsweise dem RasPi; der Nano ist ausgestattet mit einer GPU von NVidia, weshalb sich damit gut ML-Projekte umsetzen lassen.
Das Ökosystem um den Nano herum ist gut – nicht zu viel von allem, aber auch nicht zu wenig. Es gibt SDKs, die Grundlagen für ML-Projekte schaffen und die Zugriffe auf GPU-Power geben, sogar eine eigene NVidia Cloud (NGC) steht zur Verfügung, die du übrigens auch mal ausprobieren solltest. Hardwaretechnisch gibt es für den Nano ebenfalls einiges zum Nachrüsten. Von Lüfter über WiFi-Card bis zu selbstgedruckten Gehäusen (das Gehäuse habe ich mir mal raus gelassen), gibt es eigentlich alles, was man so braucht. Auch die unzähligen Tutorials, die man entweder über die gut geführte NVidia-Seite bekommen kann, um den Einstieg in ML zu erhalten, oder zahlreiche Videos auf Youtube sind vorhanden.
Für ein grundlegendes Setup des Jetson Nano empfehle ich dir unbedingt, die “Getting Started” Seite beim Hersteller auf zu rufen. Dort ist sehr gut und detailliert beschrieben, wie du die Hardware zum atmen bringst. Damit du deinen Jetson Nano für IoT Edge und damit für das Post Auto Projekt eingerichtet bekommst, solltest du nun nachfolgendes beachten.
Erste Schritte
Jetson Power
Um intensiver mit der GPU arbeiten zu können, solltest du zu erst einmal die Power Einstellung (NVP Model) überprüfen. Dein Jetson Nano hat vier Modi, mit denen “angetrieben” werden kann. Per MicroUSB Kabel, per Netzteil, per PoE (Power over Ethernet) und auch noch per GPIO Steckverbindung. Generell würde ich es aber erstmal bei den zwei Varianten MicroUSB und Netzteil belassen.
Um das Maximum für deinen Jetson Nano heraus zu holen, solltest du ein Netzteil anschließen. Während bei der Versorgung mit Strom über USB nur 2A @ 5V zur Verfügung stehen, kannst du mit dem Netzteil (wenn du das Richtige dafür nutzt) 4A @ 5V einspeisen. Du solltest aber darauf achten vorher zu Jumpern. Setze dazu einen Jumper, wie unten im Bild mit “1” markiert, dann kannst du das Netzteil einstecken und los legen.
Nach dem Anschließen mit dem passenden Netzteil, solltest du auch noch prüfen, ob dein Nano auch im Maximal-Modus läuft. Dazu machst du ein SSH auf dein Gerät und tippst einmal folgendes in die Konsole ein:
$ sudo nvpmodel -q
NV Power Mode: MAXN
Wenn dein Output etwa so, wie hier aussieht, dann brauchst du dich nicht weiter kümmern.
Ansonsten (statt MAXN steht dort vielleicht 5 W) tippe noch das nachfolgende ein; damit schaltest du die volle Power frei:
$ sudo nvpmodel -m 0
NV Power Mode: MAXN
Im Mode 0 (MAXN) werden alle vier CPUs betrieben, wohingegen im Mode 1 (5W Betrieb) zwei CPUs ausgeschaltet sind.
An dieser Stelle rate ich dir, bau dir noch nen Ein/Aus Schalter. Ist praktisch! Andernfalls musst du immer per ssh
drauf und sudo reboot
eintippen. Einfach das Netzteil abziehen solltest du nicht. Darunter kann die Hardware leiden. Zumindest kann das OS oder die SDCard was abbekommen (habe ich erlebt!!).
Zusätzlich solltest du noch einen Lüfter mit dranhängen. Der Jetson Nano kann sehr heiß werden (60/70°C und locker mehr). Dafür kannst du Einen direkt vom Zubhörhandel kaufen, oder, falls du noch massig Lüfter von alten Computern rumliegen hast, einen solchen zu nutzen. Nun sollte die Hardware für das IoT Edge Setup bereit sein.
Setup IoT Edge
Installieren von IoT Edge ist relativ simpel, wenn du den Guide dazu von Microsoft durch gehst.
Als Randnotiz: IoT Edge ist für Geräte mit ARM64 Architektur noch nicht GA (generally available / preview Mein Stand: 1.0.9-rc5). D.h. du kannst mit dem einen oder anderen Problem rechnen – letztlich sind diese aber gering, da der Entwicklungsstand schon sehr fortgeschritten ist.
Bevor aber das Installieren los geht, solltest du vorher prüfen, ob die auf dem Jetson Nano vorhandene Container Runtime kompatibel ist. Das wirkt sich so aus, dass die eigentliche Installation bei der Moby-Engine fehlschlägt oder nur Warnungen wirft – nachher aber nicht funktionieren will. Ich habe damit Probleme gehabt, so dass ich Docker CE komplett deinstallieren musste. Vermutlich lag es aber an meiner JetPack Version. Wenn du der IoT Edge-Installation von Microsoft folgst, wirst du die Moby-based Engine installieren – dann ist alles wieder gut. Um auf Nummer sicher zu gehen, vergleiche die JetPack Versionsnummer mit der auf der Homepage und mache ggf. ein Update.
Für eine vollständige Einrichtung musst du mehrere Schritte erledigt haben.
1) Du hast einen IoT Hub erstellt und darin eine Device Identity eingerichtet.
2) Du hast den IoT Edge auf dem Jetson Nano installiert und diesem die Device Identity der im IoT Hub erstellten zugewiesen.
Damit sind nun beide Komponenten miteinander verbunden. Die Details zum Einrichten findest du in der vorher erwähnten Microsoft Doku (muss ja nicht noch einen Beitrag geben, in dem wiederholt wird, was wo anders besser geschrieben ist 🙂 ).
Sobald du IoT Edge installiert hast, möchte ich dir hier noch ein paar Tipps mit geben, die dir Analyse- und Monitoringarbeiten erleichtern können.
Um das “Arbeiten” von IoT Edge zu beobachten – und damit auch stets zu kontrollieren, dass Images aktualisiert, sowie Module ordentlich gestartet oder gestoppt werden, ist dieses Kommando sehr hilfreich.
journalctl -f -u iotedge | grep -v mgmt
Es zeigt alle letzten Log-Einträge kontinuierlich an. Der Parameter -f
sorgt für das Warten auf neue Einträge. Mit -u
begrenzt du die Logausgabe auf alles, was mit IoT Edge zutun hat. Das nachfolgende grep Kommando hilft dir, auch die nervigen Management Einträge weg zu filtern.
Da du vermutlich während deiner Tests IoT Edge mal starten und stoppen musst. Solltest du vielleicht über Shortcuts wie Aliase nachdenken. Ich habe mir ein Stop-IoT und Start-IoT angelegt.
alias start-iot="sudo service iotedge start"
alias stop-iot="sudo service iotedge stop"
Diese Zeilen kannst du auch in deiner .bashrc
oder was auch immer du benutzt hinterlegen, damit du sie permanent hast.
Falls du Probleme mit den Docker Containern bekommen solltest, kannst du mit nachfolgenden Aliasen dein System schnell von Diesen befreien
alias rmi-yolo="sudo docker images --format='{{.Repository}} {{.ID}}' | grep 'yolo' | \
cut -d' ' -f2 | sudo xargs docker rmi"
alias rmi-postcar="sudo docker images --format='{{.Repository}} {{.ID}}' | \
grep 'postcar' | cut -d' ' -f2 | sudo xargs docker rmi"
Der erste Alias löscht die Yolo*-Images, der zweite alle postcar*-Images vom System (das kannst du natürlich weiter ausbauen). Wenn du also stop-iot && rmi-yolo && rmi-postcar && start-iot
als Kommandos absetzt, stoppst du IoT Edge, entfernst die Images und startest neu. Daraufhin wird die IoT Edge Runtime die fehlenden Images noch einmal pullen. Mit dem Journal Kommando oben, kannst du das Ganze parallel in einem zweiten Terminal beobachten.
Damit hast du nun alles, was du zum Starten mit IoT Edge auf dem Nano brauchst. Wenn dir dieser Beitrag gefallen hat, dann gib auch gern einen Kommentar ab oder schreib mir ne Mail. Ich freue mich über Feedback.