Usługa Acceleration na Androida (beta)

Stosowanie wyspecjalizowanych procesorów, takich jak GPU, NPU lub DSP do obsługi sprzętu przyspieszenie może znacznie poprawić wydajność wnioskowania (nawet 10 razy szybciej) wnioskowania w niektórych przypadkach) i wrażeń użytkowników Androida z obsługą systemów uczących się. aplikacji. Jednak ze względu na różnorodność sprzętu i sterowników użytkownicy mogą wybrać optymalną konfigurację akceleracji sprzętowej dla każdego użytkownika, może być trudnym zadaniem. Ponadto włączenie niewłaściwej konfiguracji urządzenie może pogorszyć wrażenia użytkownika z powodu dużego opóźnienia. W rzadkich przypadkach w przypadku błędów w czasie działania, a także problemów z dokładnością spowodowanych brakiem zgodności sprzętu.

Acceleration Service na Androida to interfejs API, który pomaga wybrać optymalnej konfiguracji akceleracji sprzętowej dla danego urządzenia użytkownika .tflite, minimalizując jednocześnie ryzyko błędów w czasie działania i problemów z dokładnością.

Usługa Acceleration Program ocenia różne konfiguracje przyspieszenia u użytkownika urządzeń, korzystając z wewnętrznych testów porównawczych wnioskowania za pomocą LiteRT. model atrybucji. Trwa to zazwyczaj kilka sekund, w zależności od model atrybucji. Przed wywnioskowaniem testów porównawczych możesz przeprowadzić testy porównawcze raz na każdym urządzeniu użytkownika. zapisz wynik w pamięci podręcznej i użyj go podczas wnioskowania. Te testy porównawcze są poza procesem; co minimalizuje ryzyko awarii w aplikacji.

Udostępnij model, próbki danych i oczekiwane wyniki (dane wejściowe „złote” danych wyjściowych), a usługa Acceleration Program uruchomi wewnętrzne wnioskowanie TFLite testów porównawczych, aby przedstawić zalecenia dotyczące sprzętu.

obraz

Usługa Acceleration jest częścią niestandardowego stosu ML Androida i współpracuje z LiteRT w Usługach Google Play.

Dodaj zależności do projektu

Dodaj te zależności do pliku build.gradle aplikacji:

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

Interfejs Acceleration Service API współpracuje z LiteRT w Google Play Usługi. Jeśli nie używasz jeszcze środowiska wykonawczego LiteRT udostępnianego w Usługach Google Play, Trzeba zaktualizować swoje dependencies.

Jak korzystać z interfejsu Acceleration Service API

Aby korzystać z usługi Acceleration, najpierw utwórz konfigurację przyspieszenia który chcesz ocenić dla swojego modelu (np.GPU z trybem OpenGL). Następnie utwórz konfiguracji weryfikacji za pomocą modelu, przykładowych danych i oczekiwanych danych wyjściowych modelu. Na koniec wywołaj validateConfig(), przekazując zarówno swoje konfiguracji przyspieszania i walidacji.

obraz

Utwórz konfiguracje przyspieszenia

Konfiguracje przyspieszenia reprezentują konfiguracje sprzętowe które są przekształcane w delegatów w czasie wykonywania. Usługa Acceleration będzie następnie używała tych konfiguracji wewnętrznie aby wnioskować o testy.

Obecnie usługa przyspieszenia umożliwia ocenę GPU konfiguracje (przekonwertowane na przekazywanie dostępu do GPU w czasie wykonywania) z GpuAccelerationConfig i wnioskowanie dotyczące procesora (z CpuAccelerationConfig). Pracujemy nad tym, aby więcej przedstawicieli mogli korzystać z innego sprzętu w przyszłości.

Konfiguracja przyspieszenia GPU

Utwórz konfigurację przyspieszenia GPU w następujący sposób:

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

Musisz określić, czy Twój model korzysta z kwantyzacji z setEnableQuantizedInference()

Konfiguracja przyspieszenia procesora

Utwórz przyspieszenie procesora w następujący sposób:

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

Użyj setNumThreads() do definiowania liczby wątków, które mają być używane do oceny procesora wnioskowania.

Utwórz konfiguracje weryfikacji

