
Inglês | 简体中文
Para editar um modelo ONNX, uma maneira comum é visualizar o gráfico do modelo e editá -lo usando o OnNX Python API. Isso funciona bem. No entanto, temos que codificar para editar e visualizar para verificar. Os dois processos podem iterar por muitas vezes, o que consome tempo.
E se tivermos uma ferramenta, que nos permitir editar e visualizar o efeito de edição de maneira totalmente visualização ?
Então onnx-modifier vem. Com ele, podemos nos concentrar na edição do gráfico do modelo no pannel de visualização. Todas as informações de edição serão resumidas e processadas pela Python ONNX API finalmente. Então nosso tempo pode ser salvo!
onnx-modifier é construído com base no popular visualizador de rede Netron e no frasco leve da estrutura de aplicativos da web.
Atualmente, as seguintes operações de edição são suportadas:
✅ Exclua nós
✅ Adicione novos nós
✅ Renomear as entradas e saídas do nó
✅ Renomear as entradas e saídas do modelo
✅ Adicione novas saídas de modelo
✅ Adicione novas entradas de modelo
✅ Editar formato de entrada do modelo
✅ Editar atributo de nós
✅ Editar iniciantes do modelo
Aqui está o log de atualização e a lista de tarefas. Aqui está a visão geral do design, que pode ser útil para alguém que deseja contribuir com este projeto.
Espero que ajude!
Agora temos três métodos para lançar onnx-modifier .
Clone o repositório e instale os pacotes Python necessários por
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtEm seguida, corra
python app.py Clique no URL nas informações de saída geradas pelo Flask (padrão para http://127.0.0.1:5000/ ), então onnx-modifier será lançado no navegador da web.
Eu gravei como fiz o arquivo executável em
app_desktop.py. O arquivo executável para outras plataformas é deixado para trabalhos futuros.
Criamos um recipiente do docker como este:
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier Depois de construir o contêiner, executamos o OnNX-Modifier, mapeando a porta do docker e uma pasta 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 Em seguida, temos acesso ao ONNX-Modifer da URL http://127.0.0.1:5000. Espera -se que os modelos ONNX modificados sejam encontrados dentro da pasta local modified_onnx .
Clique em Open Model... para fazer upload do modelo ONNX para editar. O modelo será analisado e mostrado na página.
Os elementos de operação no nível do gráfico são colocados no topo esquerdo da página. Atualmente, existem três botões: Reset , Download e Add node . Eles podem fazer:
Reset : redefinir todo o gráfico do modelo para seu estado inicial;Download : salve o modelo modificado no disco. Observe as duas caixas de seleção à direitashape inference para fazer a inferência de forma ao salvar o modelo.shape inference é construído no ONNX-Tool, que é uma poderosa ferramenta ONNX de terceiros.clean up para remover os nós e tensores não utilizados (como o OnNX GraphSurgeon).Add node : adicione um novo nó no modelo.Os elementos de operação no nível do nó estão todos na barra lateral, que podem ser chamados clicando em um nó específico.
Vamos dar uma olhada mais de perto.
Existem dois modos para excluir o nó: Delete With Children e Delete Single Node . Delete Single Node exclui apenas o nó clicado, enquanto Delete With Children também exclui todo o nó enraizado no nó clicado, que é conveniente e natural se queremos excluir um longo caminho de nós.
A implementação do
Delete With Childrené baseada no algoritmo de retrocesso.
Para visualização, os nós excluídos estão no modo cinza no início. Se um nó for excluído por engano, o botão Recover Node pode nos ajudar a recuperá -lo de volta ao gráfico. Clique em Enter o botão para levar a operação de exclusão em vigor, o gráfico atualizado será exibido na página automaticamente.
A figura a seguir mostra um processo de exclusão típico:

Às vezes, queremos adicionar novos nós ao modelo existente. onnx-modifier suporta esse recurso experimentalmente agora.
Observe que há um botão Add node , seguindo com um seletor elementos na parte superior esquerda da página de índice. Para fazer isso, o que precisamos fazer é tão fácil quanto 3 etapas:
Escolha um tipo de nó no seletor e clique no botão Add node . Em seguida, um nó vazio do tipo escolhido emergirá no gráfico.
O seletor contém todos os tipos de operadores suportados nos domínios de
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18) ecom.microsoft(1).
Clique no novo nó e edite -o na barra Sider Invocada. O que precisamos preencher são os atributos do nó ( undefined por padrão) e suas entradas/saídas (que decidem onde o nó será inserido no gráfico).
Nós terminamos.

