Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る
このページは Cloud Translation API によって翻訳されました。
Switch to English

制御フロー

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

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

HALインターフェース

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

IDevice.halIDevice.halが含まれてIDevice 、そのメソッドgetSupportedOperations_1_3()IFWHILEを他の操作とは異なる方法で処理する必要があります。

IPreparedModel.halIPreparedModel.halが含まれてIPreparedModel 、そのメソッドexecute_1_3()executeSynchronously_1_3() 、およびexecuteFenced()はオプションのloopTimeoutDuration引数をloopTimeoutDurationます。

ドライバーの実装

サンプル操作の実装については、 CpuExecutor::executeIfOperationおよびCpuExecutor::executeWhileOperation参照してください。サンプル操作検証ロジックについては、 validateIfOperation()およびvalidateWhileOperation()参照してください。

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

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

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

検証

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