L'uso di processori specializzati come GPU, NPU o DSP per l'accelerazione hardware può migliorare notevolmente le prestazioni di inferenza (inferenza fino a 10 volte più veloce in alcuni casi) e l'esperienza utente della tua applicazione Android abilitata per ML. Tuttavia, data la varietà di hardware e driver che i tuoi utenti potrebbero avere, scegliere la configurazione ottimale dell'accelerazione hardware per il dispositivo di ciascun utente può essere difficile. Inoltre, l'abilitazione della configurazione errata su un dispositivo può creare un'esperienza utente scadente a causa dell'elevata latenza o, in alcuni rari casi, errori di runtime o problemi di precisione causati da incompatibilità hardware.
Il servizio di accelerazione per Android è un'API che ti aiuta a scegliere la configurazione ottimale dell'accelerazione hardware per un determinato dispositivo utente e il tuo modello .tflite
, riducendo al minimo il rischio di errori di runtime o problemi di precisione.
Il servizio di accelerazione valuta diverse configurazioni di accelerazione sui dispositivi degli utenti eseguendo benchmark di inferenza interna con il tuo modello TensorFlow Lite. Queste esecuzioni di test in genere vengono completate in pochi secondi, a seconda del modello. È possibile eseguire i benchmark una volta su ogni dispositivo utente prima del tempo di inferenza, memorizzare nella cache il risultato e utilizzarlo durante l'inferenza. Questi benchmark sono esauriti; che riduce al minimo il rischio di arresti anomali della tua app.
Fornisci il tuo modello, campioni di dati e risultati attesi (input e output "golden") e il servizio di accelerazione eseguirà un benchmark di inferenza TFLite interno per fornirti consigli sull'hardware.
Il servizio di accelerazione fa parte dello stack ML personalizzato di Android e funziona con TensorFlow Lite nei servizi Google Play .
Aggiungi le dipendenze al tuo progetto
Aggiungi le seguenti dipendenze al file build.gradle della tua applicazione:
implementation "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"
L'API del servizio di accelerazione funziona con TensorFlow Lite in Google Play Services . Se non stai ancora utilizzando il runtime di TensorFlow Lite fornito tramite Play Services, dovrai aggiornare le tue dipendenze .
Come utilizzare l'API del servizio di accelerazione
Per utilizzare il servizio di accelerazione, inizia creando la configurazione di accelerazione che desideri valutare per il tuo modello (ad es. GPU con OpenGL). Quindi crea una configurazione di convalida con il tuo modello, alcuni dati di esempio e l'output del modello previsto. Infine chiama validateConfig()
passando sia la configurazione di accelerazione che la configurazione di convalida.
Creare configurazioni di accelerazione
Le configurazioni di accelerazione sono rappresentazioni delle configurazioni hardware che vengono tradotte in delegati durante il tempo di esecuzione. Il servizio di accelerazione utilizzerà quindi queste configurazioni internamente per eseguire inferenze di test.
Al momento il servizio di accelerazione consente di valutare le configurazioni della GPU (convertite in delegato GPU durante il tempo di esecuzione) con GpuAccelerationConfig e l'inferenza della CPU (con CpuAccelerationConfig ). Stiamo lavorando per supportare più delegati per l'accesso ad altro hardware in futuro.
Configurazione dell'accelerazione GPU
Crea una configurazione di accelerazione GPU come segue:
AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
.setEnableQuantizedInference(false)
.build();
Devi specificare se il tuo modello utilizza o meno la quantizzazione con setEnableQuantizedInference()
.
Configurazione dell'accelerazione della CPU
Crea l'accelerazione della CPU come segue:
AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
.setNumThreads(2)
.build();
Utilizzare il metodo setNumThreads()
per definire il numero di thread che si desidera utilizzare per valutare l'inferenza della CPU.
Creare configurazioni di convalida
Le configurazioni di convalida consentono di definire come si desidera che il servizio di accelerazione valuti le inferenze. Li userai per passare:
- campioni di input,
- uscite attese,
- logica di convalida dell'accuratezza.
Assicurati di fornire campioni di input per i quali ti aspetti una buona prestazione del tuo modello (noti anche come campioni "d'oro").
Crea un ValidationConfig
con CustomValidationConfig.Builder
come segue:
ValidationConfig validationConfig = new CustomValidationConfig.Builder()
.setBatchSize(5)
.setGoldenInputs(inputs)
.setGoldenOutputs(outputBuffer)
.setAccuracyValidator(new MyCustomAccuracyValidator())
.build();
Specificare il numero dei campioni d'oro con setBatchSize()
. Passa gli input dei tuoi campioni d'oro usando setGoldenInputs()
. Fornire l'output previsto per l'input passato con setGoldenOutputs()
.
È possibile definire un tempo massimo di inferenza con setInferenceTimeoutMillis()
(5000 ms per impostazione predefinita). Se l'inferenza richiede più tempo del tempo definito, la configurazione verrà rifiutata.
Facoltativamente, puoi anche creare un AccuracyValidator
personalizzato come segue:
class MyCustomAccuracyValidator implements AccuracyValidator {
boolean validate(
BenchmarkResult benchmarkResult,
ByteBuffer[] goldenOutput) {
for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
if (!goldenOutputs[i]
.equals(benchmarkResult.actualOutput().get(i).getValue())) {
return false;
}
}
return true;
}
}
Assicurati di definire una logica di convalida che funzioni per il tuo caso d'uso.
Si noti che se i dati di convalida sono già incorporati nel modello, è possibile utilizzare EmbeddedValidationConfig
.
Genera output di convalida
Gli output golden sono facoltativi e, purché tu fornisca input golden, il servizio di accelerazione può generare internamente gli output golden. Puoi anche definire la configurazione di accelerazione utilizzata per generare questi output d'oro chiamando setGoldenConfig()
:
ValidationConfig validationConfig = new CustomValidationConfig.Builder()
.setBatchSize(5)
.setGoldenInputs(inputs)
.setGoldenConfig(customCpuAccelerationConfig)
[...]
.build();
Convalida la configurazione dell'accelerazione
Dopo aver creato una configurazione di accelerazione e una configurazione di convalida, puoi valutarle per il tuo modello.
Assicurati che il runtime di TensorFlow Lite con Play Services sia inizializzato correttamente e che il delegato GPU sia disponibile per il dispositivo eseguendo:
TfLiteGpu.isGpuDelegateAvailable(context)
.onSuccessTask(gpuAvailable -> TfLite.initialize(context,
TfLiteInitializationOptions.builder()
.setEnableGpuDelegateSupport(gpuAvailable)
.build()
)
);
Crea un'istanza di AccelerationService
chiamando AccelerationService.create()
.
Puoi quindi convalidare la tua configurazione di accelerazione per il tuo modello chiamando validateConfig()
:
InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
.validateConfig(model, accelerationConfig, validationConfig)
.addOnSuccessListener(validatedConfig -> {
if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
interpreterOptions.setAccelerationConfig(validatedConfig);
interpreter = InterpreterApi.create(model, interpreterOptions);
});
Puoi anche convalidare più configurazioni chiamando validateConfigs()
e passando un oggetto Iterable<AccelerationConfig>
come parametro.
validateConfig()
restituirà un Task<
ValidatedAccelerationConfigResult
>
dall'API Task di Google Play Services che abilita le attività asincrone.
Per ottenere il risultato dalla chiamata di convalida, aggiungi un callback addOnSuccessListener()
.
Usa la configurazione convalidata nel tuo interprete
Dopo aver verificato se ValidatedAccelerationConfigResult
restituito nel callback è valido, puoi impostare la configurazione convalidata come configurazione di accelerazione per il tuo interprete chiamando interpreterOptions.setAccelerationConfig()
.
Cache di configurazione
È improbabile che la configurazione di accelerazione ottimale per il tuo modello cambi sul dispositivo. Pertanto, una volta ricevuta una configurazione di accelerazione soddisfacente, dovresti memorizzarla sul dispositivo e consentire alla tua applicazione di recuperarla e utilizzarla per creare le tue InterpreterOptions
durante le sessioni successive invece di eseguire un'altra convalida. I metodi serialize()
e deserialize()
in ValidatedAccelerationConfigResult
semplificano il processo di archiviazione e recupero.
Esempio di applicazione
Per esaminare un'integrazione in situ del servizio di accelerazione, dai un'occhiata all'app di esempio .
Limitazioni
Il servizio di accelerazione ha le seguenti limitazioni attuali:
- Al momento sono supportate solo le configurazioni di accelerazione CPU e GPU,
- Supporta solo TensorFlow Lite nei servizi Google Play e non puoi utilizzarlo se stai utilizzando la versione in bundle di TensorFlow Lite,
- Non supporta la libreria di attività TensorFlow Lite in quanto non è possibile inizializzare direttamente
BaseOptions
con l'oggettoValidatedAccelerationConfigResult
. - L'SDK del servizio di accelerazione supporta solo il livello API 22 e superiore.
Avvertenze
Esamina attentamente i seguenti avvertimenti, soprattutto se prevedi di utilizzare questo SDK in produzione:
Prima di uscire dalla Beta e rilasciare la versione stabile per l'API del servizio di accelerazione, pubblicheremo un nuovo SDK che potrebbe presentare alcune differenze rispetto all'attuale Beta. Per continuare a utilizzare il servizio di accelerazione, dovrai eseguire la migrazione a questo nuovo SDK e inviare tempestivamente un aggiornamento alla tua app. In caso contrario, potrebbero verificarsi problemi poiché l'SDK beta potrebbe non essere più compatibile con i servizi di Google Play dopo un po' di tempo.
Non vi è alcuna garanzia che una funzionalità specifica all'interno dell'API del servizio di accelerazione o dell'API nel suo complesso diventi mai disponibile a livello generale. Può rimanere in beta a tempo indeterminato, essere chiuso o essere combinato con altre funzionalità in pacchetti progettati per un pubblico di sviluppatori specifico. Alcune funzionalità con l'API del servizio di accelerazione o l'intera API stessa potrebbero eventualmente diventare generalmente disponibili, ma non esiste una pianificazione fissa per questo.
Termini e privacy
Termini di servizio
L'utilizzo delle API del servizio di accelerazione è soggetto ai Termini di servizio delle API di Google .
Inoltre, le API del servizio di accelerazione sono attualmente in versione beta e, pertanto, utilizzandole riconosci i potenziali problemi descritti nella sezione Avvertenze sopra e riconosci che il servizio di accelerazione potrebbe non funzionare sempre come specificato.
Riservatezza
Quando utilizzi le API del servizio di accelerazione, l'elaborazione dei dati di input (ad es. immagini, video, testo) avviene interamente sul dispositivo e il servizio di accelerazione non invia tali dati ai server di Google . Di conseguenza, puoi utilizzare le nostre API per elaborare i dati di input che non dovrebbero lasciare il dispositivo.
Le API del servizio di accelerazione possono contattare i server di Google di tanto in tanto per ricevere cose come correzioni di bug, modelli aggiornati e informazioni sulla compatibilità dell'acceleratore hardware. Le API del servizio di accelerazione inviano a Google anche metriche sulle prestazioni e sull'utilizzo delle API nella tua app. Google utilizza questi dati di metrica per misurare le prestazioni, eseguire il debug, mantenere e migliorare le API e rilevare usi impropri o abusi, come descritto in dettaglio nelle nostre Norme sulla privacy .
Sei tenuto a informare gli utenti della tua app sull'elaborazione da parte di Google dei dati delle metriche del servizio di accelerazione come richiesto dalla legge applicabile.
I dati che raccogliamo includono quanto segue:
- Informazioni sul dispositivo (come produttore, modello, versione del sistema operativo e build) e acceleratori hardware ML disponibili (GPU e DSP). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Informazioni sull'app (nome del pacchetto/id bundle, versione dell'app). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Configurazione dell'API (come il formato e la risoluzione dell'immagine). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Tipo di evento (come inizializzazione, download modello, aggiornamento, esecuzione, rilevamento). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Codici di errore. Utilizzato per la diagnostica.
- Metriche delle prestazioni. Utilizzato per la diagnostica.
- Identificatori per installazione che non identificano in modo univoco un utente o un dispositivo fisico. Utilizzato per il funzionamento della configurazione remota e l'analisi dell'utilizzo.
- Indirizzi IP del mittente della richiesta di rete. Utilizzato per la diagnostica della configurazione remota. Gli indirizzi IP raccolti vengono conservati temporaneamente.
Supporto e feedback
Puoi fornire feedback e ottenere supporto tramite TensorFlow Issue Tracker. Si prega di segnalare problemi e richieste di supporto utilizzando il modello di problema per TensorFlow Lite nei servizi Google Play.