
Englisch | 简体中文
Um ein ONNX -Modell zu bearbeiten, besteht eine gemeinsame Möglichkeit darin, das Modelldiagramm zu visualisieren und es mithilfe der ONNX -Python -API zu bearbeiten. Das funktioniert gut. Wir müssen jedoch codieren, um zu bearbeiten, und dann visualisieren, um zu überprüfen. Die beiden Prozesse können viele Male wiederholen, was zeitaufwändig ist.
Was ist, wenn wir ein Tool haben, das es uns ermöglicht, den Bearbeitungseffekt in einer vollständigen visualisierenden Weise zu bearbeiten und voranzutreiben ?
Dann kommt onnx-modifier . Damit können wir uns darauf konzentrieren, das Modelldiagramm im Visualisierungspannel zu bearbeiten. Alle Bearbeitungsinformationen werden von Python Onnx API endlich automatisch zusammengefasst und verarbeitet. Dann kann unsere Zeit gespeichert werden!
onnx-modifier basiert auf dem beliebten Netzwerk-Viewer Netron und dem Lightweight Web Application Framework Flask.
Derzeit werden die folgenden Bearbeitungsvorgänge unterstützt:
✅ Knoten löschen
✅ Neue Knoten hinzufügen
✅ Benennen Sie die Knoteneingänge und -ausgänge um
✅ Benennen Sie die Modelleingänge und Ausgänge um
✅ Neue Modellausgaben hinzufügen
✅ Fügen Sie neue Modelleingaben hinzu
✅ Modelleingabeform bearbeiten
✅ Attribut von Knoten bearbeiten
✅ Modellinitialisierer bearbeiten
Hier ist das Update -Protokoll- und Todo -Liste. Hier ist der Entwurfsüberblick, der für jemanden hilfreich sein kann, der zu diesem Projekt beitragen möchte.
Hoffe es hilft!
Wir haben jetzt drei Methoden, um onnx-modifier zu starten.
Klonen Sie das Repo und installieren Sie die erforderlichen Python -Pakete nach
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtDann rennen
python app.py Klicken Sie auf die URL in den von Flash generierten Ausgabeinformationen (Standardeinstellungen zu http://127.0.0.1:5000/ ), und dann wird onnx-modifier im Webbrowser gestartet.
Ich habe aufgezeichnet, wie ich die ausführbare Datei in
app_desktop.pyerstellt habe. Die ausführbare Datei für andere Plattformen bleibt für zukünftige Arbeiten.
Wir erstellen einen solchen Docker -Container:
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier Nach dem Erstellen des Containers führen wir den Onnx-Modifier aus, indem wir den Docker-Port und einen lokalen Ordner modified_onnx herabstatten
mkdir -p modified_onnx
docker run -d -t
--name onnx-modifier
-u $( id -u ${USER} ) : $( id -g ${USER} )
-v $( pwd ) /modified_onnx:/modified_onnx
-p 5000:5000
onnx-modifier Dann haben wir Zugriff auf ONNX-MODIFER von URL http://127.0.0.1:5000. Die modifizierten ONNX -Modelle werden voraussichtlich im lokalen Ordner modified_onnx gefunden.
Klicken Sie Open Model... um das ONNX -Modell zum Bearbeiten hochzuladen. Das Modell wird analysiert und auf der Seite angezeigt.
Die Elemente auf Diagramm-Ebene befinden sich auf der linken Seite der Seite. Derzeit gibt es drei Schaltflächen: Add node Reset , Download und hinzufügen. Sie können:
Reset : Setzen Sie das gesamte Modelldiagramm in seinen Ausgangszustand zurück;Download : Speichern Sie das modifizierte Modell in der Festplatte. Beachten Sie die beiden Kontrollkästchen rechtsshape inference aus, um beim Speichern von Modell eine Forminferenz durchzuführen.shape inference -Funktion basiert auf Onnx-Tool, einem leistungsstarken Tool von ONNX-Drittanbietern.clean up die nicht verwendeten Knoten und Tensoren (wie Onnx -Graphsurgen).Add node : Fügen Sie dem Modell einen neuen Knoten hinzu.Die Elemente der Knotenebene befinden sich alle in der Seitenleiste, die durch Klicken auf einen bestimmten Knoten aufgerufen werden können.
Schauen wir uns genauer an.
Es gibt zwei Modi zum Löschen von Knoten: Delete With Children und Delete Single Node . Delete Single Node löscht nur den geklickten Knoten, während Delete With Children auch den gesamten Knoten löscht, der auf dem geklickten Knoten verwurzelt ist, was bequem und natürlich ist, wenn wir einen langen Pfad von Knoten löschen möchten.
Die Implementierung von
Delete With Childrenbasiert auf dem Backtracking -Algorithmus.
Für die Vorschau befinden sich die gelöschten Knoten zunächst im grauen Modus. Wenn ein Knoten versehentlich gelöscht wird, können Sie die Knotenschaltfläche Recover Node , um ihn wieder in die Grafik wiederherzustellen. Klicken Sie auf die Schaltfläche Enter , um den Löschvorgang in Kraft zu setzen, und dann wird das aktualisierte Diagramm automatisch auf der Seite angezeigt.
Die folgende Abbildung zeigt einen typischen Löschprozess:

Manchmal möchten wir dem existierten Modell neue Knoten einfügen. onnx-modifier unterstützt diese Funktion jetzt experimentell.
Beachten Sie, dass eine Schaltfläche Add node mit einem Selektorelemente am oberen links der Indexseite folgt. Um dies zu tun, müssen wir so einfach wie 3 Schritte tun:
Wählen Sie im Selektor einen Knoten -Typ und klicken Sie auf Add node . Dann taucht im Diagramm ein leerer Knoten des ausgewählten Typs auf.
Der Selektor enthält alle unterstützten Operatortypen in Domänen von
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18) undcom.microsoft(1).
Klicken Sie auf den neuen Knoten und bearbeiten Sie ihn im aufgerufenen Siderbar. Was wir füllen müssen, sind die Knotenattribute (standardmäßig undefined ) und seine Eingänge/Ausgänge (die entscheiden, wo der Knoten in den Diagramm eingefügt wird).
Wir sind fertig.

