
Anglais | 简体中文
Pour modifier un modèle ONNX, une manière courante est de visualiser le graphique du modèle et de le modifier à l'aide de l'API ONNX Python. Cela fonctionne bien. Cependant, nous devons coder pour modifier, puis visualiser pour vérifier. Les deux processus peuvent itérer à plusieurs reprises, ce qui prend du temps.
Et si nous avons un outil, qui nous permet de modifier et de prévisualiser l'effet d'édition de manière totalement visualisation ?
Ensuite, onnx-modifier vient. Avec lui, nous pouvons nous concentrer sur l'édition du graphique du modèle dans le panel de visualisation. Toutes les informations d'édition seront résumées et traitées par l'API Python ONNX enfin enfin. Ensuite, notre temps peut être sauvé!
onnx-modifier est construit sur la base du nettron populaire de la visionneuse de réseau et du ballon de framework d'application Web léger.
Actuellement, les opérations d'édition suivantes sont prises en charge:
✅ Supprimer les nœuds
✅ Ajouter de nouveaux nœuds
✅ Renommer les entrées et sorties de nœud
✅ Renommer les entrées et sorties du modèle
✅ Ajouter de nouvelles sorties de modèle
✅ Ajouter de nouvelles entrées de modèle
✅ Modifier la forme d'entrée du modèle
✅ Modifier l'attribut des nœuds
✅ Modifier les initialiseurs du modèle
Voici le journal de mise à jour et la liste TODO. Voici l'aperçu de la conception, qui peut être utile pour quelqu'un qui souhaite contribuer à ce projet.
J'espère que ça aide!
Nous avons maintenant trois méthodes pour lancer onnx-modifier .
Cloner le repo et installer les packages Python requis par
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtPuis courez
python app.py Cliquez sur l'URL dans les informations de sortie générées par Flask (par défaut, http://127.0.0.1:5000/ ), alors onnx-modifier sera lancé dans le navigateur Web.
J'ai enregistré comment j'ai fait le fichier exécutable dans
app_desktop.py. Le fichier exécutable pour d'autres plates-formes est laissé pour les travaux futurs.
Nous créons un conteneur Docker comme ceci:
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier Après avoir construit le conteneur, nous exécutons le modificateur ONNX en mappant le port Docker et un dossier local modified_onnx
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 Ensuite, nous avons accès à ONNX-MODIFER à partir de l'URL http://127.0.0.1:5000. Les modèles ONNX modifiés devraient être trouvés à l'intérieur du dossier local modified_onnx .
Cliquez sur Open Model... pour télécharger le modèle ONNX pour modifier. Le modèle sera analysé et illustré sur la page.
Les éléments de niveau de niveau graphique sont placés sur le toit à gauche de la page. Actuellement, il y a trois boutons: Reset , Download et Add node . Ils peuvent faire:
Reset : réinitialiser l'ensemble du graphique du modèle à son état initial;Download : Enregistrez le modèle modifié dans le disque. Notez les deux cases à droiteshape inference pour faire l'inférence de la forme lors de la sauvegarde du modèle.shape inference est construite sur ONNX-Tool, qui est un puissant outil tiers ONNX.clean up pour supprimer les nœuds et les tenseurs inutilisés (comme Graphsurgeon ONNX).Add node : ajoutez un nouveau nœud dans le modèle.Les éléments d'opération au niveau du nœud sont tous dans la barre latérale, qui peut être invoquée en cliquant sur un nœud spécifique.
Regardons de plus près.
Il existe deux modes pour supprimer le nœud: Delete With Children et Delete Single Node . Delete Single Node supprime uniquement le nœud cliqué, tandis que Delete With Children supprime également tout le nœud enraciné sur le nœud cliqué, ce qui est pratique et naturel si nous voulons supprimer un long chemin de nœuds.
La mise en œuvre de
Delete With Childrenest basée sur l'algorithme de retour en arrière.
Pour l'aperçu, les nœuds supprimés sont en mode gris au début. Si un nœud est supprimé par erreur, le bouton Recover Node peut nous aider à le récupérer au graphique. Cliquez sur le bouton Enter pour mettre en vigueur l'opération de suppression, puis le graphique mis à jour s'affiche automatiquement sur la page.
La figure suivante montre un processus de suppression typique:

Parfois, nous voulons ajouter de nouveaux nœuds dans le modèle existant. onnx-modifier prend en charge cette fonctionnalité expérimentalement maintenant.
Remarque Il existe un bouton Add node , suivant avec un sélecteur d'éléments en haut à gauche de la page d'index. Pour ce faire, ce que nous devons faire est aussi simple que 3 étapes:
Choisissez un type de nœud dans le sélecteur et cliquez sur le bouton Add node . Ensuite, un nœud vide du type choisi émergera sur le graphique.
Le sélecteur contient tous les types d'opérateurs pris en charge dans les domaines de
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18) etcom.microsoft(1).
Cliquez sur le nouveau nœud et modifiez-le dans la barre siderne invoquée. Ce que nous devons remplir, ce sont les attributs de nœud ( undefined par défaut) et ses entrées / sorties (qui décident où le nœud sera inséré dans le graphique).
Nous avons fini.

