從 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 測試套件的一部分。有關詳細信息,請參閱驗證。