Acceleration Service per Android (beta)

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.

immagine

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.

immagine

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.