レイテンシーの最適化

ディープラーニングのユースケースの大部分では、アプリケーションが単一のモデルをロードし、一度に単一の入力が使用されます。これは典型的な “消費者” のシナリオです。アプリケーションは必要に応じて、非同期入力をサポートするため複数の要求を作成したりできますが、推論パフォーマンスは、デバイス上で並行して推論される要求の数によって決まります

同様に、複数のモデルが同じデバイスに提供される場合、モデルが同時に実行されるか、例えば推論パイプライン内で連鎖的に実行されるかが重要です。予想どおり、低レイテンシーを実現する最も簡単な方法は、1 つのデバイスで一度に 1 つの推論のみを実行することです。したがって、同時実行性が増加すると、通常、レイテンシーが急速に上昇します。

ただし、従来の一部の “ルート” デバイス (つまり、CPU または GPU) は、内部的に複数の “サブデバイス” で構成されている場合があります。多くの場合、OpenVINO が “サブデバイス” を透過的に利用できるようにすると、レイテンシーを悪化させることなくアプリケーションのスループットを向上させることができます (複数のクライアントに同時にサービスを提供するなど)。例えば、マルチソケット CPU は、システム内の NUMA ノードに最小のレイテンシーで同じ数の要求を供給できます。同様に、1 つのパッケージ内に複数の GPU があるマルチタイル GPU は、単一タイルのレイテンシーを維持しながら、推論要求の数に応じてマルチタイルのスケーラビリティーを実現できます。

通常、本質的にレイテンシーが重視される場合でも、デバイスからより高い “スループット” を引き出すには専門知識が必要です。OpenVINO は、高レベルのパフォーマンス・ヒント (compile_modelov::hint::performance_mode プロパティーにある ov::hint::PerformanceMode::LATENCY を介して構成の負荷を軽減できます。

OpenVINO パフォーマンス・ヒントは、デバイスに依存せず、将来も保証されるパフォーマンス構成の推奨方法です。

複数のモデルを同時に使用する場合は、モデルごとに別のデバイスで推論を実行することを検討してください。最後に、複数のモデルがデバイス上で並行して実行される場合、ov::hint::model_priority を使用してモデルの相対的な優先順位を定義すると有効な場合があります。デバイスが機能をサポートしているかどうかを確認するには、デバイスの OpenVINO 機能サポートに関するドキュメントを参照してください。

最初の推論のレイテンシーとモデルのロード/コンパイル時間

状況によっては、モデルの読み込みとコンパイルが通常よりも “エンドツーエンド” のレイテンシーに影響することがあります。例えば、モデルが 1 回だけ使用される場合、またはデバイス上のメモリー制限により別の推論のためメモリーを解放しアンロードおよび再ロードが繰り返される場合です。

推論アクセラレーター (CPU 以外) は通常、ロード時に一定のモデルコンパイルを必要とするため、このような “最初の推論レイテンシー” のシナリオでは、モデルのロードとコンパイル時間に制限が生じる可能性があります。モデルのキャッシュオプションは、複数アプリケーションの実行における影響を軽減する方法です。例えば、アプリケーションの書き込み権限が必要な場合など、モデルのキャッシュが不可能な場合、CPU はほぼ毎回最速のモデル読み込み時間を提供します。

一般的な “最初の推論レイテンシー” シナリオを改善するため、モデルの読み取りがメモリーへのモデルマッピング (mmap を使用) に置き換えられました。ただし、一部の利用ケース (モデルがリムーバブル・ドライブまたはネットワーク・ドライブ上にある場合) では、マッピングによって遅延が増加する可能性があります。マッピングを読み取りに切り替えるには、ov::Coreov::enable_mmap(false) プロパティーを指定します。

最初の推論レイテンシーに対処する別の方法は、AUTO デバイス選択推論モードを使用することです。実際のアクセラレーターがモデルをロードするのを待機しながら、CPU で推論を開始します。その時点で、新しいデバイスにシームレスに移行します。

最後に、スループット重視のオプションを使用すると、モデルの稼働時間が大幅に増加する可能性があることに注意してください。