从 Android 11 开始,NNAPI 包括两个控制流操作:IF 和 WHILE,它们将其他模型作为参数,并有条件地 (IF) 或重复地 (WHILE) 执行这些模型。这样就可以构建根据输⼊值执⾏不同操作或多次执⾏操作⽽⽆需展开的模型。这对于动态 RNN 和 seq2seq 等⽤例⾄关重要。
在 NN HAL 1.3 中,模型包含多个⼦图,包括⽤于指定执⾏的输⼊和输出的主⼦图。⼦图可以使⽤ SUBGRAPH 类型的操作数来引⽤其他⼦图。仅当加速器⽀持控制流操作引⽤的所有⼦图中的所有操作时,框架才能将控制流操作发送到加速器。
HAL 接口
在 NN HAL 1.3 中,与控制流相关的定义位于 types.hal 中。
IF和WHILE操作类型SUBGRAPH操作数类型和相应的SUBGRAPH操作数⽣命周期Model结构,其中包含主 ⼦图和引⽤的⼦图列表Capabilities结构,其中包含ifPerformance和whilePerformance
IDevice.hal 包含 IDevice,其方法 getSupportedOperations_1_3() 必须将 IF 和 WHILE 与其他操作区别对待。
IPreparedModel.hal 包含 IPreparedModel,其方法 execute_1_3()、executeSynchronously_1_3() 和 executeFenced() 接受可选的 loopTimeoutDuration 参数。
驱动程序实现
有关示例操作实现,请参阅 CpuExecutor::executeIfOperation 和 CpuExecutor::executeWhileOperation。有关示例操作验证逻辑,请参阅 validateIfOperation() 和 validateWhileOperation()。
请注意,务必⽀持对形状为 1 的 TENSOR_INT32 操作数执⾏算术和⽐较运算,因为这些操作数可用作循环计数器。同样,⽣成形状为 1 的 TENSOR_BOOL8 操作数的操作应与 IF 和 WHILE 条件结合使⽤。
WHILE 循环执⾏超时
为防⽌无限循环,如果 WHILE 循环的执⾏时间⻓于传递给 IPreparedModel::execute_1_3()、IPreparedModel::executeSynchronously_1_3() 或 IPreparedModel::executeFenced() 调⽤的 loopTimeoutDuration 值(如果省略,则为默认值),则必须中止执⾏。
验证
控制流测试是 CTS 和 VTS 测试套件的⼀部分。如需了解详情,请参阅验证。