Delegati TensorFlow Lite

I Delegati abilitano l'accelerazione hardware dei modelli TensorFlow Lite sfruttando acceleratori on-device come GPU e Processore di segnale digitale (DSP).

Per impostazione predefinita, TensorFlow Lite utilizza i kernel della CPU ottimizzati per il set di istruzioni ARM Neon. Tuttavia, la CPU è un processore multiuso che non è necessariamente ottimizzato per la pesante aritmetica tipica dei modelli di machine learning (ad esempio, i calcoli matematici matriciali coinvolti negli strati densi e convoluzionali).

D'altra parte, la maggior parte dei telefoni cellulari moderni contiene chip che consentono di gestire meglio queste operazioni gravose. Il loro utilizzo per le operazioni di rete neurale offre enormi vantaggi in termini di latenza ed efficienza energetica. Ad esempio, le GPU possono offrire una latenza di velocità fino a 5 volte.

A ognuno di questi acceleratori sono associate API che consentono calcoli personalizzati, come OpenCL o OpenGL ES per GPU mobile. In genere, dovresti scrivere molto codice personalizzato per eseguire una rete neurale attraverso queste interfacce. Le cose si complicano ancora di più se si considera che ciascun acceleratore ha i suoi pro e contro e non può eseguire ogni operazione in una rete neurale. L'API Delega di TensorFlow Lite risolve questo problema agendo da ponte tra il runtime di TFLite e queste API di livello inferiore.

runtime con delegati

Scelta di un delegato

TensorFlow Lite supporta più delegati, ognuno dei quali è ottimizzato per determinate piattaforme e determinati tipi di modelli. Di solito, ci sono più delegati applicabili al tuo caso d'uso, a seconda di due criteri principali: la piattaforma (Android o iOS) che scegli come target e il tipo di modello (a virgola mobile o quantizzato?) che stai tentando di accelerare.

Delegati per piattaforma

Multipiattaforma (Android e iOS)

  • Delega GPU: il delegato GPU può essere utilizzato sia su Android che su iOS. È ottimizzato per eseguire modelli basati su numeri in virgola mobile a 32 e 16 bit in cui è disponibile una GPU. Supporta inoltre modelli quantizzati a 8 bit e offre prestazioni della GPU in linea con le versioni in virgola mobile. Per maggiori dettagli sul delegato per la GPU, consulta TensorFlow Lite su GPU.

iOS

  • Delega Core ML per iPhone e iPad più recenti: per gli iPhone e gli iPad più recenti in cui è disponibile Neural Engine, puoi utilizzare il delegato Core ML per accelerare l'inferenza per i modelli in virgola mobile a 32 o 16 bit. Neural Engine è disponibile per i dispositivi mobili Apple con SoC A12 o superiore. Per una panoramica del delegato Core ML e istruzioni dettagliate, consulta TensorFlow Lite Core ML delegato.

Delegati per tipo di modello

Ogni acceleratore è progettato in base a una determinata larghezza di bit dei dati. Se fornisci a un delegato un modello in virgola mobile che supporta solo le operazioni quantizzate a 8 bit, verranno rifiutate tutte le operazioni e il modello verrà eseguito interamente sulla CPU. Per evitare questo tipo di sorprese, la tabella riportata di seguito fornisce una panoramica del supporto dei delegati in base al tipo di modello:

Tipo di modello GPU CoreML
Virgola mobile (32 bit)
Quantizzazione float16 dopo l'addestramento
Quantizzazione dell'intervallo dinamico dopo l'addestramento No
Quantizzazione dei numeri interi post-addestramento No
Formazione sensibile alla quantizzazione No

Convalida del rendimento in corso...

Le informazioni contenute in questa sezione sono una linea guida approssimativa per selezionare i delegati che potrebbero migliorare l'applicazione. Tuttavia, è importante notare che ogni delegato dispone di un insieme predefinito di operazioni che supporta e potrebbe avere prestazioni diverse a seconda del modello e del dispositivo. Pertanto, in genere è consigliabile eseguire alcuni benchmark per valutare l'utilità di un delegato per le tue esigenze. Ciò consente anche di giustificare l'aumento delle dimensioni binarie associato all'aggiunta di un delegato al runtime TensorFlow Lite.

