L'uso di processori specializzati come GPU, NPU o DSP per l'hardware l'accelerazione può migliorare notevolmente le prestazioni di inferenza (fino a 10 volte più veloce dell'inferenza in alcuni casi) e l'esperienza utente del tuo sistema operativo Android un'applicazione. Tuttavia, data la varietà di hardware e driver, gli utenti potrebbero la configurazione dell'accelerazione hardware ottimale per ogni utente dispositivo può essere difficile. Inoltre, l'abilitazione della configurazione errata dispositivo può creare un'esperienza utente scadente a causa dell'alta latenza o, in alcuni rari casi, errori di runtime o problemi di accuratezza causati da incompatibilità hardware.
Acceleration Service for Android è un'API che ti aiuta a scegliere
configurazione dell'accelerazione hardware ottimale per un determinato dispositivo dell'utente e
.tflite
, riducendo al minimo il rischio di errori di runtime o problemi di accuratezza.
Il servizio di accelerazione valuta diverse configurazioni di accelerazione sull'utente eseguendo benchmark di inferenza interni con LiteRT un modello di machine learning. Queste esecuzioni di test in genere vengono completate in pochi secondi, a seconda del un modello di machine learning. Puoi eseguire i benchmark una volta su ogni dispositivo dell'utente prima dell'inferenza memorizzare nella cache il risultato e utilizzarlo durante l'inferenza. Questi benchmark vengono eseguiti out-of-process; riducendo al minimo il rischio di arresti anomali dell'app.
Fornisci il modello, i campioni di dati e i risultati previsti (input "aurei") e ) e Acceleration Service eseguirà un'inferenza TFLite interna benchmark per fornirti consigli sull'hardware.
Acceleration Service fa parte dello stack ML personalizzato di Android e funziona con LiteRT in Google Play Services.
Aggiungi le dipendenze al 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 Acceleration Service funziona con LiteRT in Google Play Servizi. Se non stai ancora utilizzando il runtime LiteRT fornito tramite Play Services, devi aggiornare le dependencies.
Come utilizzare l'API Acceleration Service
Per utilizzare Acceleration Service, inizia creando la configurazione dell'accelerazione
che vuoi valutare per il tuo modello (ad esempio GPU con OpenGL). Quindi crea un
configurazione di convalida con il modello, alcuni dati di esempio e
dell'output del modello. Infine, chiama validateConfig()
nel passaggio delle
configurazione dell'accelerazione e configurazione della convalida.
Crea 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à queste configurazioni internamente per eseguire le inferenze dei test.
Al momento il servizio di accelerazione consente di valutare le GPU configurazioni (convertite in delegato GPU durante il tempo di esecuzione) con GpuAccelerationConfig e l'inferenza della CPU (con CpuAccelerationConfig). Stiamo lavorando per supportare più delegati ad accedere ad altri hardware nel per il 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 modello utilizza o meno la quantizzazione con
setEnableQuantizedInference()
Configurazione dell'accelerazione CPU
Crea l'accelerazione della CPU come segue:
AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
.setNumThreads(2)
.build();
Utilizza la
setNumThreads()
per definire il numero di thread da utilizzare per valutare la CPU
l'inferenza.
Crea configurazioni di convalida
Le configurazioni di convalida ti consentono di definire come vuoi che l'accelerazione Servizio per la valutazione delle inferenze. Le userai per trasmettere:
- campioni di input,
- gli output previsti,
- e la logica di convalida dell'accuratezza.
Assicurati di fornire esempi di input per i quali prevedi un buon rendimento il tuo modello (noti anche come campioni aurei).
Crea un
ValidationConfig
con
CustomValidationConfig.Builder
come segue:
ValidationConfig validationConfig = new CustomValidationConfig.Builder()
.setBatchSize(5)
.setGoldenInputs(inputs)
.setGoldenOutputs(outputBuffer)
.setAccuracyValidator(new MyCustomAccuracyValidator())
.build();
Specifica il numero di campioni aurei con
setBatchSize()
Passa gli input dei tuoi campioni aurei utilizzando
setGoldenInputs()
Fornisci l'output previsto per l'input passato con
setGoldenOutputs()
Puoi definire un tempo di inferenza massimo con setInferenceTimeoutMillis()
(5000 ms per impostazione predefinita). Se l'inferenza richiede più tempo del tempo definito,
la configurazione verrà rifiutata.
Se vuoi, puoi anche creare una AccuracyValidator
personalizzata
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 adatta al tuo caso d'uso.
Tieni presente che, se i dati di convalida sono già incorporati nel modello, puoi utilizzare
EmbeddedValidationConfig
Genera output di convalida
I risultati finali sono facoltativi e, a patto che tu fornisca dei input finali,
Acceleration Service può generare internamente gli output finali. Puoi anche
per definire la configurazione di accelerazione utilizzata per generare questi output finali
chiamata al numero 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 di convalida, valutarli per il tuo modello.
Assicurati che il runtime LiteRT con Play Services sia corretto inizializzato e che il delegato GPU sia disponibile per il dispositivo eseguendo:
TfLiteGpu.isGpuDelegateAvailable(context)
.onSuccessTask(gpuAvailable -> TfLite.initialize(context,
TfLiteInitializationOptions.builder()
.setEnableGpuDelegateSupport(gpuAvailable)
.build()
)
);
Creare un'istanza per AccelerationService
chiamando AccelerationService.create()
.
Puoi quindi convalidare la configurazione dell'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
>
da Google Play Services
API Tasks, che abilita
le attività asincrone.
Per ottenere il risultato della chiamata di convalida, aggiungi un
addOnSuccessListener()
di Google.
Utilizzare la configurazione convalidata nell'interprete
Dopo aver controllato se ValidatedAccelerationConfigResult
ha restituito
è valido, puoi impostare la configurazione convalidata come configurazione di accelerazione
per l'interprete chiamando il numero interpreterOptions.setAccelerationConfig()
.
Memorizzazione nella cache della configurazione
È improbabile che la configurazione dell'accelerazione ottimale per il tuo modello cambi
del dispositivo. Una volta ricevuta una configurazione di accelerazione soddisfacente,
archiviarlo sul dispositivo e consentire all'applicazione di recuperarlo per utilizzarlo
crea InterpreterOptions
durante le sessioni seguenti anziché
eseguendo un'altra convalida. I metodi serialize()
e deserialize()
in
ValidatedAccelerationConfigResult
esegue il processo di archiviazione e recupero
è più facile.
Applicazione di esempio
Per esaminare un'integrazione in situ di Acceleration Service, dai un'occhiata alle app di esempio.
Limitazioni
Il servizio di accelerazione presenta le seguenti limitazioni:
- Al momento sono supportate solo le configurazioni di accelerazione CPU e GPU.
- Supporta solo LiteRT in Google Play Services e non puoi utilizzalo se usi la versione in bundle di LiteRT.
- L'SDK Acceleration Service supporta solo il livello API 22 e versioni successive.
Avvertenze
Leggi con attenzione le avvertenze riportate di seguito, soprattutto se stai pianificando per utilizzare questo SDK in produzione:
Prima di uscire dalla fase beta e rilasciare la versione stabile per l'API Acceleration Service, pubblicheremo un nuovo SDK che potrebbe includere differenze rispetto all'attuale versione beta. Per continuare a utilizzare Acceleration Service, dovrai eseguire la migrazione a questo nuovo SDK ed eseguire il push di aggiornare la tua app in modo tempestivo. in caso contrario potrebbero verificarsi malfunzionamenti, l'SDK beta potrebbe non essere più compatibile con Google Play Services dopo per un po' di tempo.
Non vi è alcuna garanzia che una funzionalità specifica nel campo L'API del servizio o l'API nel suo complesso diventerà in disponibilità generale. it potrebbero rimanere in versione beta a tempo indeterminato, essere disattivati o essere combinati con altri in pacchetti pensati per un pubblico di sviluppatori specifico. Alcune con l'API Acceleration Service o l'intera API stessa, alla fine diventeranno in disponibilità generale, ma non esiste una pianificazione fissa per questo.
Termini e privacy
Termini di servizio
L'utilizzo delle API Acceleration Service è soggetto ai Termini di servizio delle API di Google
servizio.
Inoltre, le API Acceleration Service sono attualmente in versione beta
e, in quanto tale, utilizzandolo accetti i potenziali problemi descritti nei
Avvertenze sopra riportati e prendi atto che il Servizio di accelerazione potrebbe non
funzionino sempre come specificato.
Privacy
Quando utilizzi le API Acceleration Service, l'elaborazione dei dati di input (ad es.
immagini, video e testo) avvengono interamente sul dispositivo e il servizio di accelerazione
non vengono inviati ai server di Google. Di conseguenza, puoi utilizzare le nostre API
per elaborare i dati di input che non devono uscire dal dispositivo.
Le API Acceleration Service possono contattare di tanto in tanto i server di Google in
al fine di ricevere correzioni di bug, modelli aggiornati e acceleratore hardware.
informazioni sulla compatibilità. Le API Acceleration Service inviano anche metriche
le prestazioni e l'utilizzo delle API
nella tua app a Google. Google utilizza
dati di queste metriche per misurare le prestazioni, eseguire il debug, gestire e migliorare le API,
e rilevare un uso improprio o illecito, come descritto in maggiore dettaglio nelle nostre Norme sulla privacy
Norme.
È tua responsabilità informare gli utenti della tua app sull'elaborazione da parte di Google
dei dati delle metriche di Acceleration Service come richiesto dalla legge vigente.
I dati che raccogliamo includono:
- Informazioni del dispositivo (ad esempio produttore, modello, versione del sistema operativo e build) e acceleratori hardware ML (GPU e DSP) disponibili. Utilizzato per la diagnostica e e analisi sull'utilizzo.
- Informazioni sull'app (nome del pacchetto / ID pacchetto, versione dell'app). Utilizzata per diagnostica e analisi dell'utilizzo.
- Configurazione dell'API (ad esempio formato dell'immagine e risoluzione). Utilizzata per diagnostica e analisi dell'utilizzo.
- Tipo di evento (come inizializzare, download del 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 dispositivo fisico. Utilizzato per le operazioni di configurazione e utilizzo da remoto Analytics.
- Indirizzi IP dei mittenti delle richieste di rete. Utilizzato per la configurazione remota diagnostica. Gli indirizzi IP raccolti vengono conservati temporaneamente.
Assistenza e feedback
Puoi fornire feedback e ricevere assistenza tramite TensorFlow Issue Tracker. Segnala problemi e richieste di assistenza utilizzando il modello di problema per LiteRT in Google Play Services.