A seguir, são apresentadas algumas notas para este recurso:
Ao clicar no ? Nas NODE PROPERTIES -> type , ou o + em cada elemento Attribute , podemos obter alguma referência para nos ajudar a preencher as informações do nó.
Sugere -se preencher todo o Attribute , sem deixá -los undefined . O valor padrão não pode ser bem suportado na versão atual.
Para o Attribute com list de tipos, os itens são divididos com ' , (vírgula). Observe que [] não é necessário.
Para as Inputs/Outputs com list de tipos, ela é forçada a ser no máximo 8 elementos na versão atual. Se o número real de entrada/saída for menor que 8, podemos deixar os itens não utilizados com o nome começando com list_custom e eles serão automaticamente omitidos.
Ao alterar o nome de entrada/saída dos nós, podemos alterar o caminho para a frente do modelo. Também pode ser útil se quisermos renomear a (s) saída (s) do modelo.
Usando onnx-modifier , podemos conseguir isso simplesmente inserindo um novo nome para entradas/saídas do nó em seu espaço reservado de entrada correspondente. A topologia do gráfico é atualizada automaticamente e instantaneamente, de acordo com os novos nomes.
Por exemplo, agora queremos remover os operadores de pré-processamento ( Sub->Mul->Sub->Transpose ) mostrados na figura a seguir. Pudermos
Conv , renomeie sua entrada (x) como serving_default_input: 0 (a saída do nó data_0 ).Conv . Além disso, os operadores de pré -processo foram divididos na rotina principal. Exclua -os.Download , então podemos obter o modelo ONNX modificado).Nota: para vincular o nó
$ A $ (data_0no exemplo acima) para o nó$ B $ (o 1ºConvno exemplo acima), sugere -se editar a entrada do nó$ B $ para a saída do nóA, em vez de editar a saída do nó$ A $ para a entrada do nóB. Porque a entrada de$ B $ Também pode ser a saída de outro nó (Transposeno exemplo acima) e o resultado inesperado acontecerá.
O processo é mostrado na figura a seguir:

Clique no nó de entrada/saída do modelo, digite um novo nome na barra lateral e, em seguida, terminamos.

Às vezes, queremos definir a saída de um determinado nó como saída do modelo. Por exemplo, queremos extrair a saída da camada intermediária para análise de granulação fina. No onnx-modifier , podemos conseguir isso simplesmente clicando no botão Add Output na barra lateral do nó correspondente. Em seguida, podemos obter um novo nó de saída de modelo seguindo o nó correspondente. Seu nome é o mesmo que a saída do nó correspondente.
No exemplo a seguir, adicionamos 2 novas saídas de modelo, que são as saídas do 1º Conv e o 2º Conv , respectivamente.

Às vezes, precisamos adicionar entradas a um modelo (como um submodelo extraído de um modelo original). No onnx-modifier , podemos alcançá-lo por:

Nota: A forma de entrada é suposta em "Dtype [DIM0, DIM1, ...]" formato, como "Float32 [1,3, 224.224]". Caso contrário, o aviso mostra e o botão "confirmar" está desativado. Além disso, às vezes a forma de entrada pode ser preenchida analisando o modelo (podemos confiar nele). Caso contrário, devemos defini -lo manualmente.
Altere o atributo original para um novo valor, então terminamos.
Ao clicar no
+no lado direito do espaço reservado, podemos obter uma referência útil.

onnx-modifier suporta a forma de entrada de edição agora. Clique na entrada do modelo de destino e clique no botão Change input shape (static) . Na caixa de diálogo Hopped, defina uma nova forma para a entrada e clique em "Confirmar". A forma do tensor do DownsrTeam será atualizada no modelo modificado baixado (e não no pannel instantaneamente, pois o processo de inferência de forma é aplicado após o clicado de "Download").
onnx-modifier também suporta a mudança de entrada para ser dinâmica. Atualmente, apenas a dimensão do lote é suportada. Basta clicar no botão Set dynamic batch size e, em seguida, obtemos um modelo que suporta a inferência dinâmica do tamanho do lote.
Às vezes, queremos editar os valores armazenados nos inicializadores do modelo, como o peso/viés de uma camada de convolução ou o parâmetro de forma de um nó Reshape . onnx-modifier suporta esse recurso agora! Insira um novo valor para o inicializador na barra lateral invocada e clique em Download, então terminamos.

Nota: Para o nó recém -adicionado, também devemos inserir o tipo de dados do inicializador. (Se não tivermos certeza de qual é o tipo de dados, clique em
NODE PROPERTIES->type->?Podemos obter algumas pistas.)
A versão mais recente (após 2023.12.10) suporta os valores de inicializadora da leitura do arquivo Numpy! Basta clicar no botão "Abrir *.npy" e selecionar o arquivo Numpy, os valores serão analisados e mostrados no espaço reservado acima. Os valores podem ser editados posteriormente.

Para testes rápidos, alguns modelos de amostra típicos são fornecidos conforme o seguinte. A maioria deles é do zoológico de modelo Onnx
onnx-modifier está sob desenvolvimento ativo?. Bem -vindo ao uso, crie problemas e puxe solicitações! ?