Flujo de control

A partir de Android 11, la NNAPI incluye dos operaciones de flujo de control, IF y WHILE, que toman otros modelos como argumentos y los ejecutan de manera condicional (IF) o repetidamente (WHILE). Esto permite construir modelos que ejecuten diferentes operaciones según los valores de entrada o varias veces sin desenrollar. Esto es importante para casos de uso como RNN dinámico 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 de controladores

Para ver una implementación de operación de ejemplo, consulta CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation. Para ver la lógica de validación de la operación 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. De manera similar, las operaciones que producen operandos TENSOR_BOOL8 de la forma 1 se deben usar con las condiciones IF y WHILE.

Tiempo de espera de ejecución del bucle WHILE

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