Flujo de control

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 de forma condicional (IF) o repetida (WHILE). Esto permite construir modelos que ejecuten diferentes operaciones en función de los valores de entrada o ejecuten operaciones varias veces sin desenrollarse. Esto es importante para casos de uso como RNN dinámica y seq2seq.

En NN HAL 1.3, el modelo incorpora varios subgrafos, incluido el subgrafo principal que se usa para especificar las entradas y salidas de una ejecución. Un subgrafo puede hacer referencia a otros subgrafos con operandos de tipo SUBGRAPH. El framework puede enviar una operación de flujo de control a un acelerador solo si este admite todas las operaciones en todos los subgrafos a los que hace referencia esa operación de flujo de control.

Interfaces de HAL

En NN HAL 1.3, las definiciones relacionadas con el flujo de control se encuentran en types.hal.

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, consulta CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation. Para ver una lógica de validación de operaciones de muestra, consulta validateIfOperation() y validateWhileOperation().

Ten en cuenta que es importante admitir operaciones aritméticas y de comparación en operadores TENSOR_INT32 de forma 1, ya que se pueden usar como contadores de bucle. Del mismo modo, las operaciones que producen operandos TENSOR_BOOL8 de forma 1 deben usarse con las condiciones IF y WHILE.

Tiempo de espera de ejecución del bucle WHILE

Para evitar bucles infinitos, la ejecución se debe abortar si un bucle WHILE tarda más que el valor loopTimeoutDuration que se pasa a una llamada a 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 forman parte de los conjuntos de pruebas de CTS y VTS. Para obtener más información, consulta Validación.