Usługa przyspieszenia dla systemu Android (Beta)

Wykorzystanie wyspecjalizowanych procesorów, takich jak GPU, NPU lub DSP do akceleracji sprzętowej, może radykalnie poprawić wydajność wnioskowania (w niektórych przypadkach nawet 10-krotnie szybsze wnioskowanie) oraz wygodę użytkownika aplikacji na Androida obsługującej uczenie maszynowe. Jednak biorąc pod uwagę różnorodność sprzętu i sterowników, jakie mogą mieć Twoi użytkownicy, wybór optymalnej konfiguracji akceleracji sprzętowej dla urządzenia każdego użytkownika może być wyzwaniem. Co więcej, włączenie niewłaściwej konfiguracji na urządzeniu może pogorszyć wrażenia użytkownika z powodu dużych opóźnień lub, w niektórych rzadkich przypadkach, błędów w czasie wykonywania lub problemów z dokładnością spowodowanych niezgodnością sprzętu.

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

Usługa przyspieszania ocenia różne konfiguracje przyspieszenia na urządzeniach użytkowników, przeprowadzając wewnętrzne testy porównawcze wnioskowania z modelem TensorFlow Lite. Te przebiegi testowe zwykle kończą się w ciągu kilku 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 użyć 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 przedstawić zalecenia dotyczące sprzętu.

obraz

Usługa Acceleration 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 aplikacji:

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

Interfejs API usługi Acceleration współpracuje z TensorFlow Lite w Usługach Google Play . Jeśli nie korzystasz jeszcze ze środowiska uruchomieniowego TensorFlow Lite dostępnego w Usługach Play, musisz zaktualizować zależności .

Jak korzystać z interfejsu API usługi Acceleration

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

obraz

Twórz konfiguracje akceleracji

Konfiguracje przyspieszenia to reprezentacje konfiguracji sprzętowych, które są tłumaczone na delegatów w czasie wykonywania. Usługa Acceleration użyje następnie tych konfiguracji wewnętrznie do przeprowadzenia wnioskowania testowego.

W tej chwili usługa akceleracji umożliwia ocenę konfiguracji GPU (przekonwertowanych na delegata GPU w czasie wykonywania) za pomocą wnioskowania GpuAccelerationConfig i procesora (z 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 z setEnableQuantizedInference() .

Konfiguracja akceleracji procesora

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

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

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

Utwórz konfiguracje sprawdzania poprawności

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

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

Upewnij się, że podałeś próbki wejściowe, dla których oczekujesz dobrej wydajności swojego modelu (znane również jako „złote” próbki).

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 oczekiwane dane wyjściowe dla danych wejściowych przekazanych za pomocą setGoldenOutputs() .

Możesz zdefiniować maksymalny czas wnioskowania za pomocą setInferenceTimeoutMillis() (domyślnie 5000 ms). Jeśli wnioskowanie potrwa dłużej niż określony czas, konfiguracja zostanie odrzucona.

Opcjonalnie możesz również 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;

   }
}

Upewnij się, że zdefiniowałeś logikę sprawdzania poprawności, która działa w twoim przypadku użycia.

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

Generuj dane wyjściowe walidacji

Złote dane wyjściowe są opcjonalne i dopóki udostępniasz złote dane wejściowe, Usługa Acceleration może wewnętrznie generować złote dane wyjściowe. Możesz także zdefiniować konfigurację przyspieszenia 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 walidacji możesz ocenić je dla swojego modelu.

Upewnij się, że środowisko uruchomieniowe TensorFlow Lite z Usługami Play jest 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 zweryfikować konfigurację przyspieszenia 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 również sprawdzić poprawność wielu konfiguracji, wywołując validateConfigs() i przekazując obiekt Iterable<AccelerationConfig> jako parametr.

validateConfig() zwróci Task< ValidatedAccelerationConfigResult > z usługi Google Play Task Api , która umożliwia zadania asynchroniczne.
Aby uzyskać wynik wywołania sprawdzania poprawności, dodaj wywołanie zwrotne addOnSuccessListener() .

