A partire da Android 11, la NNAPI offre una migliore qualità del servizio (QoS) consentendo a un'app di indicare le priorità relative dei suoi modelli, il tempo massimo previsto per la preparazione di un determinato modello e il tempo massimo previsto per il completamento di una determinata esecuzione. Inoltre, Android 11 introduce valori di errore NNAPI aggiuntivi che consentono a un servizio di indicare con maggiore precisione cosa è andato storto quando si verifica un errore, in modo che l'app client possa reagire e recuperare meglio.
Priorità
Per Android 11 o versioni successive, i modelli vengono preparati con una priorità in NN HAL 1.3. Questa priorità è relativa ad altri modelli preparati di proprietà della stessa app. Le esecuzioni con priorità più alta possono utilizzare più risorse di calcolo rispetto a quelle con priorità più bassa e possono interrompere o bloccare quelle con priorità più bassa.
La chiamata NN HAL 1.3 che include Priority
come argomento esplicito è
IDevice::prepareModel_1_3
.
Tieni presente che
IDevice::prepareModelFromCache_1_3
include implicitamente Priority
negli argomenti della cache.
Esistono molte strategie possibili per supportare le priorità a seconda delle funzionalità del driver e dell'acceleratore. Ecco alcune strategie:
- Per i conducenti che dispongono di assistenza prioritaria integrata, propaga direttamente
il campo
Priority
all'acceleratore. - Utilizza una coda di priorità per app per supportare priorità diverse anche prima che un'esecuzione raggiunga l'acceleratore.
Metti in pausa o annulla i modelli a bassa priorità in esecuzione per liberare l'acceleratore per eseguire i modelli ad alta priorità. A questo scopo, puoi inserire checkpoint nei modelli a bassa priorità che, una volta raggiunti, eseguono query su un flag per determinare se l'esecuzione corrente deve essere interrotta prematuramente oppure partizionare il modello in sottomodelli ed eseguire query sul flag tra le esecuzioni dei sottomodelli. Tieni presente che l'utilizzo di checkpoint o sottomodelli nei modelli preparati con una priorità può introdurre un overhead aggiuntivo che non è presente nei modelli senza priorità nelle versioni inferiori a NN HAL 1.3.
- Per supportare la preemption, conserva il contesto di esecuzione inclusa la successiva operazione o il successivo sottomodello da eseguire e tutti i dati dell'operando intermedio pertinenti. Utilizza questo contesto di esecuzione per riprendere l'esecuzione in un secondo momento.
- Il supporto completo della preemption non è necessario, quindi il contesto di esecuzione non deve essere conservato. Poiché le esecuzioni del modello NNAPI sono deterministiche, possono essere riavviate da zero in un secondo momento.
Android consente ai servizi di distinguere le diverse app di chiamata tramite
l'utilizzo di un AID (Android UID). HIDL dispone di meccanismi integrati per recuperare l'UID dell'app chiamante tramite il metodo ::android::hardware::IPCThreadState::getCallingUid
. Un elenco di ID account può essere trovato in libcutils/include/cutils/android_filesystem_config.h
.
Scadenze
A partire da Android 11, la preparazione e l'esecuzione dei modelli possono essere avviate con un argomento di scadenza OptionalTimePoint
. Per
i conducenti che possono stimare la durata di un'attività, questa scadenza consente al conducente
di interrompere l'attività prima che inizi se stima che non possa
essere completata prima della scadenza. Allo stesso modo, la scadenza consente al driver di
interrompere un'attività in corso che stima non verrà completata prima della scadenza.
L'argomento scadenza non forza un autista ad abbandonare un'attività se non è
completata entro la scadenza o se la scadenza è passata. L'argomento deadline
può essere utilizzato per liberare risorse di calcolo all'interno del driver e restituire il controllo
all'app più rapidamente di quanto sia possibile senza la scadenza.
Le chiamate NN HAL 1.3 che includono scadenze OptionalTimePoint
come argomento sono:
IDevice::prepareModel_1_3
IDevice::prepareModelFromCache_1_3
IPreparedModel::execute_1_3
IPreparedModel::executeSynchronously_1_3
IPreparedModel::executeFenced
Per visualizzare un'implementazione di riferimento della funzionalità di scadenza per ciascuno dei metodi precedenti, consulta il driver di esempio NNAPI all'indirizzo frameworks/ml/nn/driver/sample/SampleDriver.cpp
.
Codici di errore
Android 11 include quattro valori di codice di errore in
NN HAL 1.3 per migliorare i report sugli errori, consentendo ai conducenti di comunicare meglio
il loro stato e alle app di ripristinarsi in modo più elegante. Questi sono i valori del codice di errore
in ErrorStatus
.
MISSED_DEADLINE_TRANSIENT
MISSED_DEADLINE_PERSISTENT
RESOURCE_EXHAUSTED_TRANSIENT
RESOURCE_EXHAUSTED_PERSISTENT
In Android 10 o versioni precedenti, un driver poteva indicare un errore solo tramite il
codice di errore GENERAL_FAILURE
. A partire da Android 11, i
due codici di errore MISSED_DEADLINE
possono essere utilizzati per indicare che il workload è stato
interrotto perché è stata raggiunta la scadenza o perché il driver ha previsto che il
workload non sarebbe stato completato entro la scadenza. I due codici di errore RESOURCE_EXHAUSTED
possono essere utilizzati per indicare che l'attività non è riuscita a causa di una limitazione delle risorse all'interno del driver, ad esempio il driver non ha memoria sufficiente per la chiamata.
La versione TRANSIENT
di entrambi gli errori indica che il problema è temporaneo
e che le chiamate future alla stessa attività potrebbero riuscire dopo un breve ritardo. Ad esempio, questo codice di errore deve essere restituito quando il driver è occupato con un lavoro precedente a esecuzione prolungata o che richiede molte risorse, ma la nuova attività verrebbe completata correttamente se il driver non fosse occupato con il lavoro precedente. La versione PERSISTENT
di entrambi gli errori indica che le chiamate future alla stessa attività
dovrebbero sempre non riuscire. Ad esempio, questo codice di errore deve essere restituito quando il
driver stima che l'attività non verrà completata entro la scadenza anche in condizioni
perfette oppure che il modello è intrinsecamente troppo grande e supera le
risorse del driver.
Convalida
La funzionalità di qualità del servizio viene testata nei test VTS di NNAPI
(VtsHalNeuralnetworksV1_3Target
). Sono inclusi un insieme di test per la convalida
(TestGenerated/ValidationTest#Test/
) per garantire che il driver rifiuti le priorità non valide e un insieme di test denominati DeadlineTest
(TestGenerated/DeadlineTest#Test/
) per garantire che il driver gestisca correttamente le scadenze.