Im Folgenden finden Sie einige Hinweise für diese Funktion:
Durch Klicken auf das ? In den NODE PROPERTIES -> type oder das + in jedem Attribute können wir einen Hinweis erhalten, dass wir die Knoteninformationen füllen können.
Es wird empfohlen, das gesamte Attribute zu füllen, ohne sie als undefined zu lassen. Der Standardwert wird in der aktuellen Version möglicherweise nicht gut unterstützt.
Für das Attribute mit list werden Elemente mit ' , ' (comma) aufgeteilt. Beachten Sie, dass [] nicht benötigt wird.
Für die Inputs/Outputs mit list ist es gezwungen, höchstens 8 Elemente in der aktuellen Version zu sein. Wenn die tatsächliche Eingänge/Ausgabemummer weniger als 8 beträgt, können wir die nicht verwendeten Elemente mit dem Namen von list_custom lassen, und sie werden automatisch weggelassen.
Durch Ändern des Eingangs-/Ausgangsnamens von Knoten können wir den Modell -Vorwärts -Pfad ändern. Es kann auch hilfreich sein, wenn wir die Modellausgaben umbenennen möchten.
Mit onnx-modifier können wir dies erreichen, indem wir einfach einen neuen Namen für Knoteneingänge/-ausgänge in den entsprechenden Eingabe-Platzhalter eingeben. Die Graph -Topologie wird nach den neuen Namen automatisch und sofort aktualisiert.
Zum Beispiel möchten wir nun die in der folgenden Abbildung gezeigten Vorverarbeitungsoperatoren ( Sub->Mul->Sub->Transpose ) entfernen. Wir können
Conv und benennen Sie seine Eingabe (x) als Serving_default_input: 0 (die Ausgabe von Knoten data_0 ) um.Conv direkt sehen. Darüber hinaus wurden die Vorverarbeitungsbetreiber aus der Hauptroutine aufgeteilt. Löschen sie.Download , dann können wir das modifizierte ONNX -Modell erhalten).Hinweis: Zum Verknüpfen des Knotens
$ A $ (data_0im obigen Beispiel) zum Knoten$ B $ (Die ersteConvim obigen Beispiel) wird vorgeschlagen, die Eingabe des Knotens zu bearbeiten$ B $ zum Ausgang des KnotensA, anstatt die Ausgabe des Knotens zu bearbeiten$ A $ zum Eingang des KnotensB. Weil die Eingabe von$ B $ Kann auch die Ausgabe eines anderen Knotens sein (im obigen BeispielTranspose) und unerwartete Ergebnisse werden auftreten.
Der Prozess ist in der folgenden Abbildung dargestellt:

