I dispositivi periferici spesso hanno memoria o potenza di calcolo limitata. Possono essere applicate varie ottimizzazioni ai modelli in modo da poterli eseguire all'interno di questi vincoli. Inoltre, alcune ottimizzazioni consentono l'uso di hardware specializzato per l'inferenza accelerata.
TensorFlow Lite e il Toolkit per l'ottimizzazione dei modelli TensorFlow forniscono strumenti per ridurre al minimo la complessità nell'ottimizzazione dell'inferenza.
Ti consigliamo di prendere in considerazione l'ottimizzazione del modello durante il processo di sviluppo dell'applicazione. Questo documento descrive alcune best practice per ottimizzare i modelli TensorFlow per il deployment su hardware periferico.
Perché i modelli dovrebbero essere ottimizzati
L'ottimizzazione del modello può essere utile in vari modi per sviluppare le applicazioni.
Riduzione delle dimensioni
Alcune forme di ottimizzazione possono essere utilizzate per ridurre le dimensioni di un modello. I modelli più piccoli offrono i seguenti vantaggi:
- Dimensioni dello spazio di archiviazione ridotte: i modelli più piccoli occupano meno spazio di archiviazione sui dispositivi degli utenti. Ad esempio, un'app per Android che utilizza un modello più piccolo occuperà meno spazio di archiviazione sul dispositivo mobile dell'utente.
- Dimensioni di download ridotte: i modelli più piccoli richiedono meno tempo e larghezza di banda per il download sui dispositivi degli utenti.
- Utilizzo ridotto della memoria:i modelli più piccoli utilizzano meno RAM quando vengono eseguiti, liberando memoria da usare per altre parti dell'applicazione e possono tradursi per prestazioni e stabilità migliori.
La quantizzazione può ridurre le dimensioni di un modello in tutti questi casi, a scapito potenzialmente di una certa accuratezza. Le operazioni di potatura e clustering possono ridurre le dimensioni di un modello per il download, rendendolo più facilmente comprimibile.
Riduzione della latenza
La latenza è il tempo necessario per eseguire una singola inferenza con un determinato modello. Alcune forme di ottimizzazione possono ridurre la quantità di calcolo richiesta per eseguire l'inferenza utilizzando un modello, con conseguente riduzione della latenza. La latenza può anche avere un impatto sul consumo energetico.
Attualmente, la quantizzazione può essere utilizzata per ridurre la latenza semplificando i calcoli che si verificano durante l'inferenza, potenzialmente a scapito di una certa precisione.
Compatibilità con acceleratori
Alcuni acceleratori hardware, come TPU Edge, possono eseguire l'inferenza in modo estremamente veloce con modelli ottimizzati correttamente.
In genere, questi tipi di dispositivi richiedono di quantificare i modelli in un modo specifico. Consulta la documentazione di ciascun acceleratore hardware per saperne di più sui requisiti.
Compromissioni
Le ottimizzazioni possono causare variazioni nell'accuratezza del modello, che devono essere considerate durante il processo di sviluppo dell'applicazione.
Le modifiche all'accuratezza dipendono dall'ottimizzazione del singolo modello e sono difficili da prevedere in anticipo. In genere, i modelli ottimizzati per dimensioni o latenza perdono una piccola quantità di accuratezza. A seconda dell'applicazione, questo potrebbe influire o meno sull'esperienza degli utenti. In rari casi, determinati modelli possono ottenere una certa precisione come risultato del processo di ottimizzazione.
Tipi di ottimizzazione
TensorFlow Lite al momento supporta l'ottimizzazione tramite quantizzazione, eliminazione e clustering.
Questi strumenti fanno parte del Toolkit per l'ottimizzazione dei modelli TensorFlow, che fornisce risorse per le tecniche di ottimizzazione dei modelli compatibili con TensorFlow Lite.
Quantizzazione
La Quantizzazione funziona riducendo la precisione dei numeri utilizzati per rappresentare i parametri di un modello, che per impostazione predefinita sono numeri in virgola mobile a 32 bit. Ciò si traduce in una dimensione del modello più piccola e un calcolo più rapido.
In TensorFlow Lite sono disponibili i seguenti tipi di quantizzazione:
Tecnica | Requisiti relativi ai dati | Riduzione delle dimensioni | Accuratezza | Hardware supportato |
---|---|---|---|---|
Quantizzazione float16 dopo l'addestramento | Nessun dato | Fino al 50% | Perdita di precisione non significativa | CPU, GPU |
Quantizzazione dell'intervallo dinamico dopo l'addestramento | Nessun dato | Fino al 75% | Minore perdita di accuratezza | CPU, GPU (Android) |
Quantizzazione dei numeri interi dopo l'addestramento | Esempio rappresentativo senza etichetta | Fino al 75% | Perdita di precisione ridotta | CPU, GPU (Android), EdgeTPU |
Formazione sensibile alla quantizzazione | Dati di addestramento etichettati | Fino al 75% | Minore perdita di accuratezza | CPU, GPU (Android), EdgeTPU |
Il seguente albero decisionale ti consente di selezionare gli schemi di quantizzazione che potresti usare per il tuo modello, semplicemente in base alle dimensioni e alla precisione del modello previste.
Di seguito sono riportati i risultati di latenza e accuratezza per l'addestramento post-addestramento basato sulla quantizzazione su alcuni modelli. Tutti i valori di latenza vengono misurati sui dispositivi Pixel 2 utilizzando un'unica CPU big core. Man mano che il toolkit migliora, lo saranno anche le cifre:
Modello | Accuratezza top-1 (originale) | Accuratezza principale (quantizzati dopo l'addestramento) | Accuratezza principale (formazione orientata alla quantizzazione) | Latenza (originale) (ms) | Latenza (quantizzata dopo l'addestramento) (ms) | Latenza (addestramento basato sulla quantizzazione) (ms) | Dimensioni (originale) (MB) | Dimensioni (ottimizzate) (MB) |
---|---|---|---|---|---|---|---|---|
Mobilenet-v1-1-224 | 0,709 | 0,657 | 0,70 | 124 | 112 | 64 | 16,9 | 4.3 |
Mobilenet-v2-1-224 | 0,719 | 0,637 | 0,709 | 89 | 98 | 54 | 14 | 3.6 |
Inception_v3 | 0,78 | 0,772 | 0,775 | 1130 | 845 | 543 | 36,4 | 23,9 |
Resnet_v2_101 | 0,770 | 0,768 | N/A | 3973 | 2868 | N/A | 178,3 | 44,9 |
Quantizzazione dei numeri interi con attivazioni int16 e pesi int8
La quantizzazione con attivazioni int16 è uno schema di quantizzazione di numeri interi completi con attivazioni in int16 e ponderazioni in int8. Questa modalità può migliorare l'accuratezza del modello quantizzato rispetto allo schema di quantizzazione dei numeri interi completi, con attivazioni e ponderazioni in int8, mantenendo le dimensioni del modello simili. È consigliata quando le attivazioni sono sensibili alla quantizzazione.
NOTA: attualmente solo le implementazioni del kernel di riferimento non ottimizzate sono disponibili in TFLite per questo schema di quantizzazione, quindi per impostazione predefinita le prestazioni saranno lente rispetto ai kernel int8. Attualmente, è possibile accedere a tutti i vantaggi di questa modalità tramite hardware specializzato o software personalizzato.
Di seguito sono riportati i risultati relativi all'accuratezza per alcuni modelli che beneficiano di questa modalità.
Modello | Tipo di metrica di accuratezza | Precisione (attivazioni di float32) | Precisione (attivazioni in8) | Accuratezza (attivazioni di in16) |
---|---|---|---|---|
Wav2letter | WER | 6,7% | 7,7% | 7,2% |
DeepSpeech 0.5.1 (srotolato) | CER | 6,13% | 43,67% | 6,52% |
YoloV3 | mAP(IOU=0,5) | 0,577 | 0,563 | 0,574 |
MobileNetV1 | Accuratezza principale | 0,7062 | 0,694 | 0,6936 |
MobileNetV2 | Accuratezza principale | 0,718 | 0,7126 | 0,7137 |
MobileBert | F1(Corrispondenza esatta) | 88,81(81,23) | 2,08(0) | 88,73(81,15) |
Potatura
L'eliminazione consente di rimuovere i parametri all'interno di un modello che hanno un impatto minimo sulle sue previsioni. I modelli eliminati hanno le stesse dimensioni su disco e la stessa latenza di runtime, ma possono essere compressi in modo più efficace. Questo rende l'eliminazione una tecnica utile per ridurre le dimensioni di download del modello.
In futuro, TensorFlow Lite offrirà una riduzione della latenza per i modelli eliminati.
Clustering
Il clustering funziona raggruppando le ponderazioni di ogni livello di un modello in un numero predefinito di cluster, quindi condividendo i valori baridi per le ponderazioni appartenenti a ogni singolo cluster. Questo riduce il numero di valori di ponderazione univoci in un modello, riducendo così la sua complessità.
Di conseguenza, i modelli in cluster possono essere compressi in modo più efficace, fornendo vantaggi per il deployment simili all'eliminazione.
Flusso di lavoro di sviluppo
Come punto di partenza, verifica se i modelli nei modelli ospitati possono funzionare per la tua applicazione. In caso contrario, consigliamo agli utenti di iniziare con lo strumento di quantizzazione post-addestramento, dato che è applicabile su larga scala e non richiede dati di addestramento.
Per i casi in cui non vengono soddisfatti gli obiettivi di accuratezza e latenza o in cui è importante il supporto di un acceleratore hardware, l'addestramento basato sulla quantizzazione è l'opzione migliore. Scopri altre tecniche di ottimizzazione nel Toolkit per l'ottimizzazione dei modelli TensorFlow.
Se vuoi ridurre ulteriormente le dimensioni dei modelli, puoi provare a eliminare e/o eseguire il clustering prima di quantificarli.