Modello ONNX | Scambio Aperto di Reti Neurali

ONNX Model | Open Exchange of Neural Networks

Introduzione

ONNX, noto anche come Open Neural Network Exchange, è diventato ampiamente riconosciuto come un formato standardizzato che facilita la rappresentazione dei modelli di deep learning. Il suo utilizzo ha guadagnato significativa popolarità grazie alla sua capacità di favorire uno scambio e una collaborazione senza soluzione di continuità tra vari framework, tra cui PyTorch, TensorFlow e Cafe2.

Uno dei principali vantaggi di ONNX risiede nella sua capacità di garantire la coerenza tra i framework. Inoltre, offre la flessibilità di esportare e importare modelli utilizzando diversi linguaggi di programmazione, come Python, C++, C# e Java. Questa versatilità consente agli sviluppatori di condividere facilmente e sfruttare i modelli all’interno della comunità più ampia, indipendentemente dal linguaggio di programmazione preferito.

Obiettivi di Apprendimento

  1. In questa sezione, approfondiremo ampiamente ONNX, fornendo un tutorial completo su come convertire i modelli nel formato ONNX. Per garantire chiarezza, i contenuti saranno organizzati in sottosezioni separate.
  2. Inoltre, esploreremo diversi strumenti che possono essere utilizzati per la conversione dei modelli nel formato ONNX.
  3. Successivamente, ci concentreremo sul processo passo-passo di conversione dei modelli PyTorch nel formato ONNX.
  4. Infine, presenteremo un sommario completo, evidenziando le principali scoperte e intuizioni riguardanti le capacità di ONNX.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Panoramica Dettagliata

ONNX, acronimo di Open Neural Network Exchange, è un formato liberamente disponibile appositamente progettato per modelli di deep learning. Il suo scopo principale è quello di facilitare lo scambio e la condivisione senza soluzione di continuità di modelli tra diversi framework di deep learning, tra cui TensorFlow e Caffe2, quando utilizzati insieme a PyTorch.

Uno dei vantaggi notevoli di ONNX è la sua capacità di trasferire modelli tra framework diversi con una preparazione minima e senza la necessità di riscrivere i modelli. Questa caratteristica semplifica notevolmente l’ottimizzazione e l’accelerazione dei modelli su diverse piattaforme hardware, come GPU e TPU. Inoltre, consente ai ricercatori di condividere i loro modelli in un formato standardizzato, promuovendo la collaborazione e la riproducibilità.

Per supportare un lavoro efficiente con i modelli ONNX, ONNX fornisce diversi strumenti utili. Ad esempio, ONNX Runtime funge da motore ad alte prestazioni per l’esecuzione dei modelli. Inoltre, il convertitore ONNX facilita la conversione senza soluzione di continuità dei modelli tra diversi framework.

ONNX è un progetto in continua evoluzione che beneficia dei contributi di importanti attori della comunità di intelligenza artificiale, tra cui Microsoft e Facebook. Godi del supporto di vari framework di deep learning, librerie e partner hardware, come Nvidia e Intel. Inoltre, i principali fornitori di servizi cloud come AWS, Microsoft Azure e Google Cloud offrono supporto per ONNX.

Cos’è ONNX?

ONNX, noto anche come Open Neural Network Exchange, serve come formato standardizzato per la rappresentazione dei modelli di deep learning. Il suo obiettivo principale è promuovere la compatibilità tra vari framework di deep learning, tra cui TensorFlow, PyTorch, Caffe2 e altri.

Il concetto fondamentale di ONNX ruota attorno a una rappresentazione universale dei grafi computazionali. Questi grafi, chiamati grafi di dati, definiscono i componenti o nodi del modello e le connessioni o archi tra di essi. Per definire questi grafi, ONNX utilizza un formato dati chiamato ProtoBuff, agnostico rispetto al linguaggio e alla piattaforma. Inoltre, ONNX incorpora un insieme standardizzato di tipi, funzioni e attributi che specificano i calcoli eseguiti all’interno del grafo, così come i tensori di input e output.

ONNX è un progetto open-source sviluppato congiuntamente da Facebook e Microsoft. La sua ultima versione continua a evolversi, introducendo ulteriori funzionalità ed espandendo il supporto per abbracciare tecniche emergenti di deep learning.

Come Convertire?

