ONNX e Azure Machine Learning

Questo articolo descrive in che modo Open Neural Network Exchange (ONNX) consente di ottimizzare l'inferenza dei modelli di Machine Learning. L'inferenza o l'assegnazione dei punteggi del modello è il processo di utilizzo di un modello distribuito per generare stime sui dati di produzione.

L'ottimizzazione dei modelli di Machine Learning per l'inferenza richiede di ottimizzare il modello e la libreria di inferenza per sfruttare al meglio le funzionalità hardware. Questa attività diventa complessa se si vogliono ottenere prestazioni ottimali su piattaforme diverse, ad esempio cloud, edge, CPU o GPU, perché ogni piattaforma ha funzionalità e caratteristiche diverse. La complessità aumenta se è necessario eseguire modelli da diversi framework su piattaforme diverse. Ottimizzare tutte le diverse combinazioni di framework e hardware può essere dispendioso in termini di tempo.

Una soluzione utile consiste nel eseguire il training del modello una volta nel framework preferito e quindi esportarlo o convertirlo in ONNX in modo che possa essere eseguito ovunque nel cloud o nel perimetro. Microsoft e una community di partner hanno creato ONNX come standard aperto per rappresentare i modelli di Machine Learning. È possibile esportare o convertire modelli da molti framework al formato ONNX standard. I framework supportati includono TensorFlow, PyTorch, scikit-learn, Keras, Chainer, MXNet e MATLAB. È possibile eseguire modelli nel formato ONNX in varie piattaforme e dispositivi.

Questo diagramma di flusso ONNX mostra i framework e le opzioni di distribuzione disponibili.

Diagramma di flusso ONNX che mostra la formazione, i convertitori e la distribuzione.

Runtime ONNX

ONNX Runtime è un motore di inferenza ad alte prestazioni per la distribuzione di modelli ONNX nell'ambiente di produzione. ONNX Runtime è ottimizzato per cloud e edge e funziona in Linux, Windows e macOS. ONNX è scritto in C++, ma include anche API C, Python, C#, Java e JavaScript (Node.js) da usare in tali ambienti.

ONNX Runtime supporta modelli DNN e ML tradizionali e si integra con gli acceleratori su hardware diverso, ad esempio TensorRT in GPU NVidia, OpenVINO in processori Intel e DirectML in Windows. Usando ONNX Runtime, è possibile trarre vantaggio da ampie ottimizzazioni, test e miglioramenti continui di livello di produzione.

Le servizi Microsoft su larga scala, ad esempio Bing, Office e Azure ai, usano ONNX Runtime. Anche se i miglioramenti delle prestazioni dipendono da molti fattori, questi servizi Microsoft segnalano un miglioramento medio delle prestazioni 2 volte sulla CPU usando ONNX. Il runtime ONNX viene eseguito in Azure Machine Learning e in altri prodotti Microsoft che supportano carichi di lavoro di Machine Learning, tra cui:

Modi per ottenere modelli ONNX

È possibile ottenere modelli ONNX in diversi modi:

È possibile rappresentare molti modelli come ONNX, tra cui la classificazione delle immagini, il rilevamento degli oggetti e i modelli di elaborazione del testo. Se non è possibile convertire correttamente il modello, segnalare un problema di GitHub nel repository del convertitore usato.

Distribuzione del modello ONNX in Azure

È possibile distribuire, gestire e monitorare i modelli ONNX in Azure Machine Learning. Usando un flusso di lavoro di distribuzione MLOps standard con ONNX Runtime, è possibile creare un endpoint REST ospitato nel cloud.

Pacchetti Python per ONNX Runtime

I pacchetti Python per CPU e RUNTIME ONNX GPU sono disponibili in PyPi.org. Assicurarsi di esaminare 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 Python, usare il codice seguente:

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.

ONNX Runtime consente di eseguire query sui metadati, gli input e gli output del modello, come indicato di seguito:

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

Per eseguire l'inferenza nel modello, usare run e passare l'elenco di output che si desidera restituire e una mappa dei valori di input. Lasciare vuoto l'elenco di output se si desidera che tutti gli output. 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 runtime ONNX, vedere la documentazione dell'API Python.