从 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 测试套件的一部分。有关详细信息,请参阅验证。