Best Practices für die Implementierung von NNAPI-Treibern

Auf dieser Seite werden Best Practices für die Implementierung von NNAPI-Treibern (Neural Networks API) beschrieben, um eine breite Einführung der NNAPI durch Anwendungsentwickler zu ermöglichen.

Kurze Startzeiten

Wenn Ihr Treiber die Gewichte eines Modells bei der ersten Verwendung transformiert, muss er das Kompilierungs-Caching unterstützen. Dadurch wird die Zeit für die Kompilierung beim Starten einer App reduziert. Das ist wichtig, da Apps die Hardwarebeschleunigung möglicherweise vermeiden, wenn die Startzeiten zu lang sind. Einige Anwendungen haben beispielsweise eine Gewichtung von über 100 MB und die Transformation dieser bei jedem Start ist Verschwendung.

Minimale Latenz reduzieren

Damit Modelle die Hardwarebeschleunigung nutzen, ist es wichtig, die minimale Latenz in den Treibern zu reduzieren. Viele Apps verwenden kleine Modelle, die mehrmals ausgeführt werden. Wenn die minimale Latenz für die Ausführung einer Arbeitslast zu hoch ist, z. B. einige Millisekunden, führen die Modelle die Arbeitslast möglicherweise auf der CPU aus, was nur ein bis zwei Millisekunden dauert, anstatt die Hardwarebeschleunigung zu verwenden. Achten Sie auf eine kostenintensive Threadsynchronisierung.

NN HAL SchedTune-Gruppe verwenden

Ab Android 11 oder höher enthält AOSP eine spezielle NN HAL-Gruppe SchedTune, die es Interprozess-NN HAL-Prozessen ermöglicht, Big-Cores zu verwenden, ähnlich wie bei der Implementierung desselben Prozesses innerhalb der vordefinierten top-app cgroup. Durch die Verwendung dieser SchedTune-Gruppe wird der Treiberoverhead reduziert, insbesondere bei kleinen Modellen.

Wenn Sie die SchedTune-Gruppe verwenden möchten, fügen Sie der init.rc-Datei des NN HAL-Prozesses die folgende Zeile hinzu:

writepid /dev/stune/nnapi-hal/tasks