パフォーマンス・チューニング#

はじめに

このドキュメントでは、パフォーマンス効率を最大化するために構成できるさまざまなパラメーターの概要を説明します。

サンプル例のモデル#

ResNet50 モデルのダウンロード

mkdir models 
docker run -u $(id -u):$(id -g) -v ${PWD}/models:/models openvino/ubuntu20_dev:latest omz_downloader --name resnet-50-tf --output_dir /models 
docker run -u $(id -u):$(id -g) -v ${PWD}/models:/models:rw openvino/ubuntu20_dev:latest omz_converter --name resnet-50-tf --download_dir /models --output_dir /models --precisions FP32 
mv ${PWD}/models/public/resnet-50-tf/FP32 ${PWD}/models/public/resnet-50-tf/1

パフォーマンスのヒント#

PERFORMANCE_HINT プラグイン構成プロパティーを使用すると、特定の使用例でより効率良いプラグインのパフォーマンス・モードを指定できます。

スループット#

このモードは、高スループットを優先し、レイテンシーと電力のバランスをとります。ビデオフィードや大量の画像の推論など、複数のジョブを伴うタスクに最適です。

アプリケーションのパフォーマンス・ヒントを有効にするには、次のコマンドを使用します:

CPU

docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \ 
    --model_path /opt/model --model_name resnet --port 9001 \ 
    --plugin_config '{"PERFORMANCE_HINT": "THROUGHPUT"}' \ 
    --target_device CPU

GPU

docker run --rm -d --device=/dev/dri --group-add=$(stat -c "%g" /dev/dri/render* | head -n 1) -u $(id -u):$(id -g) \ 
    -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest-gpu \ 
    --model_path /opt/model --model_name resnet --port 9001 \ 
    --plugin_config '{"PERFORMANCE_HINT": "THROUGHPUT"}' \ 
    --target_device GPU

レイテンシー#

このモードでは低レイテンシーが優先され、各推論ジョブの応答時間が短くなります。超音波スキャン画像の医療分析など、単一の入力画像に対して推論が必要なタスクで最適なパフォーマンスを発揮します。また、環境内で動作する産業用ロボットの反応、または自律走行車の障害物回避などのリアルタイムのアプリケーション・タスクにも適合します。現在、PERFORMANCE_HINT プロパティーは CPU と GPU デバイスのみでサポートされていることに注意してください。さらに詳しく

アプリケーションのパフォーマンス・ヒントを有効にするには、次のコマンドを使用します:

CPU

docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \ 
    --model_path /opt/model --model_name resnet --port 9001 \ 
    --plugin_config '{"PERFORMANCE_HINT": "LATENCY"}' \ 
    --target_device CPU

GPU

docker run --rm -d --device=/dev/dri --group-add=$(stat -c "%g" /dev/dri/render* | head -n 1) -u $(id -u):$(id -g) \ 
    -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest-gpu \ 
    --model_path /opt/model --model_name resnet --port 9001 \ 
    --plugin_config '{"PERFORMANCE_HINT": "LATENCY"}' \ 
    --target_device GPU

: NUM_STREAMS と PERFORMANCE_HINT を同時に使用しないでください。

CPU および GPU ターゲットデバイスのストリーム数の調整#

OpenVINO™ モデルサーバーは、単一クライアントのユースケースや高い同時実行性が必要なケースに合わせて調整できます。これは、実行ストリーム数を設定することで調整できます。利用可能なリソースを分割して、複数の要求を並列実行します。これは、すべての CPU コアを効果良く消費できないモデルやコア数の多い CPU で特に効率的です。

デフォルトでは、ストリームの数は、同時実行性が低くても最小のレイテンシーで実行できるように最適化されます。実行ストリームの数は、CPU ソケットまたは GPU カードの数と同じになります。デフォルト設定が適切でない場合は、デバイスプラグイン設定で定義されている NUM_STREAMS パラメーターを使用して調整するか、パフォーマンスのヒントを THROUGHPUT に設定します。

単一の接続/クライアントを使用するシナリオでは、次のパラメーターを設定します:

--plugin_config '{"NUM_STREAMS": "1"}'

同時要求数が多い場合は、ストリームの数を増やします。ただし、ストリーム数が同時推論操作の平均量よりも少ないことを確認してください。そうしないと、サーバーが十分に活用されない可能性があります。

ストリーム数はコア数を超えてはなりません。

例えば、最大 50 のクライアントが 48 コアのサーバーに要求を送信する場合、ストリーム数を 24 に設定します:

--plugin_config '{"NUM_STREAMS": "24"}'

CPU ピニングの無効化#

デフォルトでは、OpenVINO モデルサーバーはパフォーマンスを向上させるため CPU スレッドの固定 (ピニング) を有効にします。ユーザーはプラグイン設定を使用してピニングをオフにすることもできます。スレッドのピニングを無効にすると、複数のワークロードが並行して実行される複雑なアプリケーションでは有益である可能性があります。

--plugin_config '{"ENABLE_CPU_PINNING": false}'

REST API 呼び出しでデータを入力#

REST API を使用する際、データ形式を調整して通信と json 形式の逆シリアル化を最適化できます。OpenVINO モデルサーバーを使用する場合に REST インターフェイスを効果的に使用するヒントをいくつか紹介します:

  • 可能な場合はバイナリーデータ形式を使用します (TFS API の場合、バイナリーデータ形式は JPEG/PNG 入力に対してのみサポートされますが、KFS API の場合はそのような制限はありません) - バイナリーデータ表現は要求サイズの点では小さく、サーバー側での処理が容易です。

  • 画像を扱う場合は、JPEG/PNG を直接送信することを検討してください。圧縮データによりトラフィックが大幅に削減され、通信速度が向上します。

  • JPEG/PNG では、設定されたモデルの解像度で画像を送信するのが最も効率的です。これにより、モデルに合わせてサーバー上で画像のサイズが変更されることがなくなります。

  • JSON オブジェクト内でデータを送信する場合は、数値データタイプを調整してメッセージサイズを小さくしてください。np.round(imgs.astype(np.float),decimals=2) などのコマンドを使用して、json メッセージ内の数値精度を下げます。

スケーラビリティー#

OpenVINO モデルサーバーは、リソースを追加して垂直方向に拡張したり、複数のホスト上にサービスのインスタンスを追加して水平方向に拡張したりできます。

CPU リソースが制限された OVMS の複数のインスタンスをホストする場合、コンテナの CPU アフィニティーを固定することが最適です。Kubernetes の CPU マネージャーを介して調整できます。

Docker では、--cpus の代わりに --cpuset-cpus オプションを使用してコンテナを起動します。

CPU プラグインを使用して推論を実行する場合、次のような構成パラメーターを調整することも有益な場合があります:

パラメーター

説明

INFERENCE_NUM_THREADS

CPU プラグインが推論に使用するスレッドの数を指定します。

AFFINITY

推論スレッドを CPU コアにバインドします。

NUM_STREAMS

スループット・モードの実行ストリーム数を指定します。

ENABLE_CPU_PINNING

このプロパティーにより、推論中に CPU スレッドを固定できるようになります。

注: すべてのパラメーターの詳細については、OpenVINO デバイスのプロパティーを参照してください。

  • 例: 次の docker コマンドは、NUM_STREAMS パラメーターを値 1 に設定します:

docker run --rm -d --cpuset-cpus 0,1,2,3 -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \ 
    --model_path /opt/model --model_name resnet --port 9001 \ 
    --plugin_config '{"NUM_STREAMS": "1"}'

注: 自動スケーリング機能を含む OpenVINO モデルサーバーのデプロイメントは、オペレーターを使用して Kubernetes および OpenShift で自動化できます。詳しくはこちら

CPU 電力管理の設定#

