A partir de Android 11, NNAPI incluye dos operaciones de flujo de control, IF
y WHILE
, que toman otros modelos como argumentos y los ejecutan condicionalmente ( IF
) o repetidamente ( WHILE
). Esto permite construir modelos que ejecutan diferentes operaciones según los valores de entrada o ejecutan operaciones varias veces sin desenrollarse. Esto es importante para casos de uso como RNN dinámico y seq2seq.
En NN HAL 1.3, el modelo incorpora múltiples subgrafos, incluido el subgrafo principal que se utiliza para especificar entradas y salidas de una ejecución. Un subgrafo puede hacer referencia a otros subgrafos utilizando operandos de tipo SUBGRAPH
. El marco puede enviar una operación de flujo de control a un acelerador solo si el acelerador admite todas las operaciones en todos los subgrafos a los que hace referencia esa operación de flujo de control.
Interfaces HAL
En NN HAL 1.3, las definiciones relacionadas con el flujo de control están en types.hal
.
- Tipos de operación
IF
yWHILE
- Tipo de operando
SUBGRAPH
y duración del operandoSUBGRAPH
correspondiente - Estructura
Model
que contiene el subgrafo principal y una lista de subgrafos referenciados. - Estructura
Capabilities
que contieneifPerformance
ywhilePerformance
IDevice.hal
contiene IDevice
, cuyo método getSupportedOperations_1_3()
debe tratar IF
y WHILE
de manera diferente a otras operaciones.
IPreparedModel.hal
contiene IPreparedModel
, cuyos métodos execute_1_3()
, executeSynchronously_1_3()
y executeFenced()
toman un argumento loopTimeoutDuration
opcional.
Implementación del controlador
Para ver una implementación de operación de ejemplo, consulte CpuExecutor::executeIfOperation
y CpuExecutor::executeWhileOperation
. Para ver un ejemplo de lógica de validación de operaciones, consulte validateIfOperation()
y validateWhileOperation()
.
Tenga en cuenta que es importante admitir operaciones aritméticas y de comparación en operandos TENSOR_INT32
de forma 1
, ya que se pueden utilizar como contadores de bucle. De manera similar, las operaciones que producen operandos TENSOR_BOOL8
de forma 1
deben usarse con condiciones IF
y WHILE
.
Mientras se agota el tiempo de ejecución del bucle
Para evitar bucles infinitos, se debe cancelar la ejecución si un bucle WHILE
tarda más que el valor loopTimeoutDuration
pasado a una llamada de IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
o IPreparedModel::executeFenced()
(o el valor predeterminado si se omite).
Validación
Las pruebas de flujo de control son parte de los conjuntos de pruebas CTS y VTS. Para obtener más información, consulte Validación .