À partir d'Android 11, NNAPI inclut deux opérations de flux de contrôle, IF
et WHILE
, qui prennent d'autres modèles comme arguments et les exécutent de manière conditionnelle (IF
) ou répétée (WHILE
). Cela permet de créer des modèles qui exécutent différentes opérations en fonction des valeurs d'entrée ou d'exécuter des opérations plusieurs fois sans dérouler. Ceci est important pour les cas d'utilisation tels que les RNN dynamiques et seq2seq.
Dans NN HAL 1.3, le modèle intègre plusieurs sous-graphiques, y compris le sous-graphique principal utilisé pour spécifier les entrées et les sorties d'une exécution. Un sous-graphique peut faire référence à d'autres sous-graphiques à l'aide d'opérandes de type SUBGRAPH
. Le framework ne peut envoyer une opération de flux de contrôle à un accélérateur que si l'accélérateur est compatible avec toutes les opérations de tous les sous-graphiques référencés par cette opération de flux de contrôle.
Interfaces HAL
Dans NN HAL 1.3, les définitions liées au flux de contrôle se trouvent dans types.hal
.
- Types d'opérations
IF
etWHILE
- Type d'opérande
SUBGRAPH
et durée de vie de l'opérandeSUBGRAPH
correspondante - Structure
Model
contenant le sous-graphique principal et une liste de sous-graphiques référencés - Structure
Capabilities
contenantifPerformance
etwhilePerformance
IDevice.hal
contient IDevice
, dont la méthode getSupportedOperations_1_3()
doit traiter IF
et WHILE
différemment des autres opérations.
IPreparedModel.hal
contient IPreparedModel
, dont les méthodes execute_1_3()
, executeSynchronously_1_3()
et executeFenced()
acceptent un argument loopTimeoutDuration
facultatif.
Implémentation du pilote
Pour obtenir un exemple d'implémentation d'opération, consultez CpuExecutor::executeIfOperation
et CpuExecutor::executeWhileOperation
.
Pour obtenir un exemple de logique de validation d'opération, consultez validateIfOperation()
et validateWhileOperation()
.
Notez qu'il est important de prendre en charge les opérations arithmétiques et de comparaison sur les opérandes TENSOR_INT32
de forme 1
, car ils peuvent être utilisés comme compteurs de boucle.
De même, les opérations produisant des opérandes TENSOR_BOOL8
de la forme 1
doivent être utilisées avec les conditions IF
et WHILE
.
Délai d'expiration de l'exécution de la boucle WHILE
Pour éviter les boucles infinies, l'exécution doit être annulée si une boucle WHILE
prend plus de temps que la valeur loopTimeoutDuration
transmise à un appel de IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
ou IPreparedModel::executeFenced()
(ou la valeur par défaut si elle est omise).
Validation
Les tests de flux de contrôle font partie des suites de test CTS et VTS. Pour en savoir plus, consultez la section Validation.