从 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
结构 - 包含
ifPerformance
和whilePerformance
的Capabilities
结构
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
循环花费的时间比传递给loopTimeoutDuration
IPreparedModel::execute_1_3()
、 IPreparedModel::executeSynchronously_1_3()
或IPreparedModel::executeFenced()
调用的 loopTimeoutDuration 值长(或默认值),则必须中止执行如果省略)。
验证
控制流测试是 CTS 和 VTS 测试套件的一部分。有关详细信息,请参阅验证。