I dispositivi edge hanno spesso memoria o potenza di calcolo limitate. Varie ottimizzazioni possono essere applicate ai modelli in modo che possano essere eseguiti entro questi vincoli. Inoltre, alcune ottimizzazioni consentono l'uso di hardware specializzato per l'inferenza accelerata.
TensorFlow Lite e TensorFlow Model Optimization Toolkit forniscono strumenti per ridurre al minimo la complessità dell'ottimizzazione dell'inferenza.
Si consiglia di considerare l'ottimizzazione del modello durante il processo di sviluppo dell'applicazione. Questo documento delinea alcune best practice per l'ottimizzazione dei modelli TensorFlow per la distribuzione su hardware edge.
Perché i modelli dovrebbero essere ottimizzati
Esistono diversi modi principali in cui l'ottimizzazione del modello può aiutare con lo sviluppo di applicazioni.
Riduzione delle dimensioni
Alcune forme di ottimizzazione possono essere utilizzate per ridurre le dimensioni di un modello. I modelli più piccoli hanno i seguenti vantaggi:
- Dimensioni di archiviazione ridotte: i modelli più piccoli occupano meno spazio di archiviazione sui dispositivi degli utenti. Ad esempio, un'app Android che utilizza un modello più piccolo occuperà meno spazio di archiviazione sul dispositivo mobile di un utente.
- Dimensioni di download ridotte: i modelli più piccoli richiedono meno tempo e larghezza di banda per il download sui dispositivi degli utenti.
- Minore utilizzo della memoria: i modelli più piccoli utilizzano meno RAM durante l'esecuzione, il che libera memoria per l'utilizzo da parte di altre parti dell'applicazione e può tradursi in prestazioni e stabilità migliori.
La quantizzazione può ridurre le dimensioni di un modello in tutti questi casi, potenzialmente a scapito di una certa precisione. L'eliminazione e il raggruppamento possono ridurre le dimensioni di un modello da scaricare rendendolo più facilmente comprimibile.
Riduzione della latenza
La latenza è la quantità di tempo necessaria 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 minore 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 acceleratore
Alcuni acceleratori hardware, come Edge TPU , possono eseguire l'inferenza in modo estremamente veloce con modelli che sono stati ottimizzati correttamente.
In genere, questi tipi di dispositivi richiedono che i modelli siano quantizzati in un modo specifico. Consulta la documentazione di ciascun acceleratore hardware per ulteriori informazioni sui requisiti.
Compromessi
Le ottimizzazioni possono potenzialmente comportare modifiche nell'accuratezza del modello, che devono essere considerate durante il processo di sviluppo dell'applicazione.
Le modifiche alla precisione 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 precisione. A seconda dell'applicazione, ciò potrebbe influire o meno sull'esperienza degli utenti. In rari casi, alcuni modelli possono acquisire una certa precisione come risultato del processo di ottimizzazione.
Tipi di ottimizzazione
TensorFlow Lite attualmente supporta l'ottimizzazione tramite quantizzazione, potatura e clustering.
Questi fanno parte del TensorFlow Model Optimization Toolkit , che fornisce risorse per le tecniche di ottimizzazione del modello 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ù veloce.
In TensorFlow Lite sono disponibili i seguenti tipi di quantizzazione:
Tecnica | Requisiti dei dati | Riduzione delle dimensioni | Precisione | Hardware supportato |
---|---|---|---|---|
Quantizzazione float16 post-allenamento | Nessun dato | Fino a 50% | Perdita di precisione insignificante | CPU, GPU |
Quantizzazione della gamma dinamica post-allenamento | Nessun dato | Fino al 75% | Perdita di precisione minima | CPU, GPU (Android) |
Quantizzazione di interi post-allenamento | Campione rappresentativo senza etichetta | Fino al 75% | Piccola perdita di precisione | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
Formazione consapevole della quantizzazione | Dati di allenamento etichettati | Fino al 75% | Perdita di precisione minima | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
Il seguente albero decisionale ti aiuta a selezionare gli schemi di quantizzazione che potresti voler utilizzare per il tuo modello, semplicemente in base alla dimensione e alla precisione del modello previste.
Di seguito sono riportati i risultati di latenza e accuratezza per la quantizzazione post-allenamento e l'allenamento consapevole della quantizzazione su alcuni modelli. Tutti i numeri di latenza vengono misurati sui dispositivi Pixel 2 utilizzando un'unica grande CPU core. Man mano che il toolkit migliora, anche i numeri qui:
Modello | Precisione top-1 (originale) | Precisione Top-1 (quantizzato dopo l'allenamento) | Precisione Top-1 (formazione basata sulla quantizzazione) | Latenza (originale) (ms) | Latenza (quantizzata dopo l'allenamento) (ms) | Latenza (formazione basata 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 |
Inizio_v3 | 0,78 | 0,772 | 0,775 | 1130 | 845 | 543 | 95.7 | 23.9 |
Resnet_v2_101 | 0,770 | 0,768 | N / A | 3973 | 2868 | N / A | 178.3 | 44.9 |
Quantizzazione intera completa con attivazioni int16 e pesi int8
La quantizzazione con attivazioni int16 è uno schema di quantizzazione intero completo con attivazioni in int16 e pesi in int8. Questa modalità può migliorare l'accuratezza del modello quantizzato rispetto allo schema di quantizzazione intero intero con attivazioni e pesi in int8 mantenendo una dimensione del modello simile. È consigliato quando le attivazioni sono sensibili alla quantizzazione.
NOTA: Attualmente in TFLite sono disponibili solo implementazioni del kernel di riferimento non ottimizzate 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 di precisione per alcuni modelli che beneficiano di questa modalità. Modello Tipo metrico di precisione Precisione (attivazioni float32) Precisione (attivazioni int8) Precisione (attivazioni int16) Wav2letter WER 6,7% 7,7% 7,2% DeepSpeech 0.5.1 (srotolato) CER 6,13% 43,67% 6,52% Yolo V3 mappa(IOU=0,5) 0,577 0,563 0,574 MobileNetV1 Precisione tra i primi 1 0,7062 0,694 0,6936 MobileNetV2 Precisione tra i primi 1 0,718 0,7126 0,7137 Mobile Bert F1 (corrispondenza esatta) 88.81(81.23) 2.08(0) 88.73(81.15)
Potatura
La potatura funziona rimuovendo i parametri all'interno di un modello che hanno solo un impatto minore sulle sue previsioni. I modelli eliminati hanno le stesse dimensioni su disco e hanno la stessa latenza di runtime, ma possono essere compressi in modo più efficace. Ciò rende la potatura una tecnica utile per ridurre le dimensioni del download del modello.
In futuro, TensorFlow Lite fornirà una riduzione della latenza per i modelli potati.
Raggruppamento
Il clustering funziona raggruppando i pesi di ogni livello in un modello in un numero predefinito di cluster, quindi condividendo i valori del centroide per i pesi appartenenti a ciascun singolo cluster. Ciò riduce il numero di valori di peso univoci in un modello, riducendone così la complessità.
Di conseguenza, i modelli in cluster possono essere compressi in modo più efficace, offrendo vantaggi di implementazione simili all'eliminazione.
Flusso di lavoro di sviluppo
Come punto di partenza, controlla 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-allenamento poiché è ampiamente applicabile e non richiede dati di addestramento.
Per i casi in cui gli obiettivi di accuratezza e latenza non vengono raggiunti o il supporto dell'acceleratore hardware è importante, l'addestramento basato sulla quantizzazione è l'opzione migliore. Vedere ulteriori tecniche di ottimizzazione nel TensorFlow Model Optimization Toolkit .
Se desideri ridurre ulteriormente le dimensioni del tuo modello, puoi provare a sfoltire e/o raggruppare prima di quantizzare i tuoi modelli.