パフォーマンスのヒントとスレッドのスケジュール#
ハードウェア・デバイスの構成を簡素化するには、ov::hint::PerformanceMode::LATENCY および ov::hint::PerformanceMode::THROUGHPUT の高レベルのパフォーマンス・ヒントを使用することを推奨します。両方のパフォーマンス・ヒントにより、さまざまなプラットフォームやモデルにおいてアプリケーションの最適な移植性とスケーラビリティーが保証されます。
ov::inference_num_threads
は、CPU 推論に使用される論理プロセッサーの数を制限します。設定した数がプラットフォーム上の論理プロセッサー数より大きい場合、マルチスレッド・スケジューラーは CPU の推論にプラットフォーム番号のみを使用します。ov::num_streams
は、並行して実行できる推論要求の数を制限します。ユーザーが設定した数が推論スレッドの数より大きい場合、マルチスレッド・スケジューラーは推論スレッドの数のみを使用して、ストリームごとに少なくとも 1 つのスレッドが存在するようにします。ov::hint::scheduling_core_type
は、ユーザーが Performance-cores (P-core) と Efficient-cores (E-core) の両方を含むハイブリッド・プラットフォームで推論を実行する場合、CPU 推論の CPU コアのタイプを指定します。ユーザー・プラットフォームに 1 種類の CPU コアしかない場合、このプロパティーは効果がなく、CPU 推論では常に一意のコアタイプが使用されます。ov::hint::enable_hyper_threading
は、プラットフォームで CPU のハイパースレッディングが有効になっている場合、CPU コアごとに 1 つまたは 2 つの論理プロセッサーの使用を制限します。Efficient-core など、CPU コアごとの論理プロセッサーが 1 つだけの場合、このプロパティーは効果がなく、CPU 推論ではすべての論理プロセッサーが使用されます。ov::hint::enable_cpu_pinning
は、CPU 推論中に CPU ピンニングを有効にします。ユーザーがこのプロパティーを有効にしても、推論シナリオがサポートしていない場合、このプロパティーはモデルのコンパイル中に無効になります。
上記の構成の詳細については、マルチストリーム実行を参照してください。
レイテンシーのヒント#
このシナリオでは、ov::hint::scheduling_core_type
のデフォルト設定は、モデルの精度と P-core と E-core の比率によって決まります。
注
P-core は Performance-core の略で、E-core は Efficient-core の略です。これらのタイプのコアは、第 12 世代インテル® Core™ プロセッサー以降で利用できます。
INT8 モデル |
FP32 モデル |
|
---|---|---|
E-core / P-core < 2 |
P-core |
P-core |
2 <= E-core / P-core < 4 |
P-core |
P-core と E-core |
4 <= E-core / P-core |
P-core と E-core |
P-core と E-core |
注
Windows* 上の第 14 世代インテル® Core™ プロセッサー以降の構成では、 P-core と E-core の両方を使用できます。
Windows* および Linux* 上の低レベルのパフォーマンス・プロパティーのデフォルト設定は次のようになります:
プロパティー |
Windows* |
Linux* |
---|---|---|
|
1 |
1 |
|
1 つのソケット上の P-core または P-core+E-core の数に等しい |
1 つのソケット上の P-core または P-core+E-core の数に等しい |
|
||
|
いいえ |
いいえ |
|
いいえ / サポートされません |
はい。ただし P-core と E-core を併用する場合を除きます |
注
ov::hint::scheduling_core_type
は、最適なパフォーマンスを保証するため、内部ヒューリスティックに基づいて特定のプラットフォーム上の特定の推論モデルに合わせて調整される場合があります。大規模言語モデルの場合を除き、Windows* 上のインテル® Core™ Ultra プロセッサーのレイテンシーのヒントには P-core と E-core の両方が使用されます。
ハイパースレッディングが有効である場合、2 つの論理プロセッサーが 1 つの CPU コアのハードウェア・リソースを共有します。OpenVINO は、単一の推論要求に対して 1 つのストリームで両方の論理プロセッサーを使用することを想定していません。したがって、このシナリオでは
ov::hint::enable_hyper_threading
はNo
に設定されます。ov::hint::enable_cpu_pinning
は、Windows* および macOS* ではデフォルトで無効になっていますが、Linux* では有効になっています。このようなデフォルト設定は、対応する環境で実行される一般的なワークロードに合わせて調整されており、より優れたすぐに適用できる (OOB) パフォーマンスを保証します。
スループットのヒント#
このシナリオでは、スレッドのスケジューリングは、まず現在のプラットフォームで推論されているモデルのメモリー負荷を評価し、次に示すように、ストリームあたりのスレッド数を決定します。
メモリー・プレッシャー |
Stream ごとのスレッド |
---|---|
低 |
1 P-core または 2 E-core |
注 |
2 |
高 |
3 - 4 または 5 |
次に、ov::inference_num_threads
をストリームあたりのスレッド数で割ることによって、ov::num_streams
の値が計算されます。Windows* および Linux* 上の低レベルのパフォーマンス・プロパティーのデフォルト設定は次のようになります:
プロパティー |
Windows* |
Linux* |
---|---|---|
|
上記のように計算 |
上記のように計算 |
|
P-core と E-core の数 |
P-core と E-core の数 |
|
P-core と E-core |
P-core と E-core |
|
はい / いいえ |
はい / いいえ |
|
いいえ |
はい |
注
このシナリオでは、デフォルトでは、異なるコアタイプが 1 つのストリーム内に混在することはありません。異なる NUMA ノードのコアは、単一のストリーム内で混在しません。
マルチスレッドの最適化#
次のプロパティーを使用して、モデル推論に使用可能な CPU リソースを制限できます。プラットフォームまたはオペレーティング・システムがこの動作をサポートできる場合、OpenVINO ランタイムは、利用可能な CPU に基づいてマルチスレッドのスケジュールを行います。
ov::inference_num_threads
ov::hint::scheduling_core_type
ov::hint::enable_hyper_threading
# 推論に 1 つの論理プロセッサーを使用
compiled_model_1 = core.compile_model(
model=model,
device_name=device_name,
config={properties.inference_num_threads(): 1},
)
# ハイブリッド・プラットフォームでの推論に Efficient-core の論理プロセッサーを使用
compiled_model_2 = core.compile_model(
model=model,
device_name=device_name,
config={
properties.hint.scheduling_core_type(): properties.hint.SchedulingCoreType.ECORE_ONLY,
},
)
# ハイパースレッディングがオンの場合、推論には CPU コアごとに 1 つの論理プロセッサーを使用
compiled_model_3 = core.compile_model(
model=model,
device_name=device_name,
config={properties.hint.enable_hyper_threading(): False},
)
// 推論に 1 つの論理プロセッサーを使用
auto compiled_model_1 = core.compile_model(model, device, ov::inference_num_threads(1));
// ハイブリッド・プラットフォームでの推論に Efficient-core の論理プロセッサーを使用
auto compiled_model_2 = core.compile_model(model, device, ov::hint::scheduling_core_type(ECORE_ONLY));
// ハイパースレッディングがオンの場合、推論には CPU コアごとに 1 つの論理プロセッサーを使用
auto compiled_model_3 = core.compile_model(model, device, ov::hint::enable_hyper_threading(false));
注
ov::hint::scheduling_core_type
および ov::hint::enable_hyper_threading
は、現在のリリースでは Linux* および Windows* が動作するインテル® x86-64 CPU のみをサポートします。
特定の状況では、デフォルトで OpenVINO ランタイムはパフォーマンスを向上させるため CPU スレッドの固定 (ピニング) を有効にします。ユーザーは、プロパティー ov::hint::enable_cpu_pinning
を使用してこの機能をオンまたはオフにできます。スレッドのピニングを無効にすると、複数のワークロードが並行して実行される複雑なアプリケーションでは有益である可能性があります。
# システムがサポートしている場合は推論用の CPU スレッドのピニングを無効化
compiled_model_4 = core.compile_model(
model=model,
device_name=device_name,
config={properties.hint.enable_cpu_pinning(): False},
)
// システムがサポートしている場合は推論用の CPU スレッドのピニングを無効化
auto compiled_model_4 = core.compile_model(model, device,
ov::hint::enable_cpu_pinning(false));
マルチストリーム実行の詳細については、最適化ガイドを参照してください。