Reduzierte Operator-Konfigurationsdatei
Die reduzierte Operator-Konfigurationsdatei ist eine Eingabe für das ONNX Runtime Build-from-Source-Skript. Sie gibt an, welche Operatoren in der Laufzeitumgebung enthalten sind. Ein reduzierter Satz von Operatoren in ONNX Runtime ermöglicht eine kleinere Build-Binärgröße. Eine kleinere Laufzeitumgebung wird in eingeschränkten Umgebungen, wie z.B. bei mobilen und Web-Deployments, verwendet.
Dieser Artikel zeigt Ihnen, wie Sie die reduzierte Operator-Konfigurationsdatei mit dem Skript create_reduced_build_config.py generieren. Sie können die reduzierte Operator-Konfigurationsdatei auch durch Konvertierung von ONNX-Modellen in ORT-Format generieren.
Inhalt
Das Skript create_reduced_build_config.py
Um eine reduzierte Operator-Konfigurationsdatei zu erstellen, führen Sie das Skript create_reduced_build_config.py auf Ihren Modellen aus.
Die Kernel-Konfigurationsdatei kann bei Bedarf manuell bearbeitet werden. Die Konfiguration kann entweder aus ONNX- oder ORT-Formatmodellen erstellt werden.
create_reduced_build_config.py --help
usage: Script to create a reduced build config file from ONNX or ORT format model/s. [-h] [-f {ONNX,ORT}] [-t] model_path_or_dir config_path
positional arguments:
model_path_or_dir Path to a single model, or a directory that will be recursively searched for models to process.
config_path Path to write configuration file to.
optional arguments:
-h, --help show this help message and exit
-f {ONNX,ORT}, --format {ONNX,ORT}
Format of model/s to process. (default: ONNX)
-t, --enable_type_reduction
Enable tracking of the specific types that individual operators require. Operator implementations MAY support limiting the type support included
in the build to these types. Only possible with ORT format models. (default: False)
Format der Konfigurationsdatei
Das grundlegende Format der Operator-Reduktions-Konfigurationsdatei ist <Operator-Domäne>;<Opset für Domäne>;<op1>[,op2]...
z. B.
#domain;opset;op1,op2...
ai.onnx;12;Add,Cast,Concat,Squeeze
Das Opset kann entweder mit dem Opset-Import für jedes Modell oder dem anfänglichen ONNX-Opset übereinstimmen, in dem die Operator-Version erstmals verfügbar war. Wenn Sie die Konfigurationsdatei manuell bearbeiten, ist die Verwendung des Opset-Importwerts aus dem Modell am einfachsten.
z. B. wenn ein Modell Opset 12 von ONNX importiert, können alle ONNX-Operatoren in diesem Modell unter Opset 12 für die Domäne 'ai.onnx' aufgeführt werden.
Netron kann verwendet werden, um die Eigenschaften eines ONNX-Modells anzuzeigen und die Opset-Importe zu ermitteln. Zusätzlich listen die ONNX-Operator-Spezifikationen für DNN- und traditionelle ML-Operatoren die einzelnen Operatorversionen auf.
Format der Typreduzierung
Typinformationen pro Operator
Wenn die Typen, die eine Operatorimplementierung unterstützt, auf einen bestimmten Satz von Typen beschränkt werden können, wird dies in einem JSON-String unmittelbar nach dem Operatornamen in der Konfigurationsdatei angegeben.
Es wird dringend empfohlen, zuerst die Konfigurationsdatei mithilfe von ORT-Formatmodellen mit aktivierter Typreduzierung zu generieren, um zu sehen, welche Operatoren die Typreduzierung unterstützen und wie der Eintrag für die einzelnen Operatoren definiert ist.
Die erforderlichen Typen werden im Allgemeinen pro Eingabe und/oder Ausgabe des Operators aufgeführt. Die Typinformationen befinden sich in einer Map mit den Schlüsseln 'inputs' und 'outputs'. Der Wert für 'inputs' oder 'outputs' ist eine Map zwischen der Indexnummer der Eingabe/Ausgabe und der erforderlichen Liste von Typen.
Beispielsweise sind sowohl die Eingabe- als auch die Ausgabetypen für ai.onnx:Cast relevant. Typinformationen für Eingabe 0 und Ausgabe 0 könnten wie folgt aussehen
{"inputs": {"0": ["float", "int32_t"]}, "outputs": {"0": ["float", "int64_t"]}}
was direkt nach dem Operatornamen in der Konfigurationsdatei hinzugefügt wird. Z.B.
ai.onnx;12;Add,Cast{"inputs": {"0": ["float", "int32_t"]}, "outputs": {"0": ["float", "int64_t"]}},Concat,Squeeze
Wenn beispielsweise die Typen der Eingaben 0 und 1 wichtig wären, könnte der Eintrag wie folgt aussehen (z.B. ai.onnx:Gather)
{"inputs": {"0": ["float", "int32_t"], "1": ["int32_t"]}}
Schließlich führen einige Operatoren nicht standardmäßige Dinge aus und speichern ihre Typinformationen unter einem 'custom'-Schlüssel. ai.onnx.OneHot ist ein Beispiel dafür, bei dem die drei Eingabetypen zu einem Tripel kombiniert werden.
{"custom": [["float", "int64_t", "int64_t"], ["int64_t", "std::string", "int64_t"]]}
Aus diesen Gründen ist es am besten, zuerst die Konfigurationsdatei zu generieren und bei Bedarf alle Einträge manuell zu bearbeiten.
Global zulässige Typen
Es ist auch möglich, die von allen Operatoren unterstützten Typen auf einen bestimmten Satz von Typen zu beschränken. Diese werden als *global zulässige Typen* bezeichnet. Sie können in der Konfigurationsdatei auf einer separaten Zeile angegeben werden.
Das Format zur Angabe global zulässiger Typen für alle Operatoren ist
!globally_allowed_types;T0,T1,...
Ti sollte ein C++-Skalar-Typ sein, der von ONNX und ORT unterstützt wird. Höchstens eine Angabe global zulässiger Typen ist zulässig.
Die Angabe von Typinformationen pro Operator und die Angabe von global zulässigen Typen sind gegenseitig ausschließend – die Angabe beider ist ein Fehler.