Konfiguracje weryfikacji pozwalają określić sposób przyspieszania działania Usługa do oceny wniosków. Możesz ich używać, by zaliczyć:

  • próbek danych wejściowych,
  • oczekiwane wyniki,
  • logikę walidacji dokładności.

Pamiętaj o dostarczeniu próbek danych wejściowych, w przypadku których spodziewasz się wysokiej skuteczności swojego modelu (są to tzw. „złote” próbki).

Utwórz ValidationConfig z CustomValidationConfig.Builder w następujący sposób:

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

Określ liczbę złotych próbek za pomocą setBatchSize() Przekaż dane ze złotych próbek za pomocą setGoldenInputs() Podaj oczekiwane dane wyjściowe przekazywane z danymi wejściowymi setGoldenOutputs()

Maksymalny czas wnioskowania możesz określić za pomocą funkcji setInferenceTimeoutMillis() (domyślnie 5000 ms). Jeśli wnioskowanie trwa dłużej niż zdefiniowany czas, konfiguracja zostanie odrzucona.

Opcjonalnie możesz też utworzyć niestandardowy AccuracyValidator. w następujący sposób:

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;

   }
}

Zdefiniuj logikę weryfikacji, która sprawdzi się w Twoim przypadku użycia.

Pamiętaj, że jeśli dane weryfikacyjne są już osadzone w modelu, możesz użyć EmbeddedValidationConfig

Wygeneruj wyniki weryfikacji

Złote dane wyjściowe są opcjonalne. Jeśli podasz złote dane wejściowe, Usługa Acceleration może wewnętrznie generować złote dane wyjściowe. Możesz też określić konfigurację przyspieszenia używaną do wygenerowania tych złotych wyników dzwoni do: setGoldenConfig():

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

Zweryfikuj konfigurację przyspieszenia

Po utworzeniu konfiguracji przyspieszenia i konfiguracji walidacji może je ocenić dla Twojego modelu.

Sprawdź, czy środowisko wykonawcze LiteRT z Usługami Google Play jest prawidłowo i że delegowany GPU jest dostępny dla urządzenia przez uruchomienie polecenia:

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

Utwórz instancję AccelerationService , dzwoniąc pod numer AccelerationService.create().

Następnie możesz zweryfikować konfigurację przyspieszenia swojego modelu, wywołując 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);
});

Możesz również zweryfikować wiele konfiguracji, wywołując validateConfigs() i przekazywanie obiektu Iterable<AccelerationConfig> jako parametru.

validateConfig()zwraca Task<ValidatedAccelerationConfigResult> z Usług Google Play Task API, który umożliwia asynchronicznych zadań.
Aby uzyskać wynik wywołania weryfikacyjnego, dodaj addOnSuccessListener(). oddzwanianie.

Użyj zweryfikowanej konfiguracji w tłumaczeniu

Po sprawdzeniu, czy usługa ValidatedAccelerationConfigResult zwróciła wywołanie zwrotne jest prawidłowe, możesz ustawić zweryfikowaną konfigurację jako konfigurację przyspieszenia za tłumacza dzwoniącego pod numer interpreterOptions.setAccelerationConfig().

Buforowanie konfiguracji

Optymalna konfiguracja przyspieszenia dla Twojego modelu prawdopodobnie nie zmieni się urządzenia. Po uzyskaniu satysfakcjonującej konfiguracji przyspieszenia możesz powinien zapisać go na urządzeniu i pozwolić aplikacji na jego pobranie oraz użycie utwórz InterpreterOptions podczas następujących sesji, a nie przeprowadzanie kolejnej weryfikacji. Metody serialize() i deserialize() w ValidatedAccelerationConfigResult wykonują proces przechowywania i pobierania .

Przykładowa aplikacja

Aby sprawdzić integrację in-situ z usługą Acceleration, obejrzyj przykładowej aplikacji.

Ograniczenia

Usługa Acceleration ma obecnie takie ograniczenia:

  • Obecnie obsługiwane są tylko konfiguracje przyspieszenia CPU i GPU.
  • Obsługuje LiteRT tylko w Usługach Google Play i nie można użyj go, jeśli korzystasz z pakietu w wersji LiteRT.
  • Pakiet Acceleration Service SDK obsługuje tylko interfejs API na poziomie 22 lub wyższym.

Zastrzeżenia

