Acceleration-Dienst für Android (Beta)

Die Verwendung spezieller Prozessoren wie GPUs, NPUs oder DSPs zur Hardwarebeschleunigung kann die Inferenzleistung (in einigen Fällen bis zu zehnmal schnellere Inferenz) und die Nutzererfahrung Ihrer ML-fähigen Android-Anwendung erheblich verbessern. Angesichts der Vielzahl von Hardware und Treibern Ihrer Nutzer kann es jedoch eine Herausforderung sein, für jedes Gerät die optimale Konfiguration für die Hardwarebeschleunigung auszuwählen. Darüber hinaus kann die falsche Konfiguration auf einem Gerät die Nutzerfreundlichkeit beeinträchtigen. Dies kann auf hohe Latenz oder in seltenen Fällen zu Laufzeitfehlern oder Genauigkeitsproblemen zurückzuführen sein, die durch Hardwareinkompatibilitäten verursacht werden.

Acceleration Service for Android ist eine API, mit der Sie die optimale Konfiguration für die Hardwarebeschleunigung für ein bestimmtes Nutzergerät und Ihr .tflite-Modell auswählen können. Gleichzeitig wird das Risiko von Laufzeitfehlern oder Genauigkeitsproblemen minimiert.

Acceleration Service wertet verschiedene Beschleunigungskonfigurationen auf Nutzergeräten aus. Dazu führt er interne Inferenz-Benchmarks mit Ihrem TensorFlow Lite-Modell aus. Diese Testläufe sind abhängig vom Modell normalerweise innerhalb weniger Sekunden abgeschlossen. Sie können die Benchmarks vor der Inferenzzeit auf jedem Nutzergerät einmal ausführen, das Ergebnis im Cache speichern und während der Inferenz verwenden. Diese Benchmarks sind Run-of-Process, wodurch das Risiko von Abstürzen Ihrer App minimiert wird.

Stellen Sie Ihr Modell, Stichproben und die erwarteten Ergebnisse („goldene“ Ein- und Ausgaben) bereit. Der Acceleration Service führt dann eine interne TFLite-Inferenz-Benchmark aus, um Ihnen Hardwareempfehlungen bereitzustellen.

Image

Acceleration Service ist Teil des benutzerdefinierten ML-Stacks von Android und funktioniert mit TensorFlow Lite in Google Play-Diensten.

Abhängigkeiten zum Projekt hinzufügen

Fügen Sie der Datei build.gradle Ihrer Anwendung die folgenden Abhängigkeiten hinzu:

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

Die Acceleration Service API funktioniert mit TensorFlow Lite in Google Play-Diensten. Wenn Sie die über Play-Dienste bereitgestellte TensorFlow Lite-Laufzeit noch nicht verwenden, müssen Sie die Abhängigkeiten aktualisieren.

Acceleration Service API verwenden

Um den Acceleration Service zu verwenden, müssen Sie zuerst die Beschleunigungskonfiguration erstellen, die Sie für Ihr Modell auswerten möchten (z. B. GPU mit OpenGL). Erstellen Sie dann eine Validierungskonfiguration mit Ihrem Modell, einigen Beispieldaten und der erwarteten Modellausgabe. Rufen Sie abschließend validateConfig() auf und übergeben Sie sowohl Ihre Beschleunigungskonfiguration als auch Ihre Validierungskonfiguration.

Image

Beschleunigungskonfigurationen erstellen

Beschleunigungskonfigurationen sind Darstellungen von Hardwarekonfigurationen, die während der Ausführung in Bevollmächtigte umgewandelt werden. Der Acceleration Service verwendet diese Konfigurationen dann intern, um Testinferenzen auszuführen.

Derzeit können Sie mit dem Beschleunigungsdienst GPU-Konfigurationen (die während der Ausführungszeit in einen GPU-Delegaten umgewandelt wurden) mit GpuAccelerationConfig und CPU-Inferenz (mit CpuAccelerationConfig) bewerten. Wir arbeiten daran, in Zukunft mehr Bevollmächtigten den Zugriff auf andere Hardware zu ermöglichen.

Konfiguration der GPU-Beschleunigung

Erstellen Sie so eine GPU-Beschleunigungskonfiguration:

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

Mit setEnableQuantizedInference() müssen Sie angeben, ob Ihr Modell Quantisierung verwendet.

Konfiguration der CPU-Beschleunigung

Erstellen Sie die CPU-Beschleunigung so:

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

Definieren Sie mit der Methode setNumThreads() die Anzahl der Threads, die Sie zur Bewertung der CPU-Inferenz verwenden möchten.