Klicken Sie auf den Modelleingangs-/Ausgangsknoten, geben Sie einen neuen Namen in die Seitenleiste ein, dann sind wir fertig.

Manchmal möchten wir die Ausgabe eines bestimmten Knotens als Modellausgabe einstellen. Zum Beispiel möchten wir für die feinkörnige Analyse eine Zwischenschichtausgabe extrahieren. In onnx-modifier können wir dies erreichen, indem wir einfach auf die Schaltfläche Add Output in der Seitenleiste des entsprechenden Knotens klicken. Anschließend können wir einen neuen Modellausgabeknoten nach dem entsprechenden Knoten erhalten. Sein Name ist der gleiche wie die Ausgabe des entsprechenden Knotens.
Im folgenden Beispiel fügen wir 2 neue Modellausgänge hinzu, nämlich die Ausgänge des 1. Conv bzw. den 2. Conv .

Manchmal müssen wir einem Modell Eingaben hinzufügen (z. B. ein Submodell, das aus einem Originalmodell extrahiert wurde). In onnx-modifier können wir es erreichen, wenn:

HINWEIS: Die Eingangsform ist in "DTYPE [DIM0, DIM1, ...]" Format wie "Float32 [1,3, 224, 224]" angenommen. Andernfalls zeigt Warnungen und die Schaltfläche "Bestätigung" deaktiviert. Darüber hinaus kann die Eingangsform manchmal durch Analyse des Modells vorgefüllt werden (wir können ihr vertrauen). Wenn nicht, sollten wir es manuell einstellen.
Ändern Sie das ursprüngliche Attribut in einen neuen Wert, dann sind wir fertig.
Durch Klicken auf die
+auf der rechten Seite des Platzhalters können wir hilfreiche Referenzen erhalten.

onnx-modifier unterstützt jetzt die Schnittleistung. Klicken Sie auf die Eingabe des Zielmodells und klicken Sie dann auf die Schaltfläche Change input shape (static) . Stellen Sie im Dialogfeld Poped eine neue Form für die Eingabe fest und klicken Sie auf "Bestätigen". Die DownSrteam -Tensor -Form wird im heruntergeladenen modifizierten Modell aktualisiert (und nicht im Pannel, da der Forminstrahlungsvorgang nach dem Klicken auf "Download" angewendet wird).
onnx-modifier unterstützt auch die Änderung der Eingabe, um dynamisch zu sein. Derzeit wird nur die Chargendimension unterstützt. Klicken Sie einfach auf die Schaltfläche Set dynamic batch size . Dann erhalten wir ein Modell, das die Inferenz der dynamischen Stapelgröße unterstützt.
Manchmal möchten wir die Werte bearbeiten, die in den Modellinitialisierern gespeichert sind, wie das Gewicht/die Verzerrung einer Faltungsschicht oder den Formparameter eines Reshape -Knotens. onnx-modifier unterstützt diese Funktion jetzt! Geben Sie einen neuen Wert für den Initialisierer in der aufgerufenen Seitenleiste ein und klicken Sie auf Download, dann sind wir fertig.

Hinweis: Für den neu hinzugefügten Knoten sollten wir auch den Datentyp des Initialisierers eingeben. (Wenn wir nicht sicher sind, wie der Datentyp ist, klicken Sie auf
NODE PROPERTIES->type->?
Die neueste Version (nach 2023.12.10) unterstützt das Lesen von Initialisierungswerten aus Numpy -Datei! Klicken Sie einfach auf die Schaltfläche " *.npy" und wählen Sie die Numpy -Datei aus. Die Werte werden im obigen Platzhalter analysiert und angezeigt. Die Werte können weiter bearbeitet werden.

Für schnelle Tests werden einige typische Beispielmodelle wie folgt bereitgestellt. Die meisten von ihnen stammen aus dem ONNX -Modellzoo
onnx-modifier ist unter aktiver Entwicklung? Willkommen zu verwenden, Probleme zu erstellen und Anfragen zu ziehen! ?