TensorFlow Lite dispone di numerosi strumenti di valutazione delle prestazioni e dell'accuratezza che possono consentire agli sviluppatori di avere fiducia nell'utilizzo dei delegati nella loro applicazione. Questi strumenti verranno illustrati nella sezione successiva.

Strumenti di valutazione

Latenza e utilizzo di memoria

È possibile utilizzare lo strumento di benchmark di TensorFlow Lite con parametri adatti per stimare le prestazioni del modello, tra cui latenza media di inferenza, overhead di inizializzazione, utilizzo della memoria e così via. Questo strumento supporta più flag per determinare la migliore configurazione dei delegati per il tuo modello. Ad esempio, --gpu_backend=gl può essere specificato con --use_gpu per misurare l'esecuzione della GPU con OpenGL. L'elenco completo dei parametri delegati supportati è definito nella documentazione dettagliata.

Ecco un esempio eseguito per un modello quantizzato con GPU tramite adb:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Puoi scaricare la versione predefinita di questo strumento per Android con architettura ARM a 64 bit qui (altri dettagli).

Accuratezza e correttezza

I delegati di solito eseguono i calcoli con una precisione diversa rispetto alle controparti della CPU. Di conseguenza, esiste un compromesso per l'accuratezza (solitamente basso) associato all'utilizzo di un delegato per l'accelerazione hardware. Tieni presente che questo non è sempre vero; ad esempio, poiché la GPU utilizza una precisione con virgola mobile per eseguire modelli quantizzati, potrebbe esserci un leggero miglioramento della precisione (ad es. <1% di miglioramento dei primi 5 nella classificazione delle immagini ILSVRC).

TensorFlow Lite include due tipi di strumenti per misurare la precisione con cui un delegato si comporta per un determinato modello: basato su attività e indipendente da attività. Tutti gli strumenti descritti in questa sezione supportano i parametri di delega avanzata utilizzati dallo strumento di benchmarking della sezione precedente. Tieni presente che le sottosezioni riportate di seguito sono incentrate sulla valutazione del delegato (il delegato esegue le stesse prestazioni della CPU?) piuttosto che sulla valutazione del modello (il modello è adatto per l'attività?).

Valutazione basata sulle attività

TensorFlow Lite offre strumenti per valutare la correttezza di due attività basate su immagini:

I file binari predefiniti di questi strumenti (Android, architettura ARM a 64 bit) e la documentazione sono disponibili qui:

L'esempio seguente mostra la valutazione della classificazione delle immagini con GPU su Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

L'output previsto è un elenco di metriche Top-K da 1 a 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Valutazione indipendente dall’attività

Per le attività in cui non è disponibile uno strumento di valutazione on-device definito o se si stanno sperimentando modelli personalizzati, TensorFlow Lite dispone dello strumento Diff. Inference. (Android, file binario dell'architettura binaria ARM a 64 bit qui)

Inference Diff confronta l'esecuzione di TensorFlow Lite (in termini di latenza e deviazione del valore di output) in due impostazioni:

  • Inferenza CPU a thread singolo
  • Inferenza definita dall'utente: definita da questi parametri

Per farlo, lo strumento genera dati gaussiani casuali e li passa attraverso due interpreti TFLite: uno che esegue kernel CPU a thread singolo e l'altro parametrizzati in base agli argomenti dell'utente.

Misura la latenza di entrambi, nonché la differenza assoluta tra i tensori di output di ogni interprete, sulla base di ogni singolo elemento.

Per un modello con un singolo tensore di output, l'output potrebbe essere il seguente:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Ciò significa che, per il tensore di output all'indice 0, gli elementi dell'output della CPU sono diversi dall'output delegato per una media di 1.96e-05.

Tieni presente che l'interpretazione di questi numeri richiede una conoscenza più approfondita del modello e del significato di ciascun tensore di output. Se si tratta di una regressione semplice che determina un qualche tipo di punteggio o incorporamento, la differenza dovrebbe essere bassa (altrimenti si tratta di un errore del delegato). Tuttavia, output come la "classe di rilevamento" dei modelli SSD sono un po' più difficili da interpretare. Ad esempio, potrebbe mostrare una differenza utilizzando questo strumento, ma ciò potrebbe non significare qualcosa di davvero sbagliato con il delegato: considera due classi (false): "TV (ID: 10)", "Monitor (ID:20)"