Usługa akceleracji dla Androida (Beta)

Użycie wyspecjalizowanych procesorów, takich jak procesory graficzne, NPU lub procesory DSP do przyspieszania sprzętowego, może radykalnie poprawić wydajność wnioskowania (w niektórych przypadkach nawet 10 razy szybsze wnioskowanie) i wygodę użytkowania aplikacji dla systemu Android obsługującej technologię ML. Biorąc jednak pod uwagę różnorodność sprzętu i sterowników, jakie mogą mieć użytkownicy, wybranie optymalnej konfiguracji akceleracji sprzętowej dla każdego urządzenia użytkownika może być wyzwaniem. Co więcej, włączenie nieprawidłowej konfiguracji na urządzeniu może pogorszyć komfort użytkownika ze względu na duże opóźnienia lub, w niektórych rzadkich przypadkach, błędy w czasie wykonywania lub problemy z dokładnością spowodowane niezgodnością sprzętu.

Usługa akceleracji dla systemu Android to interfejs API, który pomaga wybrać optymalną konfigurację akceleracji sprzętowej dla danego urządzenia użytkownika i modelu .tflite , minimalizując jednocześnie ryzyko błędów w czasie wykonywania lub problemów z dokładnością.

Usługa akceleracji ocenia różne konfiguracje akceleracji na urządzeniach użytkowników, uruchamiając wewnętrzne testy porównawcze wnioskowania z modelem TensorFlow Lite. Te przebiegi testowe trwają zwykle kilka sekund, w zależności od modelu. Możesz uruchomić testy porównawcze raz na każdym urządzeniu użytkownika przed czasem wnioskowania, zapisać wynik w pamięci podręcznej i wykorzystać go podczas wnioskowania. Te testy porównawcze są uruchamiane poza procesem; co minimalizuje ryzyko awarii aplikacji.

Podaj swój model, próbki danych i oczekiwane wyniki („złote” dane wejściowe i wyjściowe), a usługa Acceleration Service przeprowadzi wewnętrzny test porównawczy wnioskowania TFLite, aby zapewnić rekomendacje dotyczące sprzętu.

obraz

Usługa przyspieszania jest częścią niestandardowego stosu ML systemu Android i współpracuje z TensorFlow Lite w usługach Google Play .

Dodaj zależności do swojego projektu

Dodaj następujące zależności do pliku build.gradle swojej aplikacji:

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

Interfejs API usługi przyspieszenia współpracuje z TensorFlow Lite w Usługach Google Play . Jeśli nie korzystasz jeszcze ze środowiska wykonawczego TensorFlow Lite udostępnianego przez Usługi Play, będziesz musiał zaktualizować swoje zależności .

Jak korzystać z API usługi Acceleration

Aby skorzystać z usługi akceleracji, zacznij od utworzenia konfiguracji akceleracji, którą chcesz ocenić dla swojego modelu (np. GPU z OpenGL). Następnie utwórz konfigurację walidacyjną ze swoim modelem, przykładowymi danymi i oczekiwanymi wynikami modelu. Na koniec wywołaj validateConfig() przekazując zarówno konfigurację akceleracji, jak i konfigurację sprawdzania poprawności.

obraz

Utwórz konfiguracje przyspieszenia

Konfiguracje akceleracji są reprezentacjami konfiguracji sprzętowych, które są tłumaczone na delegaty w czasie wykonywania. Usługa akceleracji użyje następnie tych konfiguracji wewnętrznie do przeprowadzenia wniosków testowych.

W tej chwili usługa akceleracji umożliwia ocenę konfiguracji GPU (przekonwertowanych na delegata GPU w czasie wykonywania) za pomocą GpuAccelerationConfig i wnioskowania o procesorze (za pomocą CpuAccelerationConfig ). Pracujemy nad umożliwieniem większej liczbie delegatów dostępu do innego sprzętu w przyszłości.

Konfiguracja akceleracji GPU

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

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

Musisz określić, czy Twój model używa kwantyzacji za pomocą setEnableQuantizedInference() .

Konfiguracja przyspieszenia procesora

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

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

Użyj metody setNumThreads() , aby zdefiniować liczbę wątków, których chcesz użyć do oceny wnioskowania o procesorze.

Utwórz konfiguracje walidacyjne