Validierungskonfigurationen erstellen

Mit Validierungskonfigurationen können Sie definieren, wie der Acceleration Service Inferenzen bewerten soll. Sie werden sie verwenden, um Folgendes zu übergeben:

  • Eingabebeispiele,
  • erwartete Ausgaben,
  • Validierungslogik.

Stellen Sie sicher, dass Sie Eingabebeispiele bereitstellen, für die Sie eine gute Leistung Ihres Modells erwarten (auch als „goldene“ Beispiele bezeichnet).

Erstellen Sie wie folgt eine ValidationConfig mit CustomValidationConfig.Builder:

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

Geben Sie die Anzahl der goldenen Proben mit setBatchSize() an. Übergeben Sie die Eingaben der goldenen Stichproben mit setGoldenInputs(). Geben Sie die erwartete Ausgabe für die mit setGoldenOutputs() übergebene Eingabe an.

Sie können eine maximale Inferenzzeit mit setInferenceTimeoutMillis() definieren (standardmäßig 5.000 ms). Wenn die Inferenz länger als die von Ihnen definierte Zeit dauert, wird die Konfiguration abgelehnt.

Optional können Sie auch ein benutzerdefiniertes AccuracyValidator erstellen:

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;

   }
}

Definieren Sie eine Validierungslogik, die für Ihren Anwendungsfall funktioniert.

Wenn die Validierungsdaten bereits in das Modell eingebettet sind, können Sie EmbeddedValidationConfig verwenden.

Validierungsausgaben generieren

Goldene Ausgaben sind optional. Solange Sie goldene Eingaben angeben, kann der Acceleration-Dienst diese intern generieren. Sie können auch setGoldenConfig() aufrufen, um die Beschleunigungskonfiguration zu definieren, die zum Generieren dieser goldenen Ausgaben verwendet wird:

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

Acceleration-Konfiguration validieren

Nachdem Sie eine Beschleunigungskonfiguration und eine Validierungskonfiguration erstellt haben, können Sie diese für Ihr Modell auswerten.

Prüfen Sie mit dem folgenden Befehl, ob die Laufzeit von TensorFlow Lite mit Play Services korrekt initialisiert und der GPU-Delegat für das Gerät verfügbar ist:

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

Instanziieren Sie AccelerationService durch Aufrufen von AccelerationService.create().

Anschließend können Sie die Beschleunigungskonfiguration für Ihr Modell validieren, indem Sie validateConfig() aufrufen:

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);
});

Sie können auch mehrere Konfigurationen validieren, indem Sie validateConfigs() aufrufen und ein Iterable<AccelerationConfig>-Objekt als Parameter übergeben.

validateConfig() gibt eine Task<ValidatedAccelerationConfigResult> der Task API der Google Play-Dienste zurück, die asynchrone Aufgaben aktiviert.
Fügen Sie einen addOnSuccessListener()-Callback hinzu, um das Ergebnis des Validierungsaufrufs zu erhalten.

Validierte Konfiguration im Interpreter verwenden

Nachdem Sie geprüft haben, ob der im Callback zurückgegebene ValidatedAccelerationConfigResult gültig ist, können Sie die validierte Konfiguration als Beschleunigungskonfiguration für Ihren Interpreter festlegen, der interpreterOptions.setAccelerationConfig() aufruft.

Konfigurations-Caching

Die optimale Beschleunigungskonfiguration für Ihr Modell wird sich auf dem Gerät wahrscheinlich nicht ändern. Sobald Sie eine passende Beschleunigungskonfiguration erhalten, sollten Sie sie auf dem Gerät speichern und von Ihrer Anwendung abrufen und verwenden, um in den folgenden Sitzungen die InterpreterOptions zu erstellen, anstatt eine weitere Validierung auszuführen. Die Methoden serialize() und deserialize() in ValidatedAccelerationConfigResult vereinfachen das Speichern und Abrufen.

Beispielanwendung

Eine lokale Integration des Acceleration Service finden Sie in der Beispiel-App.

Beschränkungen

Für den Acceleration-Dienst gelten die folgenden Einschränkungen:

  • Derzeit werden nur CPU- und GPU-Beschleunigungskonfigurationen unterstützt.
  • Es unterstützt nur TensorFlow Lite in Google Play-Diensten. Mit der gebündelten Version von TensorFlow Lite können Sie es nicht verwenden.
  • Das Acceleration Service SDK unterstützt nur API-Level 22 und höher.

Wichtige Hinweise

