Qualità del servizio

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, la quantità massima di tempo prevista per un determinato modello per la preparazione e la quantità massima di tempo prevista 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 non ha funzionato 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 priorità nell'NN HAL 1.3. Questa priorità è relativa agli altri modelli preparati di proprietà della stessa app. Le esecuzioni con priorità più alta possono utilizzare più risorse di calcolo rispetto alle esecuzioni con priorità inferiore e possono prerilasciare o annullare le esecuzioni con priorità inferiore.

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 per supportare le priorità, a seconda delle capacità del conducente e dell'acceleratore. Ecco alcune strategie:

  • Per i driver che hanno un supporto prioritario integrato, propaga direttamente il campo Priority all'acceleratore.
  • Utilizza una coda di priorità per app al fine di supportare diverse priorità anche prima che l'esecuzione raggiunga l'acceleratore.
  • Mettere in pausa o annullare i modelli a bassa priorità in esecuzione per liberare l'acceleratore e consentire l'esecuzione di modelli ad alta priorità. Per farlo, inserisci checkpoint nei modelli a bassa priorità che, una volta raggiunti, eseguono una query su un flag per determinare se l'esecuzione attuale deve essere interrotta prematuramente oppure partizionando il modello in modelli secondari ed eseguendo query sul flag tra le esecuzioni di un modello secondario. Tieni presente che l'utilizzo di punti di controllo o sottomodelli nei modelli preparati con una priorità può introdurre un overhead aggiuntivo non presente per i modelli senza priorità nelle versioni inferiori a NN HAL 1.3.

    • Per supportare il prerilascio, preserva il contesto di esecuzione, inclusi l'operazione o il sottomodello successivo da eseguire e tutti i dati operando intermedi pertinenti. Utilizza questo contesto di esecuzione per riprendere l'esecuzione in un secondo momento.
    • Non è necessario un supporto completo del prerilascio, quindi non è necessario conservare il contesto dell'esecuzione. Poiché le esecuzioni del modello NNAPI sono deterministiche, è possibile riavviarle da zero in un secondo momento.

Android consente ai servizi di distinguere le diverse app per le chiamate tramite l'uso di un AID (UID Android). HIDL ha meccanismi integrati per recuperare l'UID dell'app di chiamata tramite il metodo ::android::hardware::IPCThreadState::getCallingUid. Un elenco di AID è disponibile in libcutils/include/cutils/android_filesystem_config.h.

Scadenze

A partire da Android 11, la preparazione ed le esecuzioni del modello possono essere lanciate con un argomento Scadenza OptionalTimePoint. Per i conducenti in grado di stimare il tempo necessario per un'attività, questa scadenza consente al conducente di interromperla prima che inizi se il conducente stima che l'attività non può essere completata prima della scadenza. Analogamente, la scadenza consente al conducente di interrompere un'attività in corso che, secondo la stima, non verrà completata prima della scadenza. L'argomento scadenze non obbliga un driver a interrompere un'attività se l'attività non viene completata entro la scadenza o se la scadenza è trascorsa. L'argomento scadenza può essere utilizzato per liberare risorse di computing all'interno del driver e restituire il controllo all'app più velocemente di quanto sia possibile senza la scadenza.

Le chiamate NN HAL 1.3 che includono come argomento le scadenze OptionalTimePoint 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 sopra citati, 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 la segnalazione degli errori, consentendo ai conducenti di comunicare meglio il proprio stato e alle app di recuperare in modo più agevole. Questi sono i valori dei codici di errore in ErrorStatus.

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

In Android 10 o versioni precedenti, un driver potrebbe 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 carico di lavoro è stato interrotto perché è stata raggiunta la scadenza o perché il conducente ha previsto che il carico di lavoro 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 avere esito positivo dopo un breve ritardo. Ad esempio, questo codice di errore dovrebbe essere restituito quando il driver è occupato con operazioni precedenti a lunga esecuzione o che richiedono molte risorse, ma la nuova attività viene completata correttamente se il driver non è occupato con il lavoro precedente. La versione PERSISTENT di entrambi gli errori indica che le chiamate future alla stessa attività non andranno mai a buon fine. Ad esempio, questo codice di errore dovrebbe essere restituito quando il conducente stima che l'attività non verrebbe completata entro la scadenza anche in condizioni perfette o quando il modello è intrinsecamente troppo grande e supera le risorse del conducente.

Convalida

La funzionalità di qualità del servizio viene testata nei test NNAPI VTS (VtsHalNeuralnetworksV1_3Target). Questo include una serie di test di convalida (TestGenerated/ValidationTest#Test/) per garantire che il conducente rifiuti priorità non valide e una serie di test denominati DeadlineTest (TestGenerated/DeadlineTest#Test/) per garantire che il conducente gestisca correttamente le scadenze.