ONNX e Azure Machine Learning: Creare e accelerare i modelli ML

Informazioni su come usare Open Neural Network Exchange (ONNX) consente di ottimizzare l'inferenza del modello di Machine Learning. L'inferenza o il punteggio del modello è la fase in cui viene usato il modello distribuito per la stima, più comunemente nei dati di produzione.

L'ottimizzazione dei modelli di Machine Learning per l'inferenza (o il punteggio del modello) è difficile perché è necessario ottimizzare il modello e la libreria di inferenza per sfruttare al meglio le funzionalità hardware. Il problema diventa estremamente difficile se si desidera ottenere prestazioni ottimali su diversi tipi di piattaforme (cloud/edge, CPU/GPU e così via), poiché ognuno ha funzionalità e caratteristiche diverse. La complessità aumenta se si dispone di modelli di un'ampia gamma di framework che devono essere eseguiti in diverse piattaforme. È molto difficile ottimizzare tutte le diverse combinazioni di framework e hardware. È necessaria una soluzione per eseguire il training una sola volta nel framework preferito ed eseguire ovunque nel cloud o nel edge. Questo è il luogo in cui ONNX arriva.

Microsoft e una community di partner hanno creato ONNX come standard aperto per rappresentare i modelli di Machine Learning. I modelli di molti framework , tra cui TensorFlow, PyTorch, SciKit-Learn, Keras, Chainer, MXNet, MATLAB e SparkML possono essere esportati o convertiti nel formato ONNX standard. Quando i modelli sono nel formato ONNX, possono essere eseguiti in un'ampia gamma di piattaforme e dispositivi.

ONNX Runtime è un motore di inferenza ad alte prestazioni per la distribuzione di modelli ONNX in produzione. È ottimizzato sia per il cloud che per il edge e funziona in Linux, Windows e Mac. Scritto in C++, include anche API C, Python, C#, Java e JavaScript (Node.js) per l'utilizzo in un'ampia gamma di ambienti. ONNX Runtime supporta sia modelli DNN che tradizionali ML e si integra con acceleratori su hardware diversi, ad esempio TensorRT su GPU NVidia, OpenVINO su processori Intel, DirectML su Windows e altro ancora. Usando ONNX Runtime, è possibile trarre vantaggio dalle estese ottimizzazioni di livello di produzione, test e miglioramenti in corso.

Il runtime ONNX viene usato in servizi Microsoft su larga scala, ad esempio Bing, Office e Servizi cognitivi di Azure. I miglioramenti delle prestazioni dipendono da un numero di fattori, ma questi servizi Microsoft hanno visto un aumento medio delle prestazioni 2x sulla CPU. Oltre ai servizi Azure Machine Learning, ONNX Runtime viene eseguito anche in altri prodotti che supportano carichi di lavoro Machine Learning, tra cui:

ONNX flow diagram showing training, converters, and deployment

Ottenere modelli ONNX

È possibile ottenere modelli ONNX in diversi modi:

Molti modelli, tra cui la classificazione delle immagini, il rilevamento degli oggetti e l'elaborazione del testo possono essere rappresentati come modelli ONNX. Se si verifica un problema con un modello che non può essere convertito correttamente, segnalare un problema nel GitHub del rispettivo convertitore usato. È possibile continuare a usare il modello di formato esistente finché non viene risolto il problema.

Distribuire i modelli ONNX in Azure

Con Azure Machine Learning è possibile distribuire, gestire e monitorare i modelli ONNX. Usando il flusso di lavoro di distribuzione standard e ONNX Runtime, è possibile creare un endpoint REST ospitato nel cloud. Vedere gli esempi di notebook di Jupyter alla fine di questo articolo per provarlo per te stesso.

Installare e usare ONNX Runtime con Python

I pacchetti Python per ONNX Runtime sono disponibili in PyPi.org (CPU, GPU). Leggere i requisiti di sistema prima dell'installazione.

Per installare ONNX Runtime per Python, usare uno dei comandi seguenti:

pip install onnxruntime	      # CPU build
pip install onnxruntime-gpu   # GPU build

Per chiamare ONNX Runtime nello script di Python, usare:

import onnxruntime
session = onnxruntime.InferenceSession("path to model")

La documentazione che accompagna il modello in genere indica gli input e gli output per usare il modello. È anche possibile usare uno strumento di visualizzazione, ad esempio Netron per visualizzare il modello. Runtime ONNX consente inoltre di eseguire query su metadati del modello, input e output:

session.get_modelmeta()
first_input_name = session.get_inputs()[0].name
first_output_name = session.get_outputs()[0].name

Per l'inferenza del modello, usare run e inviare l'elenco di input e output che da restituire (lasciare vuoto se si desiderano tutti gli elementi) e una mappa dei valori di input. Il risultato è un elenco degli output.

results = session.run(["output1", "output2"], {
                      "input1": indata1, "input2": indata2})
results = session.run([], {"input1": indata1, "input2": indata2})

Per informazioni di riferimento complete sull'API di Python, vedere la documentazione di riferimento su ONNX Runtime.

Esempio

Vedere how-to-use-azureml/deployment/onnx , ad esempio notebook Python che creano e distribuiscono modelli ONNX.

Per informazioni su come eseguire i notebook, vedere l'articolo Esplorare Azure Machine Learning con notebook Jupyter.

Gli esempi per l'utilizzo in altri linguaggi sono disponibili nell'GitHub di runtime ONNX.

Altre informazioni

Altre informazioni su ONNX o contribuire al progetto:

Altre informazioni su ONNX Runtime o contribuire al progetto: