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 forma condicional ( IF ) o repetidamente ( WHILE ). Esto permite construir modelos que ejecutan diferentes operaciones en función de los valores de entrada o ejecutar 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 subgráficos, incluido el subgráfico principal que se usa para especificar entradas y salidas de una ejecución. Un subgrafo puede hacer referencia a otros subgrafos usando 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 subgráficos 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 muestra, consulte CpuExecutor::executeIfOperation y CpuExecutor::executeWhileOperation . Para ver la lógica de validación de la operación de muestra, consulte validateIfOperation() y validateWhileOperation() .

Tenga en cuenta que es importante admitir operaciones aritméticas y de comparación en los operandos 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 forma 1 deben usarse con condiciones IF y WHILE .

WHILE tiempo de espera 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 forman parte de los conjuntos de pruebas CTS y VTS. Para obtener más información, consulte Validación .