モデルのキャッシュ

概要

モデルサーバーは、OpenVINO™ モデルキャッシュ機能を利用して、ターゲットデバイスへの後続のモデルの読み込みを高速化できます。通常、キャッシュされたファイルによってモデルサーバーの初期化が高速化されます。ブーストはモデルとターゲットデバイスによって異なります。最も顕著な改善は GPU デバイスで見られます。CPU など他のデバイスでは、高速化の効果が見られないか、使用されているモデルによっては読み込みプロセスが遅くなる場合があります。最終的なデプロイの前にセットアップをテストします。

キャッシュは、.blob ファイル形式のコンパイル済みモデル BLOB、または複数の .cl_cache ファイル形式のコンパイル済みカーネル (GPU) で構成されます。キャッシュファイルは、同じモデルサーバーのバージョン、ターゲットデバイス、ハードウェア、モデル、およびモデル形状パラメーター内で再利用できます。モデルサーバーは、キャッシュが存在するか自動的に検出し、必要に応じて新しいキャッシュファイルを再生成します。

注: モデルサーバーのキャッシュ機能では、リモートストレージからのモデルファイルのダウンロードが回避されません。モデルの読み込みは高速化されますが、元のモデルファイルへのアクセスは依然として必要です。

注: 場合によっては、モデルキャッシュに望ましくない影響が生じる可能性があります。次の場合には特別な考慮が必要です。

  • カスタム・ローダー・ライブラリーが使用されている - 暗号化されたモデルファイルのインポートにカスタムローダーが使用される可能性があるため、暗号化されていないキャッシュを使用するとセキュリティー・リスクが発生する可能性があります。

  • 自動バッチサイズまたは自動形状パラメーターを備えたモデルを使用する - 新しい入力形状を使用した新しい推論要求に対してモデルがリロードされるたびに、モデルキャッシュが再生成される可能性があります。これにより、ディスク領域の過負荷が発生する可能性があり、繰り返し入力形状を初期化する場合にのみパフォーマンスが向上します。

キャッシュ機能を有効にする

キャッシュモデルは、Docker コンテナにフォルダー /opt/cache を作成またはマウントすることで有効にできます。あるいは、--cache_dir パラメーターを使用してキャッシュストレージの場所を設定することもできます。

モデルサーバーのセキュリティー・コンテキストには、キャッシュ・ストレージ・パスへの読み取り/書き込みアクセスが必要です。

構成ファイルを備えたモデルサーバーを使用すると、複数のモデルを提供できます。このような場合、モデルキャッシュは以下を除くすべてのモデルに適用されます。

  • カスタムローダーを備えたモデル (前述したセキュリティー上の理由のため)

  • auto または batch_size を形成するように構成されたモデル auto

自動形状または自動バッチを備えたモデルに対してもモデルキャッシュを有効にする場合は、"allow_cache": true パラメーターを使用して強制的に有効にすることができます。

{
    "model_config_list": [
        {"config": {
            "name": "face_detection",
            "base_path": "/models/face-detection-retail-0004/",
            "shape": "auto",
            "allow_cache": true}},
    ],
}

重要: カスタムローダー経由でインポートされたモデルは、キャッシュを作成したり使用することはありません。

使用例

モデルの準備

$ curl --create-dirs https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.1/models_bin/2/face-detection-retail-0004/FP32/face-detection-retail-0004.bin https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.1/models_bin/2/face-detection-retail-0004/FP32/face-detection-retail-0004.xml -o model/fdsample/1/face-detection-retail-0004.bin -o model/fdsample/1/face-detection-retail-0004.xml

サービスの開始

$ mkdir cache
$ docker run -p 9000:9000 -d -u $(id -u):$(id -g) --device /dev/dri --group-add=$(stat -c "%g" /dev/dri/render* | head -n 1) -v ${PWD}/model/fdsample:/model:ro -v ${PWD}/cache:/opt/cache:rw openvino/model_server:latest-gpu --model_name model --model_path /model --target_device GPU --port 9000

ログに期待されるメッセージ: Model cache is enabled: /opt/cache.

モデル・サーバー・コンテナが初めて起動されると、キャッシュフォルダーにデータが設定されます。次にコンテナが起動すると、特に GPU ターゲットデバイスでは初期化が速くなります。

最初の初期化からのログ - モデルの読み込みには最大 3.5 秒かかります

[2021-11-12 16:03:43.325][1][serving][info][modelinstance.cpp:558] Loading model: model, version: 1, from path: /model/1, with target device: GPU ...
[2021-11-12 16:03:43.325][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "START", "error_code": "OK" )
[2021-11-12 16:03:43.325][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "LOADING", "error_code": "OK" )
[2021-11-12 16:03:43.342][1][serving][info][modelinstance.cpp:175] Final network inputs:
Input name: data; mapping_name: ; shape: (1,3,300,300); effective shape: (1,3,300,300); precision: FP32; layout: N...
[2021-11-12 16:03:43.342][1][serving][info][modelinstance.cpp:209] Output name: detection_out; mapping name: ; shape: 1 1 200 7 ; effective shape 1 1 200 7 ; precision: FP32; layout: N...
[2021-11-12 16:03:46.905][1][modelmanager][info][modelinstance.cpp:394] Plugin config for device GPU:
[2021-11-12 16:03:46.905][1][modelmanager][info][modelinstance.cpp:398] OVMS set plugin settings key:GPU_THROUGHPUT_STREAMS; value:GPU_THROUGHPUT_AUTO;
[2021-11-12 16:03:46.911][1][serving][info][modelinstance.cpp:477] Loaded model model; version: 1; batch size: 1; No of InferRequests: 4
[2021-11-12 16:03:46.911][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "AVAILABLE", "error_code": "OK" )

シーケンシャル・モデル・サーバーの初期化が高速になります。以下のログに基づくと、最大 400 ミリ秒です

[2021-11-12 16:06:08.377][1][serving][info][modelinstance.cpp:558] Loading model: model, version: 1, from path: /model/1, with target device: GPU ...
[2021-11-12 16:06:08.377][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "START", "error_code": "OK" )
[2021-11-12 16:06:08.377][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "LOADING", "error_code": "OK" )
[2021-11-12 16:06:08.384][1][serving][info][modelinstance.cpp:175] Final network inputs:
Input name: data; mapping_name: ; shape: (1,3,300,300); effective shape: (1,3,300,300); precision: FP32; layout: N...
[2021-11-12 16:06:08.384][1][serving][info][modelinstance.cpp:209] Output name: detection_out; mapping name: ; shape: 1 1 200 7 ; effective shape 1 1 200 7 ; precision: FP32; layout: N...
[2021-11-12 16:06:08.783][1][modelmanager][info][modelinstance.cpp:394] Plugin config for device GPU:
[2021-11-12 16:06:08.783][1][modelmanager][info][modelinstance.cpp:398] OVMS set plugin settings key:GPU_THROUGHPUT_STREAMS; value:GPU_THROUGHPUT_AUTO;
[2021-11-12 16:06:08.790][1][serving][info][modelinstance.cpp:477] Loaded model model; version: 1; batch size: 1; No of InferRequests: 4
[2021-11-12 16:06:08.790][1][serving][info][modelversionstatus.hpp:155] STATUS CHANGE: Version 1 of model model status change. New status: ( "state": "AVAILABLE", "error_code": "OK" )