Jakość usługi

Od Androida 11 interfejs NNAPI oferuje lepszą jakość usług (QoS), umożliwiając aplikacji wskazanie względnych priorytetów swoich modeli, maksymalnego czasu potrzebnego na przygotowanie danego modelu oraz maksymalnego czasu potrzebnego na wykonanie danego zadania. Ponadto Android 11 wprowadza dodatkowe wartości błędów NNAPI, dzięki czemu usługa może dokładniej wskazywać, co poszło nie tak, gdy wystąpi błąd, aby aplikacja kliencka mogła lepiej reagować i odzyskiwać sprawność.

Priorytet

W Androidzie 11 lub nowszym modele są przygotowywane z priorytetem w NN HAL 1.3. Ten priorytet jest względny w stosunku do innych przygotowanych modeli należących do tej samej aplikacji. Zadania o wyższym priorytecie mogą korzystać z większej ilości zasobów obliczeniowych niż zadania o niższym priorytecie i mogą wyprzedzać lub blokować zadania o niższym priorytecie.

Wywołanie NN HAL 1.3, które zawiera Priority jako jawny argument, to IDevice::prepareModel_1_3. Pamiętaj, że IDevice::prepareModelFromCache_1_3 niejawnie zawiera Priority w argumentach pamięci podręcznej.

Istnieje wiele możliwych strategii obsługi priorytetów, w zależności od możliwości sterownika i akceleratora. Oto kilka strategii:

  • W przypadku sterowników, które mają wbudowaną obsługę priorytetów, bezpośrednio propaguj pole Priority do akceleratora.
  • Użyj kolejki priorytetowej dla każdej aplikacji, aby obsługiwać różne priorytety, zanim zadanie dotrze do akceleratora.
  • Wstrzymaj lub anuluj modele o niskim priorytecie, które są wykonywane, aby zwolnić akcelerator do wykonywania modeli o wysokim priorytecie. Możesz to zrobić, wstawiając punkty kontrolne w modelach o niskim priorytecie, które po osiągnięciu sprawdzają flagę, aby określić, czy bieżące zadanie powinno zostać przedwcześnie zatrzymane, lub dzieląc model na podmodele i sprawdzając flagę między wykonaniami podmodeli. Pamiętaj, że używanie 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 obsługiwać wyprzedzanie, zachowaj kontekst wykonania, w tym następną operację lub podmodel do wykonania oraz wszelkie odpowiednie dane operandów pośrednich. Użyj tego kontekstu wykonania, aby wznowić wykonanie w późniejszym czasie.
    • Pełna obsługa wyprzedzania nie jest konieczna, więc nie trzeba zachowywać kontekstu wykonania. Ponieważ wykonania modeli NNAPI są deterministyczne, można je później ponownie uruchomić od początku.

Android umożliwia usługom rozróżnianie różnych aplikacji wywołujących za pomocą identyfikatora AID (Android UID). HIDL ma wbudowane mechanizmy pobierania identyfikatora UID aplikacji wywołującej za pomocą metody ::android::hardware::IPCThreadState::getCallingUid. Listę identyfikatorów AID znajdziesz w libcutils/include/cutils/android_filesystem_config.h.

Terminy

Od Androida 11 przygotowanie modelu i wykonania można uruchamiać za pomocą argumentu terminu OptionalTimePoint. W przypadku sterowników, które mogą oszacować czas wykonania zadania, ten termin umożliwia sterownikowi przerwanie zadania przed jego rozpoczęciem, jeśli sterownik uzna, że zadanie nie może zostać ukończone przed upływem terminu. Podobnie termin umożliwia sterownikowi przerwanie trwającego zadania, które według niego nie zostanie ukończone przed upływem terminu. Argument terminu nie zmusza sterownika do przerwania zadania, jeśli nie zostanie ono ukończone przed upływem terminu lub jeśli termin minął. Argument terminu może służyć do zwalniania zasobów obliczeniowych w sterowniku i szybszego przekazywania kontroli do aplikacji niż jest to możliwe bez terminu.

Wywołania NN HAL 1.3, które zawierają terminy OptionalTimePoint jako argument, to:

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

Aby zobaczyć implementację referencyjną funkcji terminu dla każdej z powyższych metod, zapoznaj się z przykładowym sterownikiem NNAPI w frameworks/ml/nn/driver/sample/SampleDriver.cpp.

Kody błędów

Android 11 zawiera 4 wartości kodów błędów w NN HAL 1.3, aby poprawić raportowanie błędów, umożliwiając sterownikom lepsze informowanie o ich stanie, a aplikacjom – bardziej płynne odzyskiwanie sprawności. Są to wartości kodów błędów w ErrorStatus.

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

W Androidzie 10 lub starszym sterownik mógł wskazywać błąd tylko za pomocą kodu błędu GENERAL_FAILURE. Od Androida 11 można używać 2 kodów błędów MISSED_DEADLINE, aby wskazać, że zadanie zostało przerwane, ponieważ upłynął termin lub sterownik przewidział, że zadanie nie zostanie ukończone przed upływem terminu. 2 kody błędów RESOURCE_EXHAUSTED mogą służyć do wskazywania, że zadanie nie powiodło się z powodu ograniczenia zasobów w sterowniku, np. sterownik nie ma wystarczającej ilości pamięci na wywołanie.

Wersja TRANSIENT obu błędów wskazuje, że problem jest tymczasowy i że przyszłe wywołania tego samego zadania mogą się powieść po krótkiej przerwie. Na przykład ten kod błędu powinien być zwracany, gdy sterownik jest zajęty poprzednim długotrwałym lub wymagającym dużych zasobów zadaniem, ale nowe zadanie zostanie wykonane pomyślnie, jeśli sterownik nie będzie zajęty poprzednim zadaniem. Wersja PERSISTENT obu błędów wskazuje, że przyszłe wywołania tego samego zadania zawsze będą się kończyć niepowodzeniem. Na przykład ten kod błędu powinien być zwracany, gdy sterownik uzna, że zadanie nie zostanie ukończone przed upływem terminu nawet w idealnych warunkach lub że model jest zbyt duży i przekracza zasoby sterownika.

Weryfikacja

Funkcja jakości usług jest testowana w testach NNAPI VTS (VtsHalNeuralnetworksV1_3Target). Obejmuje to zestaw testów weryfikacji (TestGenerated/ValidationTest#Test/), które zapewniają, że sterownik odrzuca nieprawidłowe priorytety, oraz zestaw testów o nazwie DeadlineTest (TestGenerated/DeadlineTest#Test/), które zapewniają, że sterownik prawidłowo obsługuje terminy.