
Inglés | 简体中文
Para editar un modelo ONNX, una forma común es visualizar el gráfico del modelo y editarlo utilizando la API Python ONNX. Esto funciona bien. Sin embargo, tenemos que codificar para editar, luego visualizar para verificar. Los dos procesos pueden iterar por muchas veces, lo cual lleva mucho tiempo.
¿Qué pasa si tenemos una herramienta, que nos permite editar y obtener una vista previa del efecto de edición de manera totalmente visualización ?
Entonces viene onnx-modifier . Con él, podemos centrarnos en editar el gráfico del modelo en el panel de visualización. Python ONNX API resumirá y procesará toda la información de edición. ¡Entonces nuestro tiempo se puede guardar!
onnx-modifier se crea en base al popular visor de red Netron y al frasco de marco de aplicaciones web livianas.
Actualmente, las siguientes operaciones de edición son compatibles:
✅ Eliminar nodos
✅ Agregar nodos nuevos
✅ Cambie el nombre de las entradas y salidas del nodo
✅ Cambie el nombre de las entradas y salidas del modelo
✅ Agregar nuevas salidas de modelo
✅ Agregue nuevas entradas de modelo
✅ Editar forma de entrada del modelo
✅ Editar atributo de nodos
✅ Editar inicializadores del modelo
Aquí está el registro de actualizaciones y la lista de TODO. Aquí está la descripción general del diseño, que puede ser útil para alguien que quiere contribuir a este proyecto.
¡Espero que ayude!
Tenemos tres métodos para lanzar onnx-modifier ahora.
Clonar el repositorio e instalar los paquetes de pitón requeridos por
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtLuego corre
python app.py Haga clic en la URL en la información de salida generada por Flask (predeterminada a http://127.0.0.1:5000/ ), luego se iniciará onnx-modifier en el navegador web.
Grabé cómo hice el archivo ejecutable en
app_desktop.py. El archivo ejecutable para otras plataformas se deja para trabajos futuros.
Creamos un contenedor Docker como este:
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier Después de construir el contenedor, ejecutamos el modificador ONNX mapeando el puerto Docker y una carpeta 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 Luego tenemos acceso a ONNX-Modifer desde URL http://127.0.0.1:5000. Se espera que los modelos ONNX modificados se encuentren dentro de la carpeta local modified_onnx .
Haga clic Open Model... para cargar el modelo ONNX para editar. El modelo se analizará y se mostrará en la página.
Los elementos de operación a nivel de gráfico se colocan en la parte superior izquierda de la página. Actualmente, hay tres botones: Reset , Download y Add node . Pueden hacer:
Reset : restablecer todo el gráfico del modelo a su estado inicial;Download : Guarde el modelo modificado en el disco. Tenga en cuenta las dos casillas de verificación a la derechashape inference para hacer una inferencia de forma al guardar el modelo.shape inference está construida en la tapa OnNX, que es una poderosa herramienta de terceros ONNX.clean up para eliminar los nodos y tensores no utilizados (como ONNX Graphsurgeon).Add node : Agregue un nuevo nodo al modelo.Los elementos de operación de nivel de nodo están todos en la barra lateral, que se puede invocar haciendo clic en un nodo específico.
Echemos un vistazo más de cerca.
Hay dos modos para eliminar el nodo: Delete With Children y Delete Single Node . Delete Single Node solo elimina el nodo haciendo clic, mientras que Delete With Children también elimina todo el nodo enraizado en el nodo hecho, lo cual es conveniente y natural si queremos eliminar una ruta larga de nodos.
La implementación de
Delete With Childrense basa en el algoritmo de retroceso.
Para una vista previa, los nodos eliminados están en modo gris al principio. Si un nodo se elimina por error, el botón Recover Node puede ayudarnos a recuperarlo al gráfico. Haga clic en Enter Button para tomar la operación de eliminación en efecto, luego el gráfico actualizado se mostrará en la página automáticamente.
La siguiente figura muestra un proceso de eliminación típico:

A veces queremos agregar nuevos nodos al modelo existido. onnx-modifier admite esta función experimentalmente ahora.
Tenga en cuenta que hay un botón Add node , siguiendo con un elemento selector en la parte superior izquierda de la página de índice. Para hacer esto, lo que debemos hacer es tan fácil como 3 pasos:
Elija un tipo de nodo en el selector y haga clic en el botón Add node . Luego surgirá un nodo vacío del tipo elegido en el gráfico.
El selector contiene todos los tipos de operadores compatibles en los dominios de
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18) ycom.microsoft(1).
Haga clic en el nuevo nodo y edítelo en la barra siderada invocada. Lo que necesitamos llenar son los atributos del nodo ( undefined por defecto) y sus entradas/salidas (que deciden dónde se insertará el nodo en el gráfico).
Hemos terminado.