電力を節約するために、OS は CPU 周波数を下げ、レイテンシー値の変動性を高めることができます。同様に、インテル® ターボ・ブースト・テクノロジーも結果の安定性に影響を与える可能性があります。最高の再現性を得るには、周波数をプロセッサーの基本周波数にロックすることを検討してください (特定の CPU については https://ark.intel.com/ を参照)。例えば、Linux* では、/sys/devices/system/cpu/cpu* エントリーに関連する値を設定するとうまくいきます。cpupower などの高レベルのコマンドも存在します:

$ cpupower frequency-set --min 3.1GHz

モデルサーバー構成パラメーターのチューニング#

C++ 実装の OpenVINO モデルサーバーは、スケーラブルなマルチスレッド gRPC および REST インターフェイスを使用していますが、一部のハードウェア構成では、OpenVINO を使用した高性能バックエンドのボトルネックになる可能性があります。

  • スループットを向上させるため、gRPC サーバー・インスタンスの数を増やすパラメーター --grpc_workers が導入されています。ほとんどの場合、デフォルト値の 1 で十分です。特に負荷が高く、並列接続が多い場合、値を大きくすると転送速度が向上する可能性があります。

  • パフォーマンスに影響するもう 1 つのパラメーターは nireq です。推論実行のためモデルキューのサイズを定義します。これは、割り当てられた OpenVINO ストリームまたは予期される並列クライアント (grpc_workers >= nireq) の数と同じ大きさである必要があります。

  • file_system_poll_wait_seconds パラメーターは、新しいモデルバージョンがモデル・リポジトリーに作成されたかどうかモデルサーバーがチェックする頻度を定義します。デフォルト値は 1 秒で、新しいモデルバージョンの作成に迅速に対応できます。状況によっては、ポーリング頻度を減らすか、ポーリングを無効にすることが推奨される場合があります。例えば、クラウドストレージでは、ストレージ・クラウド・プロバイダーへの API 呼び出しのコストが発生する可能性があります。新しいバージョンの検出は、値 0 を設定して無効にできます。

  • メトリックの収集は、平均的なサイズと複雑なモデルで使用する場合、パフォーマンスのオーバーヘッドは無視できます。ただし、軽量で高速なモデルでは、メトリックの増加すると実際の推論と比較してかなりの割合の CPU 時間が消費される可能性があります。このようなモデルのメトリックを有効にするときは、それを考慮してください。

  • ログレベル DEBUG では、大量のログが生成されます。通常、全体のパフォーマンスに対するログ生成の影響は無視できますが、非常に高いスループットが必要な場合、デフォルト設定でもある --log_level INFO を検討してください。

プラグインの構成#

推論操作の実行に使用されるデバイスに応じて、一連のパラメーターを使用して実行動作を調整できます。各デバイスは、OpenVINO プラグインによって処理されます。

: 詳細については、すべてのプラグインでサポートされる構成パラメーターを参照してください。

モデルのプラグイン設定は、ネットワーク・ロード時に OpenVINO プラグインに渡される param:value ペアの辞書です。plugin_config パラメーターで設定できます。

次の docker コマンドは、パラメーター NUM_STREAMS を値 32 に設定し、AFFINITYNUMA に設定して CPU ピニングを無効にします。

docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \ 
    --model_path /opt/model --model_name resnet --port 9001 --grpc_workers 8 --nireq 32 \ 
    --plugin_config '{"NUM_STREAMS": 32, "AFFINITY": "NUMA", "ENABLE_CPU_PINNING": false}'

パフォーマンスの問題を解析#

達成可能なパフォーマンスを調査し、ボトルネックを発見する推奨手順:

  1. OV benchmark アプリを起動する

    注: -dump_config を使用してベンチマーク・アプリからプラグイン構成を削除し、OVMS にロードされたモデルで同じプラグイン構成を使用すると便利です

    注: ベンチマーク・アプリを起動するときは、-inference_only=false を使用します。それ以外では、OV は推論の入力テンソルを毎回設定することを回避しますが、これは OVMS と比較できるフローではありません。

  2. OVMS と同じマシン上で OVMS ベンチマーク・クライアントを起動します。

  3. リモートマシンから OVMS ベンチマーク・クライアントを起動します。

  4. iperf などのツールを使用して、利用可能なネットワーク帯域幅を測定します

精度の問題を解析#

ターゲットデバイスの GPU および NVIDIA は通常、デフォルトのモデル実行精度を FP32 から FP16 に変更することに注意してください。
精度の結果と OpenVINO ベンチマーク・アプリを比較することを推奨します。

プラグイン構成パラメーター INFERENCE_PRECISION_HINT を使用して、特定の実行時精度を強制することができます。例:
--plugin_config '{"INFERENCE_PRECISION_HINT": "f32"}'.

連続バッチ処理による LLM 計算機を使用したテキスト生成#

OpenAI API エンドポイント経由で LLM モデルを提供する際の調整には、いくつかの特別な考慮事項があります。

  • 使用されるモデルと予想される同時実行レベルに合わせて適切なキャッシュサイズを選択します。10GB などの値から開始し、通常の負荷時にサーバーログで消費量を観察することを推奨します。

  • テキスト生成は、マルチソケット・サーバー上の単一の NUMA ノード内で実行されます。最高のパフォーマンスを達成するには、仮想 NUMA ノードをオフにすることを推奨します。結果として、CPU ソケットごとに 1 つの NUMA ノードが存在し、テキスト生成は 1 つの CPU ソケットのすべてのコアを消費します。