Condividi tramite


ONNX e Azure Machine Learning

Informazioni su come l'uso di Open Neural Network Exchange (ONNX) consenta di ottimizzare l'inferenza del modello di Machine Learning. Inferenza o modello di assegnazione dei punteggi, è 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 l'ottimizzazione del modello e della libreria di inferenza per sfruttare al meglio le funzionalità hardware. Questa attività diventa complessa se si vogliono ottenere prestazioni ottimali su diversi tipi di piattaforme, ad esempio, cloud o edge, CPU o GPU e così via, poiché ogni piattaforma presenta funzionalità e caratteristiche diverse. La complessità aumenta se si hanno modelli di vari framework che devono essere eseguiti su piattaforme diverse. Ottimizzare tutte le diverse combinazioni di framework e hardware può essere dispendioso in termini di tempo. Pertanto, una soluzione utile consiste nell'eseguire il training del modello una volta nel framework preferito e quindi eseguirlo ovunque nel cloud o nell'edge: in questa soluzione viene fornito ONNX.

Cos'è ONNX?

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 e MATLAB, possono essere esportati o convertiti nel formato ONNX standard. Quando i modelli sono nel formato ONNX, possono essere eseguiti in varie piattaforme e dispositivi.

ONNX Runtime è un motore di inferenza ad alte prestazioni per la distribuzione di modelli ONNX nell'ambiente di produzione. È ottimizzato per cloud e edge e funziona in Linux, Windows e Mac. Nonostante ONNX sia scritto in C++, include anche API C, Python, C#, Java e JavaScript (Node.js) per l'uso in diversi 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 dalle ampie ottimizzazioni a livello di produzione, dai test e dai miglioramenti continui.

ONNX Runtime viene usato in servizi Microsoft su larga scala, ad esempio Bing, Office e Azure per intelligenza artificiale. Anche se i miglioramenti delle prestazioni dipendono da molti fattori, questi servizi Microsoft riportano un miglioramento medio di 2 volte sulle prestazioni della CPU. Oltre ai servizi di Azure Machine Learning, ONNX Runtime viene eseguito anche in altri prodotti che supportano carichi di lavoro di Machine Learning, tra cui:

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

Come 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 relativo a un modello che non può essere convertito correttamente,inserire un problema su GitHub nel repository del convertitore usato. È possibile continuare a usare il formato di modello esistente fino a quando il problema non viene risolto.

Distribuzione del modello ONNX in Azure

Con Azure Machine Learning, è possibile distribuire, gestire e monitorare i propri modelli ONNX. Usando il flusso di lavoro di distribuzione MLOps standard e ONNX Runtime, è possibile creare un endpoint REST ospitato nel cloud. Per esempi pratici, vedere questi notebook di Jupyter.

Installazione e uso di ONNX Runtime con Python

I pacchetti Python per ONNX Runtime sono disponibili in PyPi.org (CPU e GPU). Rivedere 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 come segue:

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

Per eseguire l'inferenza sul modello, usare run e inviare l'elenco di output 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.

Esempi

Per altre informazioni su ONNX o per contribuire al progetto:

Per altre informazioni su ONNX Runtime o per contribuire al progetto: