ONNX (Open Neural Network Exchange) è uno standard aperto creato per unificare e scambiare modelli di machine learning. Lanciato nel 2017 da Microsoft, Meta (ex Facebook) e AWS, risolve un problema chiave nel mondo dell’AI: la mancanza di compatibilità tra diversi framework (come PyTorch e TensorFlow), strumenti e piattaforme hardware.
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:
- Esportazione: un modello addestrato in un framework (ad esempio PyTorch) viene convertito in un file
.onnx. - Deployment (Inference): il file
.onnxrisultante 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
- Sito ufficiale: https://onnx.ai
- Repository GitHub: https://github.com/onnx/onnx
- ONNX Runtime: https://onnxruntime.ai
- Hugging Face Optimum: https://github.com/huggingface/optimum