Skip to content
> 💻 🧠 Codice 1001 > > Cos’è ONNX (Open Neural Network Exchange)?

Cos’è ONNX (Open Neural Network Exchange)?

In parole semplici, ONNX è un “traduttore” universale per le reti neurali, che permette agli sviluppatori di spostare liberamente i modelli da un ambiente all’altro.

Analogia: se una rete neurale è un documento complesso, ONNX è il formato PDF. Puoi creare un documento in qualsiasi editor (PyTorch, TensorFlow), ma una volta salvato come PDF si aprirà rapidamente e in modo coerente su qualsiasi dispositivo tramite un lettore universale (ONNX Runtime).


Come funziona ONNX

ONNX rappresenta ogni modello come un grafo computazionale. Questo grafo è composto da nodi (operazioni matematiche o operatori) e archi (flussi di dati sotto forma di tensori). Lo standard definisce un insieme unificato di operatori e formati di dati compresi da tutti gli strumenti compatibili.

Il processo operativo generalmente comprende due fasi principali:

  1. Esportazione: un modello addestrato in un framework (ad esempio PyTorch) viene convertito in un file .onnx.
  2. Deployment (Inference): il file .onnx risultante viene eseguito tramite un ambiente di runtime ad alte prestazioni — ONNX Runtime.

Vantaggi principali di ONNX

Compatibilità dei framework:
Il principale vantaggio è la possibilità di spostare liberamente i modelli. Ad esempio, un modello può essere addestrato in PyTorch, utile per la ricerca, e poi distribuito tramite ONNX Runtime, ottimizzato per l’esecuzione rapida in produzione.

Ottimizzazione hardware:
I produttori di hardware (NVIDIA, Intel, ARM) forniscono librerie ottimizzate per eseguire modelli in formato ONNX. Ciò consente di ottenere le massime prestazioni su diversi dispositivi senza dover adattare il modello a ciascuna piattaforma.

Flessibilità e longevità:
Lo standard non vincola lo sviluppatore a un singolo stack tecnologico. Se compare un nuovo framework più efficiente, i modelli esistenti possono essere trasferiti facilmente.


ONNX Runtime: motore di esecuzione

ONNX Runtime è un componente chiave dell’ecosistema. È un ambiente ad alte prestazioni per l’esecuzione di modelli in formato .onnx. Sviluppato da Microsoft, open source, progettato per massimizzare la velocità dei calcoli del grafo ONNX su qualsiasi dispositivo — dal server potente al telefono mobile. Runtime supporta molti linguaggi (Python, C++, C#, Java) e piattaforme (Windows, Linux, Android, iOS).


Esempio pratico: da PyTorch a ONNX Runtime

Esportazione del modello da PyTorch:

import torch

# Il tuo modello addestrato
model = YourSuperModel() 
# Dati di input di esempio per definire la struttura del grafo
dummy_input = torch.randn(1, 3, 224, 224) 

torch.onnx.export(model, dummy_input, "model.onnx")

Esecuzione del modello con ONNX Runtime:

import onnxruntime as ort
import numpy as np

# Creazione della sessione di inferenza
session = ort.InferenceSession("model.onnx")

# Preparazione dei dati di input
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
input_name = session.get_inputs()[0].name

# Ottenere la predizione
result = session.run(None, {input_name: input_data})
print(result)

ONNX e Hugging Face: lo standard d’oro per NLP

Per modelli complessi come i transformer di Hugging Face, il processo di esportazione è semplificato dalla libreria Optimum, che funge da “ponte ufficiale” e gestisce automaticamente tutti i dettagli della conversione.

Installazione dei pacchetti necessari:

pip install transformers onnx onnxruntime optimum[onnxruntime]

Esportazione ed esecuzione di un modello Hugging Face:

from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer, pipeline

model_id = "distilbert-base-uncased-finetuned-sst-2-english"

# Passo 1: esportazione del modello in ONNX (una tantum)
model = ORTModelForSequenceClassification.from_pretrained(model_id, from_transformers=True)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model.save_pretrained("./onnx-model/")
tokenizer.save_pretrained("./onnx-model/")

# Passo 2: esecuzione del modello ONNX ottimizzato
classifier = pipeline("text-classification", model="./onnx-model/")
result = classifier("ONNX e Hugging Face sono una combinazione potente!")
print(result)  # Output: [{'label': 'POSITIVE', 'score': 0.9998...}]

Chiave delle prestazioni: ottimizzazione e quantizzazione

ONNX Runtime non si limita a eseguire i modelli — li accelera. Uno dei principali metodi è la quantizzazione.

In parole semplici: è il processo di “semplificazione” dei calcoli all’interno del modello. Invece di usare calcoli ad alta precisione (FP32, ad esempio 3.14159), il modello utilizza numeri interi leggeri e veloci a 8 bit (INT8, da -128 a 127).

Vantaggi della quantizzazione:

  • 🚀 Alta velocità: le operazioni su numeri interi sono molto più rapide.
  • 💾 Dimensioni ridotte: il modello diventa circa 4 volte più piccolo.
  • 🔋 Efficienza energetica: riduzione del consumo energetico, critico per dispositivi mobili e edge.

Dove viene utilizzato ONNX

ONNX è diventato uno standard industriale ed è ampiamente adottato:

  • Servizi cloud: Azure ML, AWS SageMaker, Google Cloud AI.
  • Applicazioni desktop e mobile: ONNX Runtime funziona su Windows, Linux, macOS, Android e iOS.
  • Dispositivi edge: esecuzione efficiente dei modelli AI su dispositivi con risorse limitate (telecamere, droni, sensori industriali).

Limitazioni

Nonostante tutti i vantaggi, ci sono alcune limitazioni. La conversione di architetture molto complesse o nuove può incontrare problemi se un operatore specifico non ha ancora un equivalente in ONNX. La comunità lavora attivamente per ampliare il supporto.


Link utili

Leave a Reply

Your email address will not be published. Required fields are marked *