制御フロー

Android 11以降、NNAPIには、 IFWHILEの2つの制御フロー操作が含まれています。これらの操作は、他のモデルを引数として取り、条件付き( IF )または繰り返し( WHILE )で実行します。これにより、入力値に基づいてさまざまな操作を実行したり、展開せずに操作を複数回実行したりするモデルを構築できます。これは、動的RNNやseq2seqなどのユースケースにとって重要です。

NN HAL 1.3では、モデルには、実行の入力と出力を指定するために使用されるメインサブグラフを含む、複数のサブグラフが組み込まれています。サブグラフは、 SUBGRAPH型のオペランドを使用して他のサブグラフを参照できます。フレームワークは、アクセラレータがその制御フロー操作によって参照されるすべてのサブグラフのすべての操作をサポートしている場合にのみ、制御フロー操作をアクセラレータに送信できます。

HALインターフェース

NN HAL 1.3では、制御フローに関連する定義はtypes.halにあります。

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() )を参照してください。

形状1TENSOR_INT32オペランドはループカウンターとして使用できるため、これらのオペランドで算術演算と比較演算をサポートすることが重要であることに注意してください。同様に、形状1TENSOR_BOOL8オペランドを生成する演算は、 IFおよびWHILE条件で使用する必要があります。

WHILEループ実行タイムアウト

無限ループを防ぐには、 WHILEループにIPreparedModel::execute_1_3()IPreparedModel::executeSynchronously_1_3() 、またはIPreparedModel::executeFenced() (またはデフォルト値)の呼び出しに渡されるloopTimeoutDuration値よりも長い時間がかかる場合、実行を中止する必要があります。省略した場合)。

検証

制御フローテストは、CTSおよびVTSテストスイートの一部です。詳細については、検証を参照してください。