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 manera condicional (IF
) o repetidamente (WHILE
). Esto permite construir modelos que ejecuten diferentes operaciones según los valores de entrada o varias veces sin desenrollar. Esto es importante para casos de uso como RNN dinámico y seq2seq.
En la 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 mediante 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 de
Capabilities
que contieneifPerformance
ywhilePerformance
IDevice.hal
contiene IDevice
, cuyo método getSupportedOperations_1_3()
debe tratar a IF
y WHILE
de manera diferente de otras operaciones.
IPreparedModel.hal
contiene IPreparedModel
, cuyos métodos execute_1_3()
, executeSynchronously_1_3()
y executeFenced()
toman un argumento loopTimeoutDuration
opcional.
Implementación de controladores
Para ver una implementación de operación de ejemplo, consulta CpuExecutor::executeIfOperation
y CpuExecutor::executeWhileOperation
.
Para ver la lógica de validación de la operación de muestra, consulta validateIfOperation()
y validateWhileOperation()
.
Ten en cuenta que es importante admitir operaciones aritméticas y de comparación en 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 la forma 1
se deben usar con las condiciones IF
y WHILE
.
WHILE tiempo de espera de ejecución del bucle
Para evitar los bucles infinitos, se debe anular la ejecución si un bucle WHILE
tarda más que el valor loopTimeoutDuration
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 de CTS y VTS. Para obtener más información, consulta Validación.