Android 11以降、NNAPIには、 IF
とWHILE
の2つの制御フロー操作が含まれています。これらの操作は、他のモデルを引数として取り、条件付き( 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
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テストスイートの一部です。詳細については、検証を参照してください。