モデルのキャッシュ概要#

OpenVINO™ とアプリケーションの統合で説明されているように、一般的なアプリケーション・フローは次のステップで構成されます。

  1. コア・オブジェクトを作成:
    最初のステップでは、利用可能なデバイスを管理してモデル・オブジェクトを読み取ります
  2. 中間表現の読み取り:
    中間表現ファイルを ov::Model のオブジェクトに読み込みます
  3. 入力と出力の準備:
    必要に応じて、精度、メモリーレイアウト、サイズ、またはカラー形式を操作します
  4. 構成のセット:
    デバイス固有の読み込み設定をデバイスに渡します
  5. ネットワークをコンパイルしてデバイスへロード:
    特定のデバイスでov::Core::compile_model() メソッドを使用します
  6. 入力データのセット:
    入力テンソルを指定します
  7. 実行:
    推論を実行し、結果を処理します

ステップ 5 では、時間のかかるデバイス固有の最適化とネットワークのコンパイルが実行される可能性があります。アプリケーションの起動時に生じる遅延を短縮するため、モデルのキャッシュを使用できます。コンパイルされたモデルを自動的にエクスポートして再利用することで、モデルのコンパイル時間を大幅に短縮できます。

重要

すべてのデバイスがネットワークのインポート/エクスポート機能をサポートしているわけではありません。それらは通常どおりに実行されますが、コンパイルステージの高速化には繋がりません。

モデルのキャッシュを有効にするには “cache_dir” 構成オプションを設定#

モデルのキャッシュを有効にするには、アプリケーションでキャッシュされた BLOB を保存するフォルダーを指定する必要があります:

from utils import get_path_to_model, get_temp_dir 
import openvino as ov 

import openvino.properties as props 

# 例: "CPU", "GPU", "NPU". 
device_name = 'CPU' 
model_path = get_path_to_model() 
path_to_cache_dir = get_temp_dir() 

core = ov.Core() 
core.set_property({props.cache_dir: path_to_cache_dir}) 
model = core.read_model(model=model_path) 
compiled_model = core.compile_model(model=model, 
    device_name=device_name)
void part0() { 
    std::string modelPath = "/tmp/myModel.xml"; 
    std::string device = "GPU"; // 例: "CPU", "GPU", "NPU". 
    ov::AnyMap config; 
    ov::Core core; // ステップ 1: create ov::Core オブジェクト 
core.set_property(ov::cache_dir("/path/to/cache/dir")); // ステップ 1b: キャッシュを有効化 
auto model = core.read_model(modelPath); // ステップ 2: モデルを読み取り 
//...                                         // ステップ 3: 入力/出力の準備 
//...                                         // ステップ 4: デバイス構成を設定 
auto compiled = core.compile_model(model, device, config); // ステップ 5: LoadNetwork

このコードでは、device_name で指定されたデバイスがモデルのインポート/エクスポートをサポートしている場合、キャッシュされた BLOB (それぞれ GPU と CPU の場合は .cl_cache ファイルと .blob ファイル) が /path/to/cache/dir フォルダー内に自動的に作成されます。デバイスがインポート/エクスポートをサポートしていない場合、キャッシュは作成されず、エラーはスローされません。

最初の compile_model 操作では、キャッシュを作成する時間がかかることに注意してください。コンパイルされた blob はキャッシュファイルに保存されます:

../../../../_images/caching_enabled.svg

さらに高速化するには compile_model(modelPath) を使用#

状況によっては、アプリケーションは入力と出力を毎回カスタマイズする必要がありません。そのようなアプリケーションは常に、model = core.read_model(...) を呼び出してから core.compile_model(model, ..) を呼び出します。これはさらに最適化できます。この場合、読み取りステップをスキップして、1 回の呼び出しでモデルをコンパイルする便利な API があります:

core = ov.Core() 
compiled_model = core.compile_model(model=model_path, 
    device_name=device_name)
ov::Core core; 
// ステップ 1: ov::Core オブジェクトの作成 
auto compiled = core.compile_model(modelPath, device, config); 
// ステップ 2: ファイルパスでモデルをコンパイル

モデルのキャッシュを有効にすると、read_model も最適化されていれば合計ロード時間はさらに短くなります。

core = ov.Core() 
core.set_property({props.cache_dir: path_to_cache_dir}) 
compiled_model = core.compile_model(model=model_path, 
    device_name=device_name)
ov::Core core; // ステップ 1: ov::Core オブジェクトの作成 
core.set_property(ov::cache_dir("/path/to/cache/dir")); // ステップ 1b: キャッシュを有効化 
auto compiled = core.compile_model(modelPath, device, config); // ステップ 2: ファイルパスでモデルをコンパイル
../../../../_images/caching_times.svg

高度なサンプル#

すべてのデバイスがネットワークのインポート/エクスポートをサポートしているわけではありません。サポートしないデバイスでは、キャッシュを有効にしても効果はありません。特定のデバイスがモデルのキャッシュをサポートしているか事前に確認するには、アプリケーションで次のコードを実行します:

import openvino.properties.device as device 

# サポートされている機能で 'EXPORT_IMPORT' 機能を検出 
caching_supported = 'EXPORT_IMPORT' in 
core.get_property(device_name, device.capabilities)
// サポートされているデバイス機能のリストを取得 
std::vector<std::string> caps = core.get_property(deviceName, 
    ov::device::capabilities); 

// サポートされている機能で 'EXPORT_IMPORT' 機能を検出 
bool cachingSupported = std::find(caps.begin(), caps.end(), 
    ov::device::capability::EXPORT_IMPORT) != caps.end();