Lesen Sie die folgenden Einschränkungen sorgfältig durch, insbesondere wenn Sie dieses SDK in der Produktion verwenden möchten:

  • Bevor wir die Betaversion beenden und die stabile Version für die Acceleration Service API veröffentlichen, werden wir ein neues SDK veröffentlichen, das sich von der aktuellen Betaversion unterscheidet. Wenn Sie den Acceleration-Dienst weiterhin nutzen möchten, müssen Sie zu diesem neuen SDK migrieren und zeitnah ein Update für Ihre App bereitstellen. Andernfalls kann es zu Fehlern kommen, da das Beta SDK nach einiger Zeit möglicherweise nicht mehr mit den Google Play-Diensten kompatibel ist.

  • Es gibt keine Garantie, dass eine bestimmte Funktion innerhalb der Acceleration Service API oder der API insgesamt jemals allgemein verfügbar wird. Es kann auf unbestimmte Zeit in der Betaphase bleiben, heruntergefahren werden oder mit anderen Funktionen zu Paketen für bestimmte Entwicklergruppen kombiniert werden. Möglicherweise werden einige Funktionen mit der Acceleration Service API oder der gesamten API selbst irgendwann allgemein verfügbar. Dafür gibt es jedoch keinen festen Zeitplan.

Nutzungsbedingungen und Datenschutz

Nutzungsbedingungen

Die Nutzung der Acceleration Service APIs unterliegt den Nutzungsbedingungen für Google APIs.
Außerdem befindet sich die Acceleration Service APIs derzeit in der Betaphase. Durch die Verwendung erkennen Sie außerdem die potenziellen Probleme an, die im Abschnitt zu den Einschränkungen oben beschrieben sind. Außerdem bestätigen Sie, dass der Acceleration Service möglicherweise nicht immer wie angegeben funktioniert.

Datenschutz

Wenn Sie die Acceleration Service APIs verwenden, erfolgt die Verarbeitung der Eingabedaten (z. B. Bilder, Videos, Text) vollständig auf dem Gerät. Der Acceleration Service sendet diese Daten nicht an Google-Server. So können Sie unsere APIs zur Verarbeitung von Eingabedaten verwenden, die nicht auf dem Gerät verbleiben sollen.
Die Acceleration Service APIs können von Zeit zu Zeit Google-Server kontaktieren, um z. B. Fehlerbehebungen, aktualisierte Modelle und Kompatibilitätsinformationen zum Hardwarebeschleuniger zu erhalten. Die Acceleration Service APIs senden auch Messwerte zur Leistung und Nutzung der APIs in Ihrer Anwendung an Google. Google verwendet diese Messwertdaten, um die Leistung zu messen, Fehler zu beheben, die APIs zu verwalten und zu verbessern sowie Missbrauch oder Missbrauch zu erkennen, wie in unserer Datenschutzerklärung näher beschrieben.
Du bist dafür verantwortlich, die Nutzer deiner App gemäß anwendbarem Recht über die Verarbeitung der Messwertdaten des Acceleration Service durch Google zu informieren.
Zu den von uns erhobenen Daten gehören:

  • Geräteinformationen (z. B. Hersteller, Modell, Betriebssystemversion und Build) und verfügbare ML-Hardwarebeschleuniger (GPU und DSP). Wird für Diagnosen und Nutzungsanalysen verwendet.
  • App-Informationen (Paketname / Paket-ID, App-Version) Wird für Diagnosen und Nutzungsanalysen verwendet.
  • API-Konfiguration (z. B. Bildformat und Auflösung) Wird für Diagnosen und Nutzungsanalysen verwendet.
  • Ereignistyp (z. B. Initialisieren, Modell herunterladen, Update, Ausführung, Erkennung). Wird für Diagnosen und Nutzungsanalysen verwendet.
  • Fehlercodes. Wird für die Diagnose verwendet.
  • Leistungsmesswerte Wird für die Diagnose verwendet.
  • IDs pro Installation, die einen Nutzer oder ein physisches Gerät nicht eindeutig identifizieren. Wird für Remote-Konfigurations- und Nutzungsanalysen verwendet.
  • IP-Adressen des Absenders von Netzwerkanfragen Wird für die Diagnose der Remote-Konfiguration verwendet. Erfasste IP-Adressen werden vorübergehend aufbewahrt.

Support und Feedback

Über den TensorFlow Issue Tracker können Sie Feedback geben und Unterstützung erhalten. Bitte melden Sie Probleme und Supportanfragen mithilfe der Problemvorlage für TensorFlow Lite in den Google Play-Diensten.