Flujo de control

A partir de Android 11, la NNAPI incluye dos operaciones de control de flujo, IF y WHILE, que toman otros modelos como argumentos y los ejecutan de forma condicional (IF) o repetida (WHILE). Esto permite construir modelos que ejecutan diferentes operaciones según los valores de entrada o ejecutan operaciones varias veces sin desenrollar. 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 solo puede enviar una operación de flujo de control a un acelerador 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 la HAL de NN 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 muestra de la operación, consulta CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation. Para ver un ejemplo de lógica de validación de operaciones, consulta validateIfOperation() y validateWhileOperation().

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

Tiempo de espera de ejecución del bucle WHILE

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