Learn

ONNX: Rendere i modelli di Machine Learning indipendenti dalle piattaforme e dai linguaggi

2 Novembre 2023 - 4 minuti di lettura

È ormai noto che il mondo del machine learning e dell’intelligenza artificiale è in continua evoluzione. In genere gli sviluppatori software e i data scientist si specializzano in un unico framework di machine learning diventando, in questo modo, più facilmente esperti della libreria del proprio linguaggio preferito. Purtroppo, però, ciò può risultare una limitazione: ci si potrebbe trovare davanti a un grosso ostacolo ogni volta che si deve lavorare con tecnologie diverse.

In questo articolo esploreremo come ONNX sia la chiave per potersi svincolare dalla presenza di diversi framework di machine learning.

Il problema

Essere esperti in tutti i framework e i linguaggi di programmazione utilizzati per lo sviluppo di modelli di machine learning rappresenta oggigiorno una bella sfida.
Cosa succede quando è necessario lavorare su un framework con il quale non si è familiari o quando un cliente richiede un linguaggio specifico? ONNX fornisce la soluzione a questo problema.

Cos’è ONNX e come risolve il problema

ONNX, acronimo di Open Neural Network Exchange, è un formato di modelli di machine learning indipendente dalla piattaforma e dal linguaggio di programmazione. Per tale motivo è possibile sviluppare un modello nel framework che si preferisce e successivamente esportarlo in questo formato.

Nel caso in cui un cliente richiedesse l’utilizzo di un framework specifico e diverso da quello che è stato utilizzato per sviluppare un modello, grazie a ONNX non c’è nessun problema. Dopo aver esportato in questo formato la versione originale di un modello, è possibile importarla nel medesimo formato all’interno del framework richiesto e utilizzare l’ONNX runtime adeguato a fare inferenza.

ONNX consente quindi di adattare facilmente i modelli ai vari linguaggi, senza la necessità di essere esperti in ognuno di essi.

Caratteristiche di ONNX

Questo formato si contraddistingue per una serie di caratteristiche:

  • Runtime: ONNX supporta una vasta gamma di runtime per le varie piattaforme e linguaggi di programmazione. Per utilizzare un modello di questo tipo in un framework specifico è sufficiente installare il runtime appropriato.
  • Opset: Il numero di versione dell’opset indica le funzioni matematiche supportate da ONNX e che una rete neurale può eseguire. Prima di esportare un modello, è importante verificare che l’opset sia compatibile con le funzioni utilizzate nel modello. È importante tenere conto dell’opset quando si lavora con modelli di questo framework, poiché la compatibilità tra le diverse versioni dell’opset e le librerie di runtime ONNX può variare, influendo sulla portabilità dei modelli tra le diverse piattaforme e linguaggi.
  • Training: È possibile effettuare il training di un modello direttamente in ONNX.
  • Ottimizzazione: ONNX offre una serie di ottimizzazioni per migliorare le prestazioni di esecuzione dei modelli, tra cui la parallelizzazione dei calcoli, l’inferenza a precisione ridotta e l’ottimizzazione delle librerie matematiche sottostanti. Questo lo rende una scelta popolare per l’esecuzione efficiente di modelli di machine learning in applicazioni in tempo reale o su dispositivi con risorse limitate.
  • Inferenza: L’inferenza con i modelli di machine learning può essere eseguita direttamente nell’ONNX runtime scelto.

Esempio di utilizzo di ONNX

Per rendere ancor più chiare le potenzialità del formato, prendiamo in considerazione un caso d’uso verosimile.

Un cliente richiede l’implementazione di un modello di machine learning in grado di classificare correttamente se un’immagine sia reale o sia generata tramite AI.

Immagine reale

 

Immagine generata da AI

In questo scenario, si suppone che il framework in cui si è più esperti sia PyTorch di Python, ma il cliente in questione desidera che il modello sia in grado di girare nel browser Web in JavaScript.

Iniziando quindi con l’implementazione di un modello scritto in PyTorch, successivamente è possibile esportarlo in ONNX tramite una breve porzione di codice. Ecco un esempio:

import torch

from classes.Classifier import Classifier


model = Classifier.load_from_checkpoint("model.ckpt")
model.eval()

x = torch.randn(1, 3, 224, 224, requires_grad=True)

torch.onnx.export(model.model,  # model being run
                  x,  # model input (or a tuple for multiple inputs)
                  "model.onnx",  # where to save the model (can be a file or file-like object)
                  export_params=True,  # store the trained parameter weights inside the model file
                  opset_version=10,  # the ONNX version to export the model to
                  do_constant_folding=True,  # whether to execute constant folding for optimization
                  input_names=['input'],  # the model's input names
                  output_names=['output']) # the model's output names

A questo punto passando a JavaScript, dopo aver installato l‘ONNX Runtime Web, è possibile importare il modello in formato ONNX ed eseguire l’inferenza direttamente nel browser.

Di seguito un semplice esempio di codice:

import * as ort from "onnxruntime-web";

// Load the model and create InferenceSession
const modelPath = "path/to/your/onnx/model";
const session = await ort.InferenceSession.create(modelPath);

// Load and preprocess the input image to inputTensor
...

// Run inference
const outputs = await session.run({ input: inputTensor });
console.log(outputs);

Conclusione

L’esempio appena descritto dimostra come sia possibile sviluppare un modello in PyTorch, esportarlo in formato ONNX e utilizzarlo in JavaScript per l’inferenza, consentendo un’interoperabilità senza sforzi tra diversi framework e linguaggi di programmazione.

È possibile affermare che il formato ONNX è diventato a tutti gli effetti uno standard. Esso, infatti, ha acquisito un ruolo cruciale nel mondo del machine learning, offrendo la possibilità di lavorare in modo più flessibile, adattarsi alle esigenze dei clienti e svincolarsi dalla dipendenza da un singolo framework o linguaggio.

Articolo scritto da