Voici quelques notes pour cette fonction:
En cliquant sur le ? Dans les NODE PROPERTIES -> type , ou le + dans chaque élément Attribute , nous pouvons obtenir une référence pour nous aider à remplir les informations du nœud.
Il est suggéré de remplir tout l' Attribute , sans les laisser undefined . La valeur par défaut peut ne pas être bien prise en charge dans la version actuelle.
Pour l' Attribute avec list des types, les éléments sont divisés avec ' , ' (Comma). Notez que [] n'est pas nécessaire.
Pour les Inputs/Outputs avec list de types, il est obligé d'être au plus 8 éléments dans la version actuelle. Si le nombre réel des entrées / sorties est inférieur à 8, nous pouvons laisser les éléments inutilisés avec le nom commençant par list_custom , et ils seront automatiquement omis.
En modifiant le nom d'entrée / sortie des nœuds, nous pouvons modifier le chemin avant du modèle. Il peut également être utile si nous voulons renommer les sorties du modèle.
En utilisant onnx-modifier , nous pouvons y parvenir en entrant simplement un nouveau nom pour les entrées / sorties de nœud dans son espace réservé d'entrée correspondant. La topologie du graphique est mise à jour automatiquement et instantanément, selon les nouveaux noms.
Par exemple, nous voulons maintenant supprimer les opérateurs de préproces ( Sub->Mul->Sub->Transpose ) illustré dans la figure suivante. Nous pouvons
Conv , renommez son entrée (x) en tant que serving_default_input: 0 (la sortie du nœud data_0 ).Conv . De plus, les opérateurs de prétraitement ont été divisés à partir de la routine principale. Supprimez-les.Download , alors nous pouvons obtenir le modèle ONNX modifié).Remarque: pour lier le nœud
$ A $ (data_0dans l'exemple ci-dessus) pour nœud$ B $ (le 1erConvdans l'exemple ci-dessus), il est suggéré de modifier l'entrée du nœud$ B $ à la sortie du nœudA, plutôt que de modifier la sortie du nœud$ A $ à l'entrée du nœudB. Parce que l'entrée de$ B $ Peut également être la sortie de l'autre nœud (Transposedans l'exemple ci-dessus) et un résultat inattendu se produira.
Le processus est illustré dans la figure suivante:

Cliquez sur le nœud d'entrée / sortie du modèle, tapez un nouveau nom dans la barre latérale, puis nous avons terminé.

Parfois, nous voulons définir la sortie d'un certain nœud en tant que sortie du modèle. Par exemple, nous voulons extraire la sortie de la couche intermédiaire pour une analyse à grain fin. Dans onnx-modifier , nous pouvons y parvenir en cliquant simplement sur le bouton Add Output dans la barre latérale du nœud correspondant. Ensuite, nous pouvons obtenir un nouveau nœud de sortie de modèle suivant le nœud correspondant. Son nom est le même que la sortie du nœud correspondant.
Dans l'exemple suivant, nous ajoutons 2 nouvelles sorties de modèle, qui sont les sorties du 1er nœud Conv et du 2e nœud Conv , respectivement.

Parfois, nous devons ajouter des entrées à un modèle (comme un sous-modèle extrait d'un modèle original). Dans onnx-modifier , nous pouvons y parvenir en:

Remarque: La forme d'entrée est supposée dans le format "dtype [dim0, dim1, ...]", comme "float32 [1,3, 224,224]". Sinon, l'avertissement montre et le bouton "Confirmer" est désactivé. De plus, parfois la forme d'entrée peut être pré-remplie en analysant le modèle (nous pouvons lui faire confiance). Sinon, nous devons le régler manuellement.
Modifiez l'attribut d'origine en une nouvelle valeur, puis nous avons terminé.
En cliquant sur le
+dans le côté droit de l'espace réservé, nous pouvons obtenir une référence utile.

onnx-modifier prend en charge la modification de la forme d'entrée maintenant. Cliquez sur l'entrée du modèle cible, puis cliquez sur le bouton Change input shape (static) . Dans la boîte de dialogue éclatée, définissez une nouvelle forme pour l'entrée et cliquez sur "Confirmer". La forme du tenseur DownsrTeam sera mise à jour dans le modèle modifié téléchargé (plutôt que dans le panneau instantanément, car le processus d'inférence de forme est appliqué après le "téléchargement" est cliqué).
onnx-modifier prend également en charge la modification de l'entrée pour être dynamique. Actuellement, seule la dimension par lots est prise en charge. Cliquez simplement sur le bouton Set dynamic batch size , puis nous obtenons un modèle qui prend en charge l'inférence dynamique de la taille du lot.
Parfois, nous voulons modifier les valeurs qui sont stockées dans les initialiseurs du modèle, tels que le poids / biais d'une couche de convolution ou le paramètre de forme d'un nœud Reshape . onnx-modifier prend en charge cette fonctionnalité maintenant! Entrez une nouvelle valeur pour l'initialisateur dans la barre latérale invoquée et cliquez sur Télécharger, puis nous avons terminé.

Remarque: Pour le nœud nouvellement ajouté, nous devons également saisir le type de données de l'initialisateur. (Si nous ne savons pas quel est le type de données, cliquez sur
NODE PROPERTIES->type->?, Nous pouvons obtenir des indices.)
La dernière version (après 2023.12.10) prend en charge la lecture des valeurs de l'initialisateur à partir du fichier Numpy! Cliquez simplement sur le bouton "Ouvrir * .npy" et sélectionnez le fichier Numpy, les valeurs seront analysées et affichées dans l'espace réservé ci-dessus. Les valeurs peuvent être éditées plus loin.

Pour des tests rapides, certains modèles d'échantillons typiques sont fournis comme suivant. La plupart d'entre eux proviennent du zoo du modèle ONNX
onnx-modifier est en cours de développement actif ?. Bienvenue à utiliser, créer des problèmes et extraire les demandes! ?