Delegati LiteRT

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

Per impostazione predefinita, LiteRT utilizza i kernel della CPU ottimizzati per il controllo ARM Neon un set di istruzioni. Tuttavia, la CPU è un processore multiuso che non è necessariamente ottimizzato per i calcoli aritmetici spesso presenti in Machine Modelli di apprendimento (ad esempio, i calcoli matematici matriciali delle convoluzioni e dense strati).

D'altra parte, la maggior parte dei telefoni cellulari moderni contiene chip che sono migliori in per gestire queste gravose operazioni. Utilizzo per operazioni di rete neurale offre enormi vantaggi in termini di latenza ed efficienza energetica. Ad esempio: Le GPU possono fornire fino a 5 volte velocizza in termini di latenza.

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

runtime con delegati

Scelta di un delegato

LiteRT supporta più delegati, ognuno dei quali è ottimizzato alcune piattaforme e particolari tipi di modelli. Di solito, c'è più delegati applicabili al tuo caso d'uso, in base a due criteri principali: la Piattaforma (Android o iOS?) scelta come target e il Tipo di modello (a virgola mobile o quantizzazione?) 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. it è ottimizzato per eseguire modelli basati su numeri in virgola mobile a 32 e 16 bit in cui una GPU disponibili. Supporta anche modelli quantizzati a 8 bit e fornisce GPU un rendimento in linea con quello delle versioni in virgola mobile. Per maggiori dettagli sulla GPU delegato, consulta LiteRT su GPU.

iOS

  • Delegare Core ML per i nuovi iPhone e iPad: per gli iPhone e gli iPad più recenti Per gli iPad in cui è disponibile Neural Engine, puoi usare il delegato Core ML per accelerare l'inferenza per i modelli a 32-bit o 16-bit in virgola mobile. Neural Engine è disponibile per i dispositivi mobili Apple con SoC A12 o superiore. Per un Panoramica del delegato Core ML e istruzioni dettagliate, vedi Delegato LiteRT Core ML.

Delegati per tipo di modello

Ogni acceleratore è progettato in base a una determinata larghezza di bit dei dati. Se fornisce a un delegato un modello in virgola mobile che supporta solo la tecnologia quantizzata a 8 bit operazioni, rifiuterà tutte le operazioni e il modello verrà eseguito interamente per la CPU. Per evitare questo tipo di sorprese, la tabella seguente fornisce una panoramica delegare il supporto 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 fungono da guida approssimativa per selezionare che potrebbero migliorare la tua applicazione. Tuttavia, è importante notare che che ogni delegato dispone di un insieme predefinito di operazioni che supporta e funzionano in modo diverso a seconda del modello e del dispositivo. Pertanto, di solito consigliato di eseguire analisi comparative per valutare l'utilità di un delegato in base alle tue esigenze. Ciò aiuta anche a giustificare l'aumento delle dimensioni binarie associato il collegamento di un delegato al runtime LiteRT.

LiteRT dispone di numerosi strumenti di valutazione delle prestazioni e della precisione che può consentire agli sviluppatori di avere la certezza di utilizzare i delegati nella propria applicazione. Questi strumenti verranno illustrati nella sezione successiva.

Strumenti di valutazione

Latenza e spazio di memoria

Lo strumento benchmark di LiteRT può essere utilizzato parametri adatti per stimare le prestazioni del modello, compresa l'inferenza media latenza, 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. Per Nell'istanza, puoi specificare --gpu_backend=gl con --use_gpu per misurare la GPU con OpenGL. L'elenco completo dei parametri delegati supportati è definita nel dettagliato documentazione.

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 una versione predefinita di questo strumento per Android (ARM a 64 bit) architettura qui (altro dettagli del prodotto).

Accuratezza e correttezza

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

LiteRT offre 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 la delega avanzata parametri utilizzata dallo strumento di benchmarking nella sezione precedente. Tieni presente che Le sottosezioni riportate di seguito sono incentrate sulla valutazione del delegato (il delegato esegue la la stessa della CPU?) anziché la valutazione del modello (il modello in sé è adatto attività?).

Valutazione basata sulle attività

LiteRT 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 documentazione disponibile qui:

L'esempio seguente mostra la classificazione delle immagini valutazione 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à per cui non è disponibile uno strumento di valutazione on-device o se stanno sperimentando modelli personalizzati, LiteRT ha l'Inferenza Differenza lo strumento a riga di comando gcloud. (Android, architettura binaria ARM a 64 bit qui).

Inference Diff confronta l'esecuzione LiteRT (in termini di latenza 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 trasmette interpreti TFLite: uno che esegue kernel con CPU a thread singolo e l'altro parametrizzata in base agli argomenti dell'utente.

Misura la latenza di entrambi, oltre alla differenza assoluta tra i due tensori di output di ogni interprete, per 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 da l'output della CPU è diverso 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 il significato di ogni 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 errore con il delegato). Tuttavia, output come "classe di rilevamento" uno da I modelli SSD sono un po' più difficili da interpretare. Ad esempio, potrebbe mostrare una differenza rispetto all'uso di questo strumento, ma ciò potrebbe non significare qualcosa di veramente sbagliato il delegato: prendi in considerazione due classi (false): "TV (ID: 10)", "Monitor (ID:20)" - Se un delegato è un po' fuori dalla verità e mostra il monitor anziché la TV, diff di output per questo tensore potrebbe essere qualcosa di alto come 20-10 = 10.