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
.
- Tipos de operaciones
IF
yWHILE
- Tipo de operando
SUBGRAPH
y duración del operandoSUBGRAPH
correspondiente - Estructura del
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 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 .