Mikrocontroller haben nur begrenzten RAM und Speicherplatz, was die Größe von Modellen für maschinelles Lernen einschränkt. Außerdem unterstützt LiteRT für Mikrocontroller derzeit nur eine begrenzte Anzahl von Operationen, sodass nicht alle Modellarchitekturen möglich sind.
In diesem Dokument wird beschrieben, wie Sie ein TensorFlow-Modell für die Ausführung auf Mikrocontrollern konvertieren. Außerdem werden die unterstützten Vorgänge beschrieben und einige Hinweise zum Entwerfen und Trainieren eines Modells gegeben, das in den begrenzten Speicher passt.
Ein ausführbares End-to-End-Beispiel zum Erstellen und Konvertieren eines Modells finden Sie im Beispiel Hello World.
Modellkonvertierung
Wenn Sie ein trainiertes TensorFlow-Modell für die Ausführung auf Mikrocontrollern konvertieren möchten, sollten Sie die LiteRT-Konverter-Python-API verwenden. Dadurch wird das Modell in ein FlatBuffer konvertiert, wodurch die Modellgröße reduziert und das Modell so geändert wird, dass LiteRT-Vorgänge verwendet werden.
Um die kleinstmögliche Modellgröße zu erreichen, sollten Sie die Quantisierung des Trainings nach dem Training verwenden.
In ein C-Array konvertieren
Viele Mikrocontrollerplattformen unterstützen kein natives Dateisystem. Die einfachste Methode, ein Modell in Ihrem Programm zu verwenden, besteht darin, es als C-Array einzufügen und in Ihr Programm zu kompilieren.
Mit dem folgenden Unix-Befehl wird eine C-Quelldatei generiert, die das LiteRT-Modell als char-Array enthält:
xxd -i converted_model.tflite > model_data.cc
Die Ausgabe sollte in etwa so aussehen:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
Nachdem Sie die Datei generiert haben, können Sie sie in Ihr Programm einfügen. Es ist wichtig, die Array-Deklaration in const zu ändern, um die Speichereffizienz auf eingebetteten Plattformen zu verbessern.
Ein Beispiel dafür, wie Sie ein Modell in Ihr Programm einbinden und verwenden, finden Sie im Beispiel Hello World unter hello_world_test.cc.
Modellarchitektur und ‑training
Beim Entwerfen eines Modells für die Verwendung auf Mikrocontrollern ist es wichtig, die Modellgröße, die Arbeitslast und die verwendeten Vorgänge zu berücksichtigen.
Modellgröße
Ein Modell muss klein genug sein, um sowohl als Binärdatei als auch zur Laufzeit in den Arbeitsspeicher des Zielgeräts zu passen, zusammen mit dem Rest Ihres Programms.
Um ein kleineres Modell zu erstellen, können Sie weniger und kleinere Ebenen in Ihrer Architektur verwenden. Bei kleinen Modellen besteht jedoch ein höheres Risiko für Underfitting. Das bedeutet, dass es bei vielen Problemen sinnvoll ist, das größte Modell zu verwenden, das in den Arbeitsspeicher passt. Die Verwendung größerer Modelle führt jedoch auch zu einer höheren Prozessorlast.
Arbeitslast
Die Größe und Komplexität des Modells wirken sich auf die Arbeitslast aus. Große, komplexe Modelle können zu einem höheren Arbeitszyklus führen. Das bedeutet, dass der Prozessor Ihres Geräts mehr Zeit mit der Verarbeitung und weniger Zeit im Leerlauf verbringt. Dadurch steigen der Stromverbrauch und die Wärmeabgabe, was je nach Anwendung ein Problem darstellen kann.
Unterstützung bei der Bedienung
LiteRT für Mikrocontroller unterstützt derzeit nur eine begrenzte Teilmenge von TensorFlow-Operationen, was sich auf die Modellarchitekturen auswirkt, die ausgeführt werden können. Wir arbeiten daran, die Unterstützung für Operationen zu erweitern, sowohl in Bezug auf Referenzimplementierungen als auch auf Optimierungen für bestimmte Architekturen.
Die unterstützten Vorgänge sind in der Datei micro_mutable_ops_resolver.h aufgeführt.