Prestazioni e memoria di Windows ML

Questo articolo illustra come gestire le prestazioni di un'applicazione quando viene usato Windows Machine Learning.

Threading e concorrenza

Ogni oggetto esposto dal runtime è Agile, ovvero è accessibile da qualsiasi thread. Per altre informazioni sugli oggetti Agile, vedi Oggetti Agile in C++/WinRT.

Uno degli oggetti chiave che utilizzerai è LearningModelSession. Questo oggetto può essere chiamato da qualsiasi thread.

  • Per le sessioni GPU: l'oggetto bloccherà e sincronizzerà le chiamate simultanee. Se vuoi ottenere la concorrenza, devi creare più sessioni.

  • Per le sessioni cpu: l'oggetto non verrà bloccato e consentirà chiamate simultanee in una singola sessione. Devi prestare attenzione a gestire lo stato, i buffer e gli oggetti di binding.

Valuta con attenzione il tuo obiettivo per lo specifico scenario. Le architetture moderne basate su GPU funzionano in modo diverso rispetto alle CPU. Se, ad esempio, hai come obiettivo la bassa latenza, potrebbe essere opportuno gestire la pianificazione del lavoro nei motori basati su CPU e GPU usando il pipelining e non la concorrenza. Questo articolo sulla sincronizzazione di più motori offre un ottimo punto da cui iniziare. Se invece hai come obiettivo la velocità effettiva, ad esempio l'elaborazione contemporanea del maggior numero possibile di immagini, è spesso opportuno usare più thread e la concorrenza per saturare la CPU.

Quando si tratta di threading e concorrenza, è importante eseguire esperimenti e misurare i tempi. Le prestazioni variano in modo significativo a seconda dei tuoi obiettivi e dello scenario.

Utilizzo memoria

Ogni istanza di LearningModel e LearningModelSession contiene una copia del modello in memoria. Se usi modelli di piccole dimensioni, questo aspetto può essere ininfluente, ma con modelli di dimensioni estese questo aspetto diventa importante.

Per liberare memoria, chiama Dispose sul modello o sulla sessione. Non eseguire solo l'eliminazione, perché alcuni linguaggi eseguono operazioni differite di Garbage Collection.

LearningModel conserva una copia in memoria per consentire la creazione di una nuova sessione. Quando elimini l'oggetto LearningModel, tutte le sessioni esistenti continueranno a funzionare. Tuttavia, non potrai più creare nuove sessioni con questa istanza di LearningModel. Per i modelli di grandi dimensioni, puoi creare un modello e una sessione e quindi eliminare il modello. Usando una singola sessione per tutte le chiamate a Evaluate, manterrai una sola copia del modello di grandi dimensioni in memoria.

Supporto di float16

Per ottenere prestazioni migliori e ridurre il footprint del modello, è possibile usare ONNXMLTools per convertire il modello in float16.

Dopo la conversione, tutti i pesi e gli input diventano float16. Ecco come è possibile usare gli input e gli output float16:

  • ImageFeatureValue

    • Utilizzo consigliato.
    • Converte i colori ed esegue la tensorizzazione in float16.
    • Supporta i formati di immagine bgr8 e a 8 bit, che possono essere convertiti in modo sicuro in float16 senza perdita di dati.
  • TensorFloat

    • Percorso avanzato.
    • Cast di float32 in float16.
    • Per le immagini, puoi eseguire il cast in modo sicuro perché bgr8 è di piccole dimensioni e si adatta.
    • Per gli oggetti diversi dalle immagini, Bind avrà esito negativo e dovrai passare invece TensorFloat16Bit.
  • TensorFloat16Bit

    • Percorso avanzato.
    • Devi eseguire la conversione in float16 e passare gli input come float32, che verranno sottoposti a cast in float16.

Nota

Nella maggior parte dei casi, l'operatore esegue comunque un calcolo matematico a 32 bit. Il rischio di overflow è inferiore e il risultato viene troncato in float16. Se tuttavia l'hardware dichiara di supportare float16, il runtime ne approfitterà.

Pre-elaborazione dei dati di input

WinML esegue alcuni passaggi di pre-elaborazione per rendere più semplice ed efficiente l'elaborazione dei dati di input. È ad esempio possibile che le immagini di input abbiano diversi formati di colore e forme e non corrispondano a quanto previsto dal modello. WinML esegue operazioni di conversione sulle immagini in modo da renderle compatibili, riducendo così il carico per lo sviluppatore.

WinML sfrutta anche l'intero stack hardware (CPU, GPU e così via) per fornire le conversioni più efficienti per un dispositivo e uno scenario specifici.

In alcuni casi tuttavia potrebbe essere necessario eseguire la tensorizzazione manuale dei dati di input a causa di alcuni requisiti specifici. Potresti ad esempio non voler usare VideoFrame per le immagini o scegliere di normalizzare i valori dei pixel compresi dall'intervallo 0-255 all'intervallo 0-1. In questi casi, puoi eseguire una tensorizzazione personalizzata sui dati. Per un esempio di come eseguire questa operazione, vedi l'esempio di tensorizzazione personalizzata.

Nota

Per informazioni su Windows Machine Learning, usa le risorse seguenti:

  • Per porre domande tecniche o rispondere a domande tecniche su Windows Machine Learning, usa il tag windows-machine-learning in Stack Overflow.
  • Per segnalare un bug, registra il problema in GitHub.