スループットの最適化

レイテンシー固有の最適化に関するセクションで説明したように、考えられる使用例の 1 つは、すべての要求を最小限の遅延で供給することです。一方、スループットは、リソース使用率を向上させるため、潜在的に多数の推論要求が同時に処理される推論シナリオを考慮するものです。

これに伴うレイテンシーの増加は、並行して実行される要求数に線形的に比例することはありません。全体のスループットと個々の要求のシリアル・パフォーマンス間のトレードオフは、OpenVINO で適切なパフォーマンス構成で達成できます。

スループットを活用する基本的な方法と高度な方法

個々のデバイスでスループットを活用するには 2 つの方法があります。

どちらも、次のセクションで説明するように、アプリケーションは複数の推論要求を並行して実行するように設計する必要があります。

スループット指向のアプリケーション設計

一般に、スループット指向の推論アプリケーションは次のことを行う必要があります。

  • 大量の入力並列処理を公開します (複数のビデオまたはオーディオソース、テキスト・ドキュメント処理など)。

  • データフローを、並行して実行するように積極的にスケジュールされた同時推論要求のコレクションに分解します。

    • 以前に導入した低レベルの明示的なオプション、または OpenVINO のパフォーマンス・ヒント (推奨) を使用して、デバイスの構成をセットアップします (例えば、ov::Core::compile_model のパラメーターとして)。

          import openvino.properties as props
          import openvino.properties.hint as hints
      
          config = {hints.performance_mode: hints.PerformanceMode.THROUGHPUT}
          compiled_model = core.compile_model(model, "GPU", config)
      
      auto compiled_model = core.compile_model(model, "GPU",
          ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT));
      
    • ov::CompiledModel (デバイスのモデルのコンパイルから得られる) から ov::optimal_number_of_infer_requests を照会して、デバイスを飽和させるのに十分な要求数を作成します。

  • 一般的な最適化セクションで説明されているように、要求の完了順序への依存や、デバイスが枯渇する可能性を回避するには、コールバックを備えた非同期 API を使用します。

マルチデバイス実行

OpenVINO は、自動でスケーラブルなマルチデバイス推論モードを提供します。これは、スループットを向上させるシンプルなアプリケーションに透過的な方法です。明示的なマルチデバイス・サポートのため、既存のアプリケーションを再構築する必要はありません。各デバイスへの明示的なネットワークの読み込み、デバイスごとの個別のキュー、デバイス間で推論要求のバランスをとる追加ロジックも必要ありません。これを使用するアプリケーションの場合、マルチデバイスは、すべてのプロセスを内部で管理するため、他のデバイスでも同様です。他のスループット指向のシナリオと同様に、マルチデバイスのパフォーマンスを最適化するには、いくつかの前提条件があります。

  • 特に非同期 APIコールバックを使用する場合です。

  • マルチデバイス (およびその下のデバイス) に十分なデータを供給します。推論要求は独立したデータであるため、マルチデバイスは、スケジュール・オーバーヘッドを最小限に抑えるため、(最も外側である) “要求” レベルでロードバランスをとります。

CPU と iGPU の間で共有されるメモリー帯域幅など特定のリソースでデバイスが競合する場合、結果として得られるパフォーマンスは通常、“理想的な” (単純な合計) 値の一部になることに注意してください。

各デバイスのパラメーターを個別に最適化する従来のアプローチは機能しますが、OpenVINO のパフォーマンス・ヒントを使用すると、すべてのデバイス (特定のマルチデバイス構成の一部) を一度に構成できます。