In der Welt der eingebetteten Systeme und Mikrocontroller wächst die Nachfrage nach intelligenten, ressourcenschonenden Lösungen stetig. Die Möglichkeit, komplexe Aufgaben wie die Pose-Schätzung eines Objekts – also die Bestimmung der Position und Orientierung – direkt auf einem kleinen Mikrocontroller zu erledigen, fasziniert Entwickler und Forscher gleichermaßen. Doch das Erstellen eines neuronalen Netzwerks für solche Mikrocontroller ist eine anspruchsvolle Aufgabe, die weit über das übliche Maß hinausgeht. Insbesondere wenn das Ziel darin besteht, ausschließlich mit Integer-Arithmetik zu arbeiten, um Rechenleistung und Speicher effizient zu nutzen, ergeben sich vielfältige Herausforderungen und kreative Lösungsansätze. Neuronale Netzwerke sind im Grunde genommen mathematische Modelle, die Beziehungen zwischen Eingabedaten und gewünschten Ausgaben modellieren.
Sie bestehen aus Schichten von Neuronen, die durch gewichtete Verbindungen verknüpft sind. Für eine Pose-Schätzung auf einem Mikrocontroller bedeutet das, dass sechs Sensordaten – beispielsweise Beschleunigung, Gyroskop oder Magnetometer – als Eingabe dienen. Diese werden im Netzwerk verarbeitet und als Ausgangswerte liefern sie die geschätzte dreidimensionale Position und Orientierung zurück. Die Komplexität entsteht unter anderem durch die nichtlinearen Zusammenhänge zwischen Sensorwerten und der tatsächlichen Pose. Eine explizite analytische Lösung ist daher oft unmöglich.
Stattdessen erfolgt die Modellierung über Trainingsdaten, die durch Simulationen oder Messungen generiert werden. Durch maschinelles Lernen wird das neuronale Netzwerk darauf trainiert, die inverse Funktion abzubilden – nämlich von den Sensorwerten zurück zur Pose. Der Einsatz von Mikrocontrollern wie dem Cortex-M0 mit sehr begrenztem RAM und Flash-Speicher setzt dabei enge Grenzen. Vor allem die fehlende Hardwareunterstützung für Fließkommazahlen führt dazu, dass herkömmliche neuronale Netze mit 32-Bit Gleitkommadarstellung nur schwer oder ineffizient auf solchen Geräten laufen. Eine etablierte Lösung ist die Quantisierung, bei der Fließkommazahlen durch kleinere Ganzzahldarstellungen wie 8-Bit-Integer ersetzt werden.
Dies spart Speicherplatz und Rechenzeit. Klassische Quantisierungsverfahren, häufig als „fake quantization“ bezeichnet, speichern Parameter zwar als kleine Ganzzahlen, wandeln sie aber zur Berechnung zwischendurch wieder in Fließkommazahlen um. Für Geräte ohne Floating-Point-Unit ist dies jedoch suboptimal, weil Software-Emulation von Fließkommaoperationen sehr Ressourcen intensiv und langsam ist. Hier entsteht der Wunsch nach einer sogenannten Integer-only-Quantisierung, bei der sämtliche Berechnungen ausschließlich mit Ganzzahlen erfolgen. Die Implementierung eines solchen quantisierten neuronalen Netzwerks ist nicht trivial.
Einerseits müssen die Gewichte und Biases in geeignete Integer-Formate umgerechnet werden. Während Gewichte meist als 8-Bit-Integer (i8) repräsentiert werden, benötigen Biases oft größere Formate wie 32-Bit-Integer (i32), da sie als Akkumulatoren für die Summe der Produkte dienen. Die Herausforderung liegt zudem im Aktivierungsmodus: Die neuronalen Schichten wenden nichtlineare Funktionen wie ReLU (Rectified Linear Unit) an, die ebenfalls effizient quantisiert werden müssen. Eine weitere Schwierigkeit ergibt sich beim sogenannten Aktivierungsskalieren. Nach der Matrixmultiplikation werden Zwischenergebnisse in einem größeren Wertebereich gehalten und müssen erneut auf den Ziel-Datentyp konvertiert werden.
Das Skalieren erfolgt meist über Multiplikationen mit Gleitkommafaktoren, die auf kleinen Mikrocontrollern Probleme verursachen. Um diese zu umgehen, kann man quantisierte Multiplikatoren in Form von dyadischen rationalen Zahlen nutzen, die als eine Multiplikation mit einem Faktor und ein Shift in der Bitdarstellung umgesetzt werden. Das ermöglicht vollständig ganzzahlige Berechnungen und vermeidet Fließkommaoperationen vollständig. Beim Training von neuronalen Netzwerken mit Integer-Arithmetik stellt sich ebenfalls die Frage, wie man die Parameter so anpasst, dass das Netzwerk trotz der begrenzten Genauigkeit gute Vorhersagen liefert. Zwei Ansätze sind weit verbreitet: Post-Training-Quantisierung und Quantisierungsbewusstes Training (Quantization-Aware Training).
Die erste Methode rundet nach dem eigentlichen Training die Gewichte und Parameter auf Integerwerte. Das ist einfach, führt aber oft zu Genauigkeitsverlusten. Quantisierungsbewusstes Training hingegen simuliert die Quantisierung bereits während des Trainings. So werden die Grenzen und Effekte der Ganzzahldarstellung direkt in das Optimierungsverfahren einbezogen. Dabei wird mit Trickmechanismen gearbeitet, wie beispielsweise dem sogenannten „Straight-Through Estimator“, der erlaubt, Gradienten auch durch quantisierte Funktionen zu propagieren.
Dieser Ansatz ist aufwendiger, bietet jedoch deutlich bessere Ergebnisse für quantisierte Modelle. Ein großes Problem bei der Nutzung großer Frameworks wie TensorFlow und TensorFlow Lite ist der immense Ressourcenbedarf gerade bei eingebetteten Systemen. Viele herkömmliche Algorithmen und Rahmenwerke sind auf leistungsfähige Hardware ausgelegt und beinhalten zahlreiche Zusatzfeatures, die auf Miniaturhardware nicht realisierbar sind. Auch der Platzbedarf der Laufzeitbibliotheken überschreitet oft die Speicherkapazitäten der eingesetzten Mikrocontroller. So kann schon das einfache Binden der TensorFlow Lite Micro Runtime den verfügbaren Flash-Speicher sprengen.
Für Entwickler, die mit beschränkten Ressourcen hantieren, ist daher eine schlanke, auf das Wesentliche reduzierte Lösung gefragt. Alternative Werkzeuge wie MicroFlow bieten eine Möglichkeit, TensorFlow Lite Modelle in Rust-Code umzuwandeln. MicroFlow liest das Modell und generiert Rust-Module, die direkt für die Inferenz genutzt werden können. Zwar ist das API aktuell noch fließkommazentriert und nutzt für Skalierungen Floating-Point-Operationen, aber die Idee eines kompakten, auf integerarithmetischen Operationen basierenden Netzwerks ist nah. Noch einen Schritt weiter geht der Ansatz, quantisierungsbewusstes Training selbst neu zu implementieren.
Offene Frameworks für automatische Differenzierung wie JAX bieten hier eine flexible Basis. JAX erlaubt eine individuelle Definition von Quantisierungsfunktionen mit selbst implementierten Gradienten. So wird eine Quantisierungsfunktion definiert, die während des Trainings von der automatischen Differenzierung ignoriert wird, um die harten Rundungsschritte zu simulieren, ohne das Lernen zu blockieren. Das Ergebnis ist ein handgeschriebenes, komplett verständliches Training, welches tief in die Kontrollmechanismen des Netzwerks eingreift und dadurch maximale Kontrolle über Genauigkeit, Speicherbedarf und Rechenleistung bietet. Zudem erlaubt es die Erstellung einer Modellgewichtsausgabe, die direkt in den Firmware-Code für den Mikrocontroller eingebaut wird, ohne auf Laufzeitbibliotheken angewiesen zu sein.
Neben dem Code stellen auch die mathematischen Grundlagen eine wichtige Grundlage dar. Ein Grundverständnis neuronaler Netzwerke, ihrer Gewichtungen, Aktivierungsfunktionen und der numerischen Repräsentation ist unabdingbar. Gerade beim Arbeiten mit Quantisierung ist ein tiefes Verständnis der Umsetzung von Rechenoperationen in Hardware essenziell. Fachartikel, spezialisierte Tutorials und Visualisierungstools helfen dabei, diese komplexen Konzepte zu erfassen und anzuwenden. Die Suche nach geeigneten Tools und Bibliotheken kann sich zu einer frustrierenden Odyssee entwickeln.
Viele etablierte Lösungen sind schwergewichtig, komplex und für andere Einsatzzwecke ausgelegt. Projekte wie CMSIS-NN, IREE, MicroTVM oder uTensor versprechen zwar viel, sind aber oft zu umfangreich oder nicht speziell auf kleine, einfache Dense-Netze zugeschnitten. Alternativprojekte wie TinyEngine wirken eher akademisch und fokussieren anspruchsvollere Modellarchitekturen. Daher lohnt es sich für Entwickler, die ein schlichtes, schnelles und leicht zu verstehendes neuronales Netzwerk für Mikrocontroller implementieren möchten, eigene Wege zu gehen und die Quantisierung direkt über maßgeschneiderte mathematische Methoden und selbst geschriebene Trainingsroutinen zu realisieren. Langfristig eröffnet die Entwicklung solcher niedlichen, das heißt kleiner, sparsamer und dennoch intelligenter neuronaler Netzwerke neue Möglichkeiten für IoT-Anwendungen, autonome Steuerungen und smarte Sensornetzwerke.
Die Komplexität der Modelle wird dabei bewusst gering gehalten, um sie auf kleinsten Geräten betreiben zu können. Solche Ansätze ermöglichen eine nahtlose Intelligenz am Rand („Edge AI“), ohne dass große Cloudressourcen benötigt werden. Die Kombination aus quantisierungsbewusstem Training, speziell angepasster Integer-Arithmetik und der Automatisierungsschicht moderner Differenzierungssysteme bildet eine kraftvolle Toolbox, mit der Entwickler innovative Lösungen schaffen können. Ein individuell abgestimmtes, statisch kompiliertes Netz im Rust-Ökosystem zeigt, wie sich moderne Programmierpraktiken mit eingebetteter Hardware verbinden lassen. Zusammenfassend lässt sich sagen, dass der Weg zum niedlichsten neuronalen Netzwerk – einem kompakten, effizienten und vollständig integerbasierten KI-Modell für Mikrocontroller – viele Herausforderungen birgt.
Doch mit einem tiefen Verständnis der Quantisierung, mathematischer Grundlagen und dem Willen zur Eigenentwicklung eröffnen sich spannende Chancen. Die Suche nach Minimalismus im KI-Bereich steht dabei im Fokus und unterstreicht die Bedeutung von maßgeschneiderter Software im Zeitalter smarter, vernetzter Geräte.