Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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 condicionalmente ( IF ) o repetidamente ( WHILE ). Esto permite construir modelos que ejecutan diferentes operaciones basadas en los valores de entrada o ejecutan operaciones 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 utiliza para especificar entradas y salidas de una ejecucion. 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 referenciados por 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 diferente a otras operaciones.

IPreparedModel.hal contiene IPreparedModel , cuyos métodos execute_1_3() , executeSynchronously_1_3() y executeFenced() toman un argumento opcional loopTimeoutDuration .

Implementación del controlador

Para ver una implementación de operación de muestra, consulte CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation . Para obtener una muestra de la lógica de validación de la operación, 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 pueden usarse como contadores de bucle. De manera similar, las operaciones que producen operandos TENSOR_BOOL8 de forma 1 deben usarse con las condiciones IF y WHILE .

WHILE tiempo de espera de ejecución del bucle

Para evitar bucles infinitos, la ejecución debe abortarse 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 .