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 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 .

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 .