Konfiguracje walidacji umożliwiają zdefiniowanie sposobu, w jaki usługa akceleracji ma oceniać wnioski. Wykorzystasz je do przekazania:

  • próbki wejściowe,
  • oczekiwane wyniki,
  • logika sprawdzania dokładności.

Upewnij się, że podałeś próbki wejściowe, od których oczekujesz dobrego działania swojego modelu (zwane również „złotymi” próbkami).

Utwórz ValidationConfig za pomocą 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 wejściowe swoich złotych próbek za pomocą setGoldenInputs() . Podaj oczekiwany wynik dla danych wejściowych przekazanych za pomocą setGoldenOutputs() .

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

Opcjonalnie możesz także 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;

   }
}

Pamiętaj, aby zdefiniować logikę walidacji, która działa w Twoim przypadku użycia.

Należy pamiętać, że jeśli dane sprawdzające są już osadzone w modelu, można użyć EmbeddedValidationConfig .

Generuj wyniki walidacji

Złote wyniki są opcjonalne i pod warunkiem, że zapewnisz złote wyniki, Usługa akceleracji może wewnętrznie wygenerować złote wyniki. Możesz także zdefiniować konfigurację akceleracji używaną do generowania tych złotych wyników, wywołując setGoldenConfig() :

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

Sprawdź konfigurację przyspieszenia

Po utworzeniu konfiguracji akceleracji i konfiguracji sprawdzania poprawności możesz je ocenić pod kątem swojego modelu.

Upewnij się, że środowisko wykonawcze TensorFlow Lite z usługami Play zostało poprawnie zainicjowane i że delegat GPU jest dostępny dla urządzenia, uruchamiając:

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

Utwórz instancję AccelerationService , wywołując AccelerationService.create() .

Następnie możesz sprawdzić konfigurację akceleracji dla 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żna także sprawdzić poprawność wielu konfiguracji, wywołując funkcję validateConfigs() i przekazując obiekt Iterable<AccelerationConfig> jako parametr.

validateConfig() zwróci Task< ValidatedAccelerationConfigResult interfejsu API zadań usług Google Play > który umożliwia zadania asynchroniczne.
Aby uzyskać wynik wywołania sprawdzającego, dodaj wywołanie zwrotne addOnSuccessListener() .

Użyj zweryfikowanej konfiguracji w swoim interpreterze

Po sprawdzeniu, czy ValidatedAccelerationConfigResult zwrócony w wywołaniu zwrotnym jest prawidłowy, możesz ustawić zweryfikowaną konfigurację jako konfigurację akceleracji dla swojego interpretera wywołującego interpreterOptions.setAccelerationConfig() .

Buforowanie konfiguracji

Jest mało prawdopodobne, aby optymalna konfiguracja przyspieszenia dla Twojego modelu uległa zmianie na urządzeniu. Kiedy więc otrzymasz satysfakcjonującą konfigurację akceleracji, powinieneś zapisać ją na urządzeniu i pozwolić aplikacji ją odzyskać, a następnie użyć jej do utworzenia InterpreterOptions podczas kolejnych sesji, zamiast przeprowadzać kolejną weryfikację. Metody serialize() i deserialize() w ValidatedAccelerationConfigResult ułatwiają proces przechowywania i pobierania.

Przykładowa aplikacja

Aby zapoznać się z integracją usługi akceleracji na miejscu, zapoznaj się z przykładową aplikacją .

Ograniczenia

Usługa Akceleracji posiada aktualnie następujące ograniczenia:

  • W tej chwili obsługiwane są tylko konfiguracje akceleracji CPU i GPU,
  • Obsługuje tylko TensorFlow Lite w usługach Google Play i nie możesz z niego korzystać, jeśli korzystasz z dołączonej wersji TensorFlow Lite,
  • Nie obsługuje biblioteki zadań TensorFlow Lite, ponieważ nie można bezpośrednio zainicjować BaseOptions za pomocą obiektu ValidatedAccelerationConfigResult .
  • Zestaw SDK usługi przyspieszania obsługuje tylko poziom interfejsu API 22 i wyższy.

Zastrzeżenia