Per convertire un modello PyTorch nel formato ONNX, avrai bisogno del modello PyTorch e del codice sorgente associato utilizzato per crearlo. Questo processo prevede l’utilizzo di PyTorch per caricare il modello in Python, definendo valori di input segnaposto per tutte le variabili di input e utilizzando l’esportatore ONNX per generare il modello ONNX. Durante la conversione di un modello in ONNX, è importante considerare gli aspetti chiave seguenti. Per ottenere una conversione di successo utilizzando ONNX, segui i seguenti passaggi:

1. Inizia caricando il modello PyTorch in Python utilizzando la libreria PyTorch.

2. Assegna valori di input predefiniti a tutte le variabili all’interno del modello. Questo passaggio garantisce che le trasformazioni siano allineate con i requisiti di input del modello.

3. Utilizza l’esportatore ONNX per generare modelli ONNX, che possono essere eseguiti in Python.

Durante il processo di conversione, è importante controllare e garantire i seguenti quattro aspetti per una conversione di successo con ONNX.

Addestramento del modello

Prima del processo di conversione, è necessario addestrare il modello utilizzando framework come TensorFlow, PyTorch o Cafe2. Una volta addestrato il modello, può essere convertito nel formato ONNX, consentendo il suo utilizzo in diversi framework o ambienti.

Nomi di input e output

È importante assegnare nomi distinti e descrittivi ai tensori di input e output nel modello ONNX per garantire un’identificazione accurata. Questa convenzione di denominazione facilita l’integrazione e la compatibilità del modello tra diversi framework o ambienti.

Gestione degli assi dinamici

Gli assi dinamici sono supportati da ONNX, consentendo ai tensori di rappresentare parametri come la dimensione del batch o la lunghezza della sequenza. È fondamentale gestire attentamente gli assi dinamici durante il processo di conversione per mantenere coerenza e usabilità del modello ONNX risultante tra diversi framework o ambienti.

Valutazione della conversione

Dopo aver convertito il modello nel formato ONNX, è consigliabile effettuare una valutazione. Questa valutazione include il confronto tra le uscite dei modelli originale e convertito utilizzando un set di dati di input condiviso. Confrontando le uscite, gli sviluppatori possono garantire l’accuratezza e la correttezza del processo di conversione, verificando l’equivalenza del modello trasformato con quello originale.

Seguendo queste linee guida, gli sviluppatori possono convertire con successo modelli PyTorch nel formato ONNX, promuovendo l’interoperabilità e consentendone l’utilizzo tra diversi framework e ambienti.

Strumenti per convertire il tuo modello in ONNX

Librerie ONNX: Le librerie ONNX offrono funzionalità per convertire modelli da diversi framework, inclusi TensorFlow, PyTorch e Caffe2, nel formato ONNX. Queste librerie sono disponibili in vari linguaggi di programmazione, come Python, C++ e C#.

  • ONNX Runtime: ONNX Runtime funge da motore di inferenza open-source appositamente progettato per l’esecuzione di modelli ONNX. Include lo strumento onnx2trt, che consente la conversione di modelli ONNX nel formato TensorRT. Sfruttando le GPU, in particolare le GPU NVIDIA, il formato TensorRT offre notevoli vantaggi in termini di prestazioni e accelerazione.

  • Netron: Netron è un browser web open-source creato appositamente per visualizzare ed esaminare modelli di reti neurali, inclusi quelli nel formato ONNX. Inoltre, Netron offre la funzionalità di convertire modelli ONNX in altri formati come TensorFlow o CoreML.
  • ONNX-Tensorflow: La libreria ONNX-Tensorflow è uno strumento di conversione che semplifica il processo di importazione di modelli ONNX in TensorFlow, ampiamente riconosciuto come un popolare framework di deep learning.
  • Model Optimizer: Model Optimizer è uno strumento di utilità a riga di comando che aiuta nella conversione di modelli addestrati nel formato Intermediate Representation (IR). L’Inference Engine può caricare ed eseguire modelli in questo formato IR, consentendo un efficiente deployment.
  • ONNXmizer: ONNXmizer è uno strumento creato da Microsoft che facilita la conversione di diverse rappresentazioni di reti neurali nel formato ONNX. La versione attuale di ONNXmizer è compatibile con framework popolari come PyTorch e TensorFlow.