Las siguientes son algunas notas para esta característica:
Haciendo clic en el ? En las NODE PROPERTIES -> type , o el + en cada elemento Attribute , podemos obtener alguna referencia para ayudarnos a llenar la información del nodo.
Se sugiere que llene todo el Attribute , sin dejarlos como undefined . El valor predeterminado puede no ser compatible bien en la versión actual.
Para el Attribute con list de tipos, los elementos se dividen con ' , ' (coma). Tenga en cuenta que [] no es necesario.
Para las Inputs/Outputs con list de tipos, se ve obligado a ser como máximo 8 elementos en la versión actual. Si el número de entradas/salidas reales es inferior a 8, podemos dejar los elementos no utilizados con el nombre que comienza con list_custom , y se omitirán automáticamente.
Al cambiar el nombre de entrada/salida de los nodos, podemos cambiar la ruta de reenvío del modelo. También puede ser útil si queremos cambiar el nombre de la (s) salida (s) del modelo.
Usando onnx-modifier , podemos lograrlo simplemente ingrese un nuevo nombre para las entradas/salidas de nodo en su marcador de posición de entrada correspondiente. La topología del gráfico se actualiza automáticamente e instantáneamente, según los nuevos nombres.
Por ejemplo, ahora queremos eliminar los operadores de preprocesos ( Sub->Mul->Sub->Transpose ) que se muestran en la siguiente figura. Podemos
Conv , cambie el nombre de su entrada (x) como serving_default_input: 0 (la salida de nodo data_0 ).Conv directamente. Además, los operadores de preprocesos se han dividido de la rutina principal. Eliminarlos.Download , luego podemos obtener el modelo ONNX modificado).Nota: para enlace nodo
$ A $ (data_0en el ejemplo anterior) al nodo$ B $ (el primerConven el ejemplo anterior), se sugiere editar la entrada del nodo$ B $ a la salida del nodoA, en lugar de editar la salida del nodo$ A $ a la entrada del nodoB. Porque la entrada de$ B $ También puede ser la salida de otro nodo (Transposeen el ejemplo anterior) y ocurrirá un resultado inesperado.
El proceso se muestra en la siguiente figura:

Haga clic en el nodo de entrada/salida del modelo, escriba un nuevo nombre en la barra lateral, luego terminamos.

A veces queremos establecer la salida de cierto nodo como salida del modelo. Por ejemplo, queremos extraer la salida de capa intermedia para un análisis de grano fino. En el onnx-modifier , podemos lograrlo simplemente haciendo clic en el botón Add Output en la barra lateral del nodo correspondiente. Luego podemos obtener un nuevo nodo de salida de modelo después del nodo correspondiente. Su nombre es el mismo que la salida del nodo correspondiente.
En el siguiente ejemplo, agregamos 2 salidas de modelos nuevos, que son las salidas del primer nodo Conv y el segundo nodo Conv , respectivamente.

A veces necesitamos agregar entradas a un modelo (como un submodelo extraído de un modelo original). En onnx-modifier , podemos lograrlo por:

Nota: La forma de entrada se supone en "Dtype [DIM0, DIM1, ...]" Formato, como "Float32 [1,3, 224,224]". De lo contrario, se muestra la advertencia y el botón "Confirmar" está deshabilitado. Además, a veces la forma de entrada se puede llenar analizando el modelo (podemos confiar en él). Si no, debemos configurarlo manualmente.
Cambie el atributo original a un nuevo valor, luego terminamos.
Al hacer clic en el
+en el lado derecho del marcador de posición, podemos obtener una referencia útil.

onnx-modifier admite la forma de entrada editiva ahora. Haga clic en la entrada del modelo de destino, luego haga clic en el botón Change input shape (static) . En el cuadro de diálogo Popped, configure una nueva forma para la entrada y haga clic en "Confirmar". La forma del tensor DownSrTEAM se actualizará en el modelo modificado descargado (en lugar de en el panel al instante, ya que el proceso de inferencia de forma se aplica después de hacer clic "Descargar").
onnx-modifier también admite cambiar la entrada para que sea dinámica. Actualmente solo se admite la dimensión por lotes. Simplemente haga clic en el botón Set dynamic batch size , luego obtenemos un modelo que admite una inferencia de tamaño de lotes dinámico.
A veces queremos editar los valores que se almacenan en los inicializadores de modelos, como el peso/sesgo de una capa de convolución o el parámetro de forma de un nodo Reshape . onnx-modifier admite esta función ahora! Ingrese un nuevo valor para el inicializador en la barra lateral invocada y haga clic en Descargar, luego terminamos.

Nota: Para el nodo recién agregado, también debemos ingresar el tipo de datos del inicializador. (Si no estamos seguros de cuál es el tipo de datos, haga clic en
NODE PROPERTIES->type->?Podemos obtener algunas pistas).
¡La última versión (después de 2023.12.10) admite los valores del inicializador de lectura del archivo Numpy! Simplemente haga clic en el botón "Abrir *.npy" y seleccione el archivo Numpy, los valores se analizarán y se mostrarán en el marcador de posición anterior. Los valores se pueden editar en el momento.

Para pruebas rápidas, se proporcionan algunos modelos de muestra típicos de lo siguiente. La mayoría de ellos son del zoológico del modelo ONNX
¿ onnx-modifier está bajo desarrollo activo? ¡Bienvenido a usar, crear problemas y extraer solicitudes! ?