Jakość usługi

Począwszy od Androida 11, NNAPI oferuje lepszą jakość usług (QoS), umożliwiając aplikacji wskazanie względnych priorytetów swoich modeli, maksymalnego czasu oczekiwanego na przygotowanie danego modelu oraz maksymalnego czasu oczekiwanego dane wykonanie do wykonania. Co więcej, w systemie Android 11 wprowadzono dodatkowe wartości błędów NNAPI, dzięki czemu usługa może dokładniej wskazać, co poszło nie tak w przypadku wystąpienia awarii, dzięki czemu aplikacja kliencka może lepiej reagować i przywracać działanie.

Priorytet

Dla Androida 11 lub wyższego modele przygotowane są z priorytetem w NN HAL 1.3. Ten priorytet jest zależny od innych przygotowanych modeli należących do tej samej aplikacji. Wykonania o wyższym priorytecie mogą zużywać więcej zasobów obliczeniowych niż wykonania o niższym priorytecie i mogą wyprzedzić lub zablokować wykonania o niższym priorytecie.

Wywołanie NN HAL 1.3, które zawiera Priority jako jawny argument, to IDevice::prepareModel_1_3 . Należy zauważyć, że IDevice::prepareModelFromCache_1_3 domyślnie zawiera Priority w argumentach pamięci podręcznej.

Istnieje wiele możliwych strategii wspierania priorytetów w zależności od możliwości kierowcy i akceleratora. Oto kilka strategii:

  • W przypadku sterowników, które mają wbudowaną obsługę priorytetów, należy bezpośrednio propagować pole Priority do akceleratora.
  • Użyj kolejki priorytetów dla aplikacji, aby obsługiwać różne priorytety nawet zanim wykonanie dotrze do akceleratora.
  • Wstrzymaj lub anuluj wykonywane modele o niskim priorytecie, aby zwolnić akcelerator do wykonywania modeli o wysokim priorytecie. Można to zrobić albo wstawiając punkty kontrolne do modeli o niskim priorytecie, które po osiągnięciu wysyłają zapytanie do flagi w celu ustalenia, czy bieżące wykonanie powinno zostać przedwcześnie zatrzymane, albo dzieląc model na podmodele i sprawdzając flagę pomiędzy wykonaniami podmodeli. Należy pamiętać, że użycie punktów kontrolnych lub podmodeli w modelach przygotowanych z priorytetem może wprowadzić dodatkowe obciążenie, które nie występuje w przypadku modeli bez priorytetu w wersjach niższych niż NN HAL 1.3.

    • Aby wesprzeć wywłaszczanie, zachowaj kontekst wykonania, w tym następną operację lub podmodel, który ma zostać wykonany, oraz wszelkie istotne dane pośredniego argumentu. Użyj tego kontekstu wykonania, aby wznowić wykonywanie w późniejszym czasie.
    • Pełna obsługa wywłaszczania nie jest konieczna, więc nie trzeba zachowywać kontekstu wykonania. Ponieważ wykonania modelu NNAPI są deterministyczne, wykonania można później rozpocząć od nowa.

Android umożliwia usługom rozróżnianie różnych aplikacji do połączeń za pomocą AID (Android UID). HIDL ma wbudowane mechanizmy pobierania identyfikatora UID aplikacji wywołującej za pomocą metody ::android::hardware::IPCThreadState::getCallingUid . Listę identyfikatorów pomocy można znaleźć w libcutils/include/cutils/android_filesystem_config.h .

Terminy

Począwszy od systemu Android 11, przygotowanie i wykonanie modelu można uruchomić za pomocą argumentu terminu OptionalTimePoint . W przypadku kierowców, którzy potrafią oszacować czas trwania zadania, termin ten umożliwia kierowcy przerwanie zadania przed jego rozpoczęciem, jeśli kierowca oceni, że zadania nie uda się ukończyć przed upływem terminu. Podobnie termin pozwala kierowcy przerwać trwające zadanie, które według niego nie zostanie ukończone przed upływem terminu. Argument terminu nie zmusza kierowcy do przerwania zadania, jeśli zadanie nie zostanie ukończone w wyznaczonym terminie lub jeśli termin minął. Argumentu terminu można użyć do zwolnienia zasobów obliczeniowych sterownika i przywrócenia kontroli do aplikacji szybciej, niż jest to możliwe bez terminu.

Wywołania NN HAL 1.3 zawierające jako argument terminy OptionalTimePoint to:

  • IDevice::prepareModel_1_3
  • IDevice::prepareModelFromCache_1_3
  • IPreparedModel::execute_1_3
  • IPreparedModel::executeSynchronously_1_3
  • IPreparedModel::executeFenced

Aby zobaczyć referencyjną implementację funkcji terminu ostatecznego dla każdej z powyższych metod, zobacz przykładowy sterownik NNAPI pod frameworks/ml/nn/driver/sample/SampleDriver.cpp .

Kody błędów

Android 11 zawiera cztery wartości kodów błędów w NN HAL 1.3, aby usprawnić raportowanie błędów, umożliwiając kierowcom lepsze informowanie o swoim stanie, a aplikacjom szybsze odzyskiwanie. Są to wartości kodów błędów w ErrorStatus .

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

W systemie Android 10 lub starszym sterownik może sygnalizować awarię jedynie za pomocą kodu błędu GENERAL_FAILURE . W systemie Android 11 dwa kody błędów MISSED_DEADLINE mogą służyć do wskazania, że ​​zadanie zostało przerwane z powodu upływu terminu lub dlatego, że kierowca przewidział, że zadanie nie zostanie ukończone w wyznaczonym terminie. Dwa kody błędów RESOURCE_EXHAUSTED mogą służyć do wskazania, że ​​zadanie nie powiodło się z powodu ograniczeń zasobów w sterowniku, na przykład braku pamięci sterownika na potrzeby połączenia.

Wersja TRANSIENT obu błędów wskazuje, że problem jest tymczasowy i że przyszłe wywołania tego samego zadania mogą zakończyć się sukcesem po krótkim opóźnieniu. Na przykład ten kod błędu powinien zostać zwrócony, gdy kierowca jest zajęty wcześniejszą, długotrwałą lub wymagającą dużych zasobów pracą, ale nowe zadanie zakończy się pomyślnie, jeśli kierowca nie będzie zajęty poprzednią pracą. Wersja PERSISTENT obu błędów wskazuje, że przyszłe wywołania tego samego zadania zawsze kończą się niepowodzeniem. Na przykład ten kod błędu powinien zostać zwrócony, gdy kierowca oszacuje, że zadanie nie zostanie ukończone w terminie nawet w idealnych warunkach lub że model jest z natury zbyt duży i przekracza zasoby kierowcy.

Walidacja

Jakość funkcjonalności usługi jest testowana w testach NNAPI VTS ( VtsHalNeuralnetworksV1_3Target ). Obejmuje to zestaw testów do walidacji ( TestGenerated/ValidationTest#Test/ ), aby upewnić się, że sterownik odrzuci nieprawidłowe priorytety oraz zestaw testów o nazwie DeadlineTest ( TestGenerated/DeadlineTest#Test/ ), aby upewnić się, że sterownik prawidłowo obsługuje terminy.