Acceleration-Dienst für Android (Beta)

Einsatz spezieller Prozessoren wie GPUs, NPUs oder DSPs für Hardware Beschleunigung kann die Inferenzleistung erheblich verbessern (bis zu 10-mal schneller Inferenz) und die Nutzererfahrung Ihrer ML-fähigen Android- . Angesichts der Vielzahl von Hardware und Treibern, die Ihre Nutzer Die optimale Konfiguration der Hardwarebeschleunigung für jeden Nutzer kann eine echte Herausforderung sein. Außerdem wird die falsche Konfiguration auf einer kann aufgrund der hohen Latenz oder, in einigen seltenen Fällen, zu einer schlechten Nutzererfahrung führen. -Fällen, Laufzeitfehlern oder Genauigkeitsproblemen aufgrund von Hardware-Inkompatibilitäten.

Acceleration Service for Android ist eine API, mit der Sie optimale Konfiguration der Hardwarebeschleunigung für ein bestimmtes Nutzergerät und Ihr .tflite-Modell verwenden und gleichzeitig das Risiko von Laufzeitfehlern oder Genauigkeitsproblemen minimieren.

Acceleration Service wertet verschiedene Beschleunigungskonfigurationen auf Nutzer aus mit Ihrem LiteRT-Gerät durch Ausführen interner Inferenz-Benchmarks Modell. Diese Testläufe dauern in der Regel nur wenige Sekunden, je nachdem, Modell. Sie können die Benchmarks vor der Inferenz einmal auf jedem Nutzergerät ausführen speichern und bei der Inferenz verwenden. Diese Benchmarks werden Out-of-Process; Dadurch wird das Risiko von App-Abstürzen minimiert.

Geben Sie Ihr Modell, die Datenstichproben und die erwarteten Ergebnisse (goldene Eingaben und Ausgaben) und der Acceleration Service führt eine interne TFLite-Inferenz aus um Ihnen Hardwareempfehlungen geben zu können.

Image

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

Abhängigkeiten zum Projekt hinzufügen

Fügen Sie der build.gradle-Datei 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 LiteRT in Google Play. Dienste. Wenn Sie noch keine über die Play-Dienste bereitgestellte LiteRT-Laufzeit verwenden, müssen Ihre dependencies aktualisieren.

Acceleration Service API verwenden

Erstellen Sie zuerst die Konfiguration für die Beschleunigung, um den Acceleration Service zu verwenden das Sie für Ihr Modell bewerten möchten (z. B. GPU mit OpenGL). Erstellen Sie dann Validierungskonfiguration mit Ihrem Modell, einigen Beispieldaten und dem erwarteten Modellausgabe. Rufen Sie schließlich validateConfig() auf und übergeben Sie und Validierungskonfiguration.

Image

Beschleunigungskonfigurationen erstellen

Beschleunigungskonfigurationen sind Darstellungen der Hardwarekonfigurationen die während der Ausführungszeit in Delegierte umgewandelt werden. Der Acceleration Service verwendet diese Konfigurationen dann intern Testinferenzen durchzuführen.

Im Moment können Sie mit dem Beschleunigungsdienst die GPU bewerten Konfigurationen (während der Ausführung in GPU-Delegate umgewandelt werden) mit dem GpuAccelerationConfig und CPU-Inferenz (mit CpuAccelerationConfig). Wir arbeiten daran, mehr Bevollmächtigten Zugriff auf andere Hardware in der in der Zukunft.

Konfiguration der GPU-Beschleunigung

Erstellen Sie so eine Konfiguration für die GPU-Beschleunigung:

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

Sie müssen angeben, ob Ihr Modell Quantisierung mit setEnableQuantizedInference()

Konfiguration der CPU-Beschleunigung

Erstellen Sie die CPU-Beschleunigung so:

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

Verwenden Sie die Methode setNumThreads() Methode zum Definieren der Anzahl der Threads, die zum Auswerten der CPU verwendet werden sollen Inferenz.

Validierungskonfigurationen erstellen

Mit Validierungskonfigurationen können Sie festlegen, wie die Beschleunigung Dienst zum Auswerten von Inferenzen. Sie verwenden sie, um Folgendes zu übergeben:

  • Eingabestichproben,
  • erwartete Ausgaben,
  • Logik zur Validierung der Genauigkeit.

Stellen Sie unbedingt Eingabebeispiele bereit, für die Sie eine gute Leistung erwarten. Ihr Modell (auch als „goldene“ Beispiele bezeichnet).

Erstellen: ValidationConfig mit CustomValidationConfig.Builder wie folgt:

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

Geben Sie die Anzahl der goldenen Beispiele an mit setBatchSize() Übergeben Sie die Eingaben Ihrer goldenen Samples mit setGoldenInputs() Stellen Sie die erwartete Ausgabe für die mit übergebene Eingabe bereit setGoldenOutputs()

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

Optional können Sie auch eine benutzerdefinierte AccuracyValidator erstellen. wie folgt:

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 Ihr Modell eingebettet sind, können Sie EmbeddedValidationConfig

Validierungsausgaben generieren

Goldene Ausgaben sind optional. Solange Sie goldene Eingaben angeben, Acceleration Service kann die goldenen Ausgaben intern generieren. Sie können auch die Beschleunigungskonfiguration zum Generieren dieser goldenen Ausgaben setGoldenConfig() wird aufgerufen:

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

Beschleunigungskonfiguration validieren

Nachdem Sie eine Konfiguration für die Beschleunigung und eine Validierung erstellt haben, für Ihr Modell bewerten können.

Prüfen Sie, ob die Laufzeit von LiteRT mit Play-Diensten korrekt ist initialisiert wurde und der GPU-Delegate für das Gerät verfügbar ist. Führen Sie dazu folgenden Befehl aus:

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

AccelerationService instanziieren indem du AccelerationService.create() anrufst.

Anschließend können Sie die Konfiguration der Beschleunigung für Ihr Modell überprüfen, indem Sie folgenden Befehl aufrufen: 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);
});

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

validateConfig()gibt Folgendes zurück: Task<ValidatedAccelerationConfigResult> über die Google Play-Dienste Task-API, die Folgendes ermöglicht: asynchrone Aufgaben.
Um das Ergebnis des Validierungsaufrufs zu erhalten, fügen Sie einen addOnSuccessListener() Callback des Nutzers an.

Validierte Konfiguration im Interpreter verwenden

Nachdem geprüft wurde, ob die ValidatedAccelerationConfigResult im Callback gültig ist, können Sie die validierte Konfiguration als Beschleunigungskonfiguration festlegen. für deinen Dolmetscher interpreterOptions.setAccelerationConfig().

Konfigurations-Caching

Die optimale Beschleunigungskonfiguration für Ihr Modell wird sich wahrscheinlich auf dem Gerät. Sobald Sie eine befriedigende Beschleunigungskonfiguration erhalten, sollte es auf dem Gerät gespeichert werden. erstellen Sie Ihre InterpreterOptions in den folgenden Sitzungen statt eine weitere Validierung. Die Methoden serialize() und deserialize() in ValidatedAccelerationConfigResult die Speicherung und den Abruf einfacher zu machen.

Beispielanwendung

Informationen zur In-situ-Integration des Acceleration Service finden Sie in der Beispiel-App.

Beschränkungen

Für den Acceleration Service gelten derzeit die folgenden Einschränkungen:

  • Derzeit werden nur Konfigurationen für die CPU- und GPU-Beschleunigung unterstützt.
  • Es wird nur LiteRT in Google Play-Diensten unterstützt. wenn Sie die gebündelte Version von LiteRT nutzen.
  • Acceleration Service SDK unterstützt nur API-Level 22 und höher.

Vorsichtsmaßnahmen

Lesen Sie die folgenden Hinweise sorgfältig durch, insbesondere wenn Sie um dieses SDK in der Produktion zu verwenden:

  • Vor dem Beenden der Betaversion und der Veröffentlichung der stabilen Version für die Acceleration Service API veröffentlichen wir ein neues SDK, im Vergleich zur aktuellen Betaversion. Damit Sie die müssen Sie zum neuen SDK migrieren zeitnah aktualisiert werden. Andernfalls kann es zu Ausfällen kommen, ist das Beta SDK nach der Umstellung möglicherweise nicht mehr mit den Google Play-Diensten kompatibel. etwas Zeit widmen.

  • Es gibt keine Garantie dafür, dass ein bestimmtes Feature innerhalb der Beschleunigung Die Service API oder die API insgesamt wird irgendwann allgemein verfügbar sein. Es kann auf unbestimmte Zeit in der Betaphase bleiben, eingestellt oder mit anderen zu Paketen zusammengefasst, die für bestimmte Entwicklerzielgruppen konzipiert sind. Einige mit der Acceleration Service API oder der gesamten API selbst allgemein verfügbar werden, aber es gibt keinen festen Zeitplan für dies.

Nutzungsbedingungen und Datenschutz

Nutzungsbedingungen

Die Nutzung der Acceleration Service APIs unterliegt den Nutzungsbedingungen für Google APIs Dienst.
Die Acceleration Service APIs befinden sich derzeit in der Betaphase. Wenn Sie es verwenden, erkennen Sie die potenziellen Probleme an, die in den und bestätigen, dass der Acceleration Service immer wie angegeben funktionieren.

Datenschutz

Wenn Sie die Acceleration Service APIs verwenden, wird die Verarbeitung der Eingabedaten (z.B. Bilder, Videos, Texte) werden vollständig direkt auf dem Gerät übertragen. Der Acceleration Service werden diese Daten nicht an Google-Server gesendet. Daher können Sie unsere APIs zur Verarbeitung von Eingabedaten, die das Gerät nicht verlassen dürfen.
Die Acceleration Service APIs können gelegentlich in um Dinge wie Fehlerkorrekturen, aktualisierte Modelle und Hardwarebeschleuniger zu erhalten. Informationen zur Kompatibilität. Die Acceleration Service APIs senden auch Messwerte zu die Leistung und Nutzung der APIs in Ihrer App an Google zu senden. Google verwendet um die Leistung zu messen, Fehler zu beheben, die APIs zu warten und zu verbessern, und Missbrauch zu erkennen, wie in unserer Datenschutzerklärung Richtlinien:
Du bist dafür verantwortlich, die Nutzer deiner App über die Verarbeitung durch Google zu informieren. der Messwertdaten des Acceleration Service gemäß anwendbarem Recht.
Zu den von uns erhobenen Daten gehören:

  • Geräteinformationen (z. B. Hersteller, Modell, Betriebssystemversion und Build) und verfügbaren ML-Hardwarebeschleunigern (GPU und DSP) Wird für Diagnosen und Nutzungsanalysen.
  • App-Informationen (Paketname / Bundle-ID, App-Version). Verwendet für Diagnose- und Nutzungsanalysen.
  • API-Konfiguration (z. B. Bildformat und -auflösung) Verwendet für Diagnose- und Nutzungsanalysen.
  • Ereignistyp (z. B. „Initialisieren“, „Modell herunterladen“, „Aktualisieren“, „Ausführen“, „Erkennung“). Wird für Diagnosen und Nutzungsanalysen verwendet.
  • Fehlercodes. Wird für Diagnosezwecke verwendet.
  • Leistungsmesswerte Wird für Diagnosezwecke verwendet.
  • Kennzeichnungen nach Installation, die Nutzer oder Nutzer nicht eindeutig identifizieren physisches Gerät Wird für den Betrieb der Remote-Konfiguration und -Nutzung verwendet Analytics.
  • Absender-IP-Adressen der Netzwerkanfrage. Wird für die Remote-Konfiguration verwendet Diagnose. 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 LiteRT in den Google Play-Diensten.