Questi strumenti offrono risorse preziose per convertire modelli nel formato ONNX, migliorando l’interoperabilità e consentendo l’utilizzo su una vasta gamma di framework e piattaforme.

Come convertire un modello PyTorch in ONNX?

Per creare una semplice rete neurale con 10 punti di input e 10 punti di output utilizzando il modulo PyTorch NN, segui questi passaggi. Successivamente, converti il modello nel formato ONNX utilizzando la libreria ONNX.

Passo 1

Inizia importando le librerie necessarie, come PyTorch e ONNX, per agevolare il processo di conversione.

import torch
import onnx

Passaggio 2

Successivamente, definiamo l’architettura del modello. Per questo esempio, utilizzeremo una rete feed-forward di base. Crea un’istanza del modello e specifica l’input per l’istanza. Ciò ci permetterà di procedere con il processo di conversione.

# Definizione del modello PyTorch
class MyModel(torch.nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc = torch.nn.Linear(10, 10)

    def forward(self, x):
        x = self.fc(x)
        return x

# Creazione di un'istanza
model = MyModel()

Passaggio 3

Per esportare il modello nel formato ONNX e salvarlo come “mymodel.onnx”, puoi utilizzare la funzione torch.onnx.export(). Ecco un esempio.

# Definizione dell'esempio di input
example_input = torch.randn(1, 10)

# Esportazione nel formato ONNX
torch.onnx.export(model, example_input, "mymodel.onnx")

Passaggio 4

Dopo aver esportato il modello, puoi utilizzare il modulo onnx.checker per assicurarti che il modello sia consistente e verificare le forme dei tensori di input e output.

import onnx
model = onnx.load("mymodel.onnx")
onnx.checker.check_model(model)

La funzione onnx.checker.check_model() solleverà un’eccezione se ci sono errori nel modello. Altrimenti, restituirà None.

Passaggio 5

Per assicurarti l’equivalenza tra il modello originale e il modello ONNX convertito, puoi confrontare le loro uscite.

# Confronta l'output del modello originale e del modello convertito in ONNX per assicurarti la loro equivalenza.
original_output = model(example_input)
onnx_model = onnx.load("mymodel.onnx")
onnx.checker.check_model(onnx_model)
rep = onnx.shape_inference.infer_shapes(onnx_model)
onnx.checker.check_shapes(rep)
ort_session = onnxruntime.InferenceSession(onnx_model.SerializeToString())
ort_inputs = {ort_session.get_inputs()[0].name: example_input.numpy()}
ort_outs = ort_session.run(None, ort_inputs)
np.testing.assert_allclose(original_output.detach().numpy(), ort_outs[0], rtol=1e-03, atol=1e-05)
print("Output originale:", original_output)
print("Output del modello ONNX:", ort_outs[0])

Conclusioni

ONNX svolge un ruolo fondamentale nella promozione dell’interoperabilità dei modelli offrendo un formato standardizzato per la conversione di modelli addestrati in un framework per l’utilizzo in un altro. Questa integrazione senza soluzione di continuità dei modelli elimina la necessità di un nuovo addestramento durante la transizione tra diversi framework, librerie o ambienti.

Punti chiave

  • Durante il processo di trasformazione, è fondamentale assegnare nomi univoci e descrittivi ai tensori di input e output del modello. Questi nomi svolgono un ruolo importante nell’identificazione degli input e degli output nel formato ONNX.
  • Un altro aspetto importante da considerare durante la conversione di un modello in ONNX è la gestione dell’accesso dinamico. Gli assi dinamici possono essere utilizzati per rappresentare parametri dinamici come la dimensione del batch o la lunghezza della sequenza in un modello. È necessario garantire una corretta gestione degli assi dinamici per garantire coerenza e usabilità tra framework e ambienti.
  • Sono disponibili diversi strumenti open-source per facilitare la conversione di modelli nel formato ONNX. Questi strumenti includono ONNX Libraries, ONNX Runtime, Natron, ONNX-TensorFlow e ModelOptimizer. Ogni strumento ha punti di forza unici e supporta diversi framework di origine e di destinazione.
  • Sfruttando le capacità di ONNX e utilizzando questi strumenti, gli sviluppatori possono aumentare la flessibilità e l’interoperabilità dei loro modelli di deep learning, consentendo un’integrazione e un deployment senza soluzione di continuità su diversi framework e ambienti.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.