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, el NNAPI incluye dos operaciones de control de flujo, IF y WHILE , que tienen otros modelos como argumentos y ejecutarlas de forma condicional ( 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 subgraphs 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 diferente a otras operaciones.

IPreparedModel.hal contiene IPreparedModel , cuyos métodos execute_1_3() , executeSynchronously_1_3() , y executeFenced() tener una opción loopTimeoutDuration argumento.

Implementación del controlador

Para una implementación de la operación de ejemplo, vea CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation . Para la lógica de validación operación de ejemplo, consulte validateIfOperation() y validateWhileOperation() .

Tenga en cuenta que es importante para apoyar las operaciones aritméticas y de comparación en TENSOR_INT32 operandos de forma 1 , ya que estos pueden ser utilizados como contadores de bucles. Del mismo modo, las operaciones que producen TENSOR_BOOL8 operandos de forma 1 se deben utilizar con IF y WHILE condiciones.

WHILE tiempo de espera de ejecución del bucle

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