Condividi tramite


Prestazioni e memoria di Windows ML

In questo articolo verrà illustrato come gestire le prestazioni dell'applicazione quando si usa Windows Machine Learning.

Threading e concorrenza

Ogni oggetto esposto dal runtime è agile, ovvero è possibile accedervi da qualsiasi thread. Per altre informazioni su Agile, vedi Oggetti Agile in C++/WinRT .

Un oggetto chiave con cui si lavorerà è LearningModelSession. Questo oggetto è sempre sicuro da chiamare da qualsiasi thread.

  • Per le sessioni GPU: l'oggetto bloccherà e sincronizzerà le chiamate simultanee. Se è necessaria la concorrenza, è necessario creare più sessioni per ottenerla.

  • Per le sessioni cpu: l'oggetto non verrà bloccato e consentirà chiamate simultanee in una singola sessione. È necessario occuparsi della gestione del proprio stato, dei propri buffer e dei propri oggetti di associazione.

È consigliabile prestare attenzione e valutare il tuo obiettivo in relazione al tuo scenario. Le architetture GPU moderne funzionano in modo diverso rispetto alle CPU. Ad esempio, se la bassa latenza è l'obiettivo che si potrebbe voler gestire il modo in cui si pianifica il lavoro tra i motori CPU e GPU usando pipelining, non la concorrenza. Questo articolo sulla sincronizzazione multi-motore è un ottimo posto per iniziare. Se la velocità effettiva è l'obiettivo ,ad esempio l'elaborazione del maggior numero possibile di immagini, è spesso necessario usare più thread e concorrenza per saturare la CPU.

Quando si tratta di threading e concorrenza, è importante eseguire esperimenti e misurare i tempi. Le prestazioni cambieranno in modo significativo in base agli obiettivi e agli scenari.

Utilizzo memoria

Ogni istanza di LearningModel e LearningModelSession include una copia del modello in memoria. Se si lavora con modelli di piccole dimensioni, potrebbe non essere necessario preoccuparsi, ma se si lavora con modelli molto grandi, questo diventa importante.

Per rilasciare la memoria, chiamare Dispose nel modello o nella sessione. Non eliminarli, perché alcuni linguaggi eseguono garbage collection pigra.

LearningModel mantiene una copia in memoria per abilitare la creazione di una nuova sessione. Quando si elimina LearningModel, tutte le sessioni esistenti continueranno a funzionare. Tuttavia, non sarà più possibile creare nuove sessioni con tale istanza di LearningModel . Per i modelli di grandi dimensioni, è possibile creare un modello e una sessione e quindi eliminare il modello. Usando una singola sessione per tutte le chiamate a Evaluate, si avrà una singola copia del modello di grandi dimensioni in memoria.

Supporto per il formato 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 sono float16. Ecco come è possibile usare input e output float16:

  • Valore ImageFeatureValue

    • Utilizzo consigliato.
    • Converte i colori e i tensorizzazioni 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.
    • Float32 viene convertito in float16.
    • Per le immagini, è sicuro effettuare il casting, in quanto bgr8 è piccolo e si adatta bene.
    • Per i non-immagini, Bind fallirà e sarà necessario passare un TensorFloat16Bit.
  • TensorFloat16Bit

    • Percorso avanzato.
    • È necessario convertire in float16 e passare gli input come float32, che verranno convertiti in float16.

Annotazioni

Nella maggior parte dei casi, l'operatore sta ancora eseguendo calcoli matematici a 32 bit. C'è meno rischio di overflow e il risultato viene troncato a float16. Tuttavia, se l'hardware annuncia il supporto float16, il runtime ne trarrà vantaggio.

Pre-elaborazione dei dati di ingresso

WinML esegue alcuni passaggi di pre-elaborazione sotto le quinte per rendere più semplice ed efficiente l'elaborazione dei dati di input. Ad esempio, le immagini di input specificate potrebbero trovarsi in diversi formati di colore e forme e potrebbero essere diverse da quelle previste dal modello. WinML esegue conversioni sulle immagini in modo che corrispondano, riducendo il carico sullo sviluppatore.

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

Tuttavia, in alcuni casi può essere necessario tensorizzare manualmente i dati di input a causa di alcuni requisiti specifici. Ad esempio, forse non vuoi usare VideoFrame per le immagini o vuoi normalizzare i valori dei pixel dall'intervallo 0-255 all'intervallo da 0 a 1. In questi casi, è possibile eseguire una tensorizzazione personalizzata sui dati. Per un esempio, vedere Custom Tensorization Sample (Esempio di tensorizzazione personalizzata ).

Annotazioni

Usare le risorse seguenti per assistenza con Windows ML:

  • Per porre o rispondere a domande tecniche su Windows ML, usare il tag windows-machine learning in Stack Overflow.
  • Per segnalare un bug, apri un ticket nel GitHub.