Użyj zweryfikowanej konfiguracji w swoim tłumaczu

Po sprawdzeniu, czy wartość ValidatedAccelerationConfigResult zwrócona w wywołaniu zwrotnym jest prawidłowa, możesz ustawić zweryfikowaną konfigurację jako konfigurację przyspieszenia dla tłumacza 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 pobrać ją i użyć jej do stworzenia InterpreterOptions podczas kolejnych sesji, zamiast przeprowadzać kolejną walidację. Metody serialize() i deserialize() w ValidatedAccelerationConfigResult ułatwiają proces przechowywania i pobierania.

Przykładowa aplikacja

Aby zapoznać się z integracją in-situ usługi Acceleration, spójrz na przykładową aplikację .

Ograniczenia

Usługa Acceleration ma obecnie następujące ograniczenia:

  • W tej chwili obsługiwane są tylko konfiguracje akceleracji procesora i karty graficznej,
  • 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 Acceleration obsługuje tylko interfejs API na poziomie 22 i wyższym.

Zastrzeżenia

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

  • Przed wyjściem z wersji Beta i wydaniem stabilnej wersji interfejsu API usługi Acceleration opublikujemy nowy zestaw SDK, który może różnić się nieco od aktualnego pakietu Beta. Aby nadal korzystać z usługi Acceleration, musisz przeprowadzić migrację do tego nowego pakietu SDK i w odpowiednim czasie przesłać aktualizację do swojej aplikacji. Niezastosowanie się do tego zalecenia może spowodować awarie, ponieważ pakiet Beta SDK może po pewnym czasie przestać być zgodny z usługami Google Play.

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

Warunki i prywatność

Warunki usługi

Korzystanie z interfejsów API usługi Acceleration podlega Warunkom korzystania z interfejsów API firmy Google .
Ponadto interfejsy API usługi Acceleration są obecnie w wersji beta i w związku z tym korzystanie z nich jest równoznaczne z akceptacją potencjalnych problemów opisanych w sekcji Zastrzeżenia powyżej oraz przyjmuje do wiadomości, że usługa Acceleration może nie zawsze działać zgodnie z opisem.

Prywatność

Gdy korzystasz z interfejsów API usługi Acceleration, przetwarzanie danych wejściowych (np. obrazów, wideo, tekstu) 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żesz wykorzystać nasze 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 celu otrzymania takich rzeczy, jak poprawki błędów, zaktualizowane modele i informacje o zgodności akceleratorów sprzętowych. Interfejsy API usługi Acceleration wysyłają też do Google dane dotyczące wydajności i wykorzystania interfejsów API w Twojej aplikacji. Google używa tych danych pomiarowych do mierzenia wydajności, debugowania, utrzymywania i ulepszania interfejsów API oraz wykrywania niewłaściwego użycia lub nadużycia, zgodnie ze szczegółowym opisem w naszej Polityce prywatności .
Odpowiadasz za informowanie użytkowników swojej 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 analiz użytkowania.
  • Informacje o aplikacji (nazwa pakietu / identyfikator pakietu, wersja aplikacji). Używany do diagnostyki i analiz użytkowania.
  • Konfiguracja interfejsu API (taka jak format i rozdzielczość obrazu). Używany do diagnostyki i analiz użytkowania.
  • Typ zdarzenia (taki jak zainicjowanie, pobranie modelu, aktualizacja, uruchomienie, wykrycie). Używany do diagnostyki i analiz użytkowania.
  • Kody błędów. Służy do diagnostyki.
  • Wskaźniki wydajności. Służy do diagnostyki.
  • Identyfikatory poszczególnych instalacji, które nie identyfikują jednoznacznie użytkownika ani urządzenia fizycznego. Służy do obsługi zdalnej konfiguracji i analizy użytkowania.
  • Adresy IP nadawcy żądań sieciowych. Służy do zdalnej diagnostyki konfiguracji. Zebrane adresy IP są przechowywane tymczasowo.

Wsparcie i opinie

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