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 de forma condicional (IF
) o repetida (WHILE
). Esto permite construir modelos que ejecuten diferentes operaciones en función de los valores de entrada o ejecuten operaciones varias veces sin desenrollarse. 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 puede enviar una operación de flujo de control a un acelerador solo 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 NN HAL 1.3, las definiciones relacionadas con el flujo de control se encuentran en types.hal
.
- Tipos de operaciones
IF
yWHILE
- Tipo de operando
SUBGRAPH
y la vida útil del operandoSUBGRAPH
correspondiente - Estructura
Model
que contiene el subgrafo principal y una lista de subgrafos a los que se hace referencia - Estructura
Capabilities
que contieneifPerformance
ywhilePerformance
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, consulta CpuExecutor::executeIfOperation
y CpuExecutor::executeWhileOperation
.
Para ver una lógica de validación de operaciones de muestra, consulta validateIfOperation()
y validateWhileOperation()
.
Ten en cuenta que es importante admitir operaciones aritméticas y de comparación en
operadores TENSOR_INT32
de forma 1
, ya que se pueden usar como contadores de bucle.
Del mismo modo, las operaciones que producen operandos TENSOR_BOOL8
de forma 1
deben usarse con las condiciones IF
y WHILE
.
Tiempo de espera de ejecución del bucle WHILE
Para evitar bucles infinitos, la ejecución se debe abortar si un bucle WHILE
tarda más que el valor loopTimeoutDuration
que se pasa a una llamada a 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 de CTS y VTS. Para obtener más información, consulta Validación.