パフォーマンスのヒントとスレッドのスケジュール#

ハードウェア・デバイスの構成を簡素化するには、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*

ov::num_streams

1

1

ov::inference_num_threads

1 つのソケット上の P-core または P-core+E-core の数に等しい

1 つのソケット上の P-core または P-core+E-core の数に等しい

ov::hint::scheduling_core_type

コアタイプのレイテンシーのヒント表

コアタイプのレイテンシーのヒント表

ov::hint::enable_hyper_threading

いいえ

いいえ

ov::hint::enable_cpu_pinning

いいえ / サポートされません

はい。ただし 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_threadingNo に設定されます。

  • 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*

ov::num_streams

上記のように計算

上記のように計算

ov::inference_num_threads

P-core と E-core の数

P-core と E-core の数

ov::hint::scheduling_core_type

P-core と E-core

P-core と E-core

ov::hint::enable_hyper_threading

はい / いいえ

はい / いいえ

ov::hint::enable_cpu_pinning

いいえ

はい

このシナリオでは、デフォルトでは、異なるコアタイプが 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));

マルチストリーム実行の詳細については、最適化ガイドを参照してください。