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.
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.
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ą obiektuValidatedAccelerationConfigResult
. - 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.