Zapoznaj się uważnie z poniższymi zastrzeżeniami, szczególnie jeśli planujesz używać tego zestawu SDK w środowisku produkcyjnym:

  • Przed opuszczeniem wersji beta i wydaniem stabilnej wersji interfejsu API usługi Acceleration Service opublikujemy nowy pakiet SDK, który może różnić się od aktualnej wersji beta. Aby nadal korzystać z usługi Acceleration Service, należy przeprowadzić migrację do nowego pakietu SDK i terminowo przesłać aktualizację do swojej aplikacji. Niezastosowanie się do tego może spowodować awarie, ponieważ po pewnym czasie pakiet SDK w wersji beta może nie być już kompatybilny z usługami Google Play.

  • Nie ma gwarancji, że określona funkcja interfejsu API usługi Acceleration Service lub interfejsu API jako całości stanie się kiedykolwiek ogólnie dostępna. Może pozostać w wersji beta na czas nieokreślony, zostać zamknięta lub połączona z innymi funkcjami w pakiety przeznaczone dla określonych odbiorców programistów. Niektóre funkcje interfejsu API usługi Acceleration Service lub cały interfejs API mogą ostatecznie stać się ogólnie dostępne, ale nie ma w tym zakresie ustalonego harmonogramu.

Warunki i prywatność

Warunki usługi

Korzystanie z interfejsów API usługi Acceleration Service podlega Warunkom korzystania z usług Google API .
Ponadto interfejsy API Usługi przyspieszania są obecnie w fazie beta i w związku z tym korzystanie z nich oznacza potwierdzenie potencjalnych problemów opisanych w sekcji Zastrzeżenia powyżej oraz fakt, że Usługa przyspieszenia może nie zawsze działać zgodnie ze specyfikacjami.

Prywatność

Gdy korzystasz z interfejsów API usługi Acceleration Service, przetwarzanie danych wejściowych (np. obrazów, wideo, tekstu) odbywa się w całości na urządzeniu, a usługa Acceleration Service nie wysyła tych danych do serwerów Google . Dzięki temu możesz wykorzystać nasze API do przetwarzania danych wejściowych, które nie powinny opuszczać urządzenia.
Interfejsy API usługi akceleracji mogą od czasu do czasu kontaktować się z serwerami Google, aby otrzymać poprawki błędów, zaktualizowane modele i informacje o zgodności akceleratorów sprzętowych. Interfejsy API usługi Acceleration Service wysyłają również do Google dane dotyczące wydajności i wykorzystania interfejsów API w Twojej aplikacji. Google wykorzystuje te dane do pomiaru wydajności, debugowania, utrzymywania i ulepszania interfejsów API oraz wykrywania nadużyć lub nadużyć, zgodnie z opisem w naszej Polityce prywatności .
Odpowiadasz za informowanie użytkowników Twojej aplikacji o przetwarzaniu przez Google danych metryk Usługi Acceleration zgodnie z wymogami obowiązującego prawa.
Gromadzone przez nas dane obejmują:

  • Informacje o urządzeniu (takie jak producent, model, wersja i kompilacja systemu operacyjnego) oraz dostępne akceleratory sprzętowe ML (GPU i DSP). Używany do diagnostyki i analizy użytkowania.
  • Informacje o aplikacji (nazwa pakietu / identyfikator pakietu, wersja aplikacji). Używany do diagnostyki i analizy użytkowania.
  • Konfiguracja API (np. format i rozdzielczość obrazu). Używany do diagnostyki i analizy użytkowania.
  • Typ zdarzenia (taki jak inicjowanie, pobieranie modelu, aktualizacja, uruchamianie, wykrywanie). Używany do diagnostyki i analizy użytkowania.
  • Kody błędów. Używany do diagnostyki.
  • Wskaźniki wydajności. Używany do diagnostyki.
  • Identyfikatory instalacji, które nie identyfikują jednoznacznie użytkownika ani urządzenia fizycznego. Służy do zdalnej konfiguracji i analizy użytkowania.
  • Adresy IP nadawców żądań sieciowych. Używany do zdalnej diagnostyki konfiguracji. Zebrane adresy IP są przechowywane tymczasowo.

Wsparcie i informacje zwrotne

Możesz przekazać opinię i uzyskać pomoc za pośrednictwem narzędzia do śledzenia problemów TensorFlow. Zgłaszaj problemy i prośby o pomoc, korzystając z szablonu problemu dla TensorFlow Lite w usługach Google Play.