Zapoznaj się uważnie z tymi zastrzeżeniami, zwłaszcza jeśli planujesz , aby używać tego pakietu SDK w środowisku produkcyjnym:

  • Przed zamknięciem Beta i opublikowaniem stabilnej wersji interfejsu Acceleration Service API, opublikujemy nowy pakiet SDK, który może różnice w stosunku do obecnej wersji beta. Aby nadal korzystać z w usłudze Acceleration, musisz przejść na ten nowy pakiet SDK i przesłać aktualizować ją w odpowiednim czasie. Jeśli tego nie zrobisz, mogą wystąpić awarie, pakiet SDK w wersji beta może nie być zgodny z Usługami Google Play po za jakiś czas.

  • Nie ma gwarancji, że konkretna funkcja programu Acceleration Interfejs API usługi lub cały interfejs API staną się ogólnie dostępne. it mogą pozostawać w wersji beta na czas nieokreślony, zostać wyłączone lub być połączone z innymi w pakiety przeznaczone dla konkretnych odbiorców. Niektóre z interfejsem Acceleration Service API lub za pomocą całego interfejsu API, staną się ogólnie dostępne, ale nie ma ustalonego harmonogramu to osiągnąć.

Warunki i prywatność

Warunki korzystania z usługi

Korzystanie z interfejsów API usługi Acceleration podlega Warunkom korzystania z interfejsów API Google Usługa.
Dodatkowo interfejsy Acceleration Service API są obecnie w wersji beta Korzystając z niego, przyjmujesz do wiadomości potencjalne problemy opisane zastrzeżeń powyżej i przyjmuje do wiadomości, że usługa Acceleration może nie zawsze wykonywać zgodnie z harmonogramem.

Prywatność

Gdy korzystasz z interfejsów Acceleration Service API, przetwarzanie danych wejściowych (np. (obrazy, filmy czy tekst), odbywa się w całości na urządzeniu, a usługa Acceleration nie wysyła tych danych na serwery Google. Dzięki temu można używać naszych interfejsów API do przetwarzania danych wejściowych, które nie powinny opuszczać urządzenia.
Interfejsy API usługi Acceleration mogą od czasu do czasu kontaktować się z serwerami Google w aby otrzymywać poprawki błędów, zaktualizowane modele i akcelerator sprzętowy informacje o zgodności. Interfejsy Acceleration Service API wysyłają też dane o wydajności i wykorzystania interfejsów API w aplikacji. Google używa te dane do pomiaru wydajności, debugowania, utrzymywania i ulepszania interfejsów API, oraz wykrywania nadużyć lub nadużyć, jak opisano szczegółowo w Polityce prywatności Google Zasady.
Ponosisz odpowiedzialność za informowanie użytkowników o swojej aplikacji o przetwarzaniu danych przez Google danych z usługi Acceleration Program zgodnie z obowiązującymi przepisami.
Gromadzone przez nas dane obejmują:

  • informacje o urządzeniu (takie jak producent, model, wersja systemu operacyjnego i kompilacja). dostępnych akceleratorów sprzętowych ML (GPU i DSP). Służy do diagnostyki i do analizy wykorzystania.
  • Informacje o aplikacji (nazwa pakietu / identyfikator pakietu, wersja aplikacji). Używane do diagnostyką i analityką użytkowania.
  • Konfiguracja interfejsu API (np. format i rozdzielczość obrazu). Używane do diagnostyką i analityką użytkowania.
  • Typ zdarzenia (np. zainicjowanie, pobranie modelu, aktualizacja, uruchomienie, wykrycie). Służy do diagnostyki i analizy użytkowania.
  • Kody błędów. Służy do diagnostyki.
  • Dane o skuteczności – Służy do diagnostyki.
  • identyfikatory dla poszczególnych instalacji, które nie umożliwiają jednoznacznej identyfikacji użytkownika lub na urządzeniu fizycznym. Służy do obsługi zdalnej konfiguracji i użytkowania Analytics.
  • Adresy IP nadawców żądań sieciowych. Używany do konfiguracji zdalnej i diagnostykę. Zebrane adresy IP są przechowywane tymczasowo.

Pomoc techniczna i komentarze

Za pomocą narzędzia TensorFlow Issue Tracker możesz przesłać opinię i uzyskać pomoc. Problemy i prośby o pomoc należy zgłaszać za pomocą szablon problemu za LiteRT w Usługach Google Play.