モデルのキャッシュ概要

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

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

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

重要

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

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

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

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)
ov::Core core;                                              // Step 1: create ov::Core object
core.set_property(ov::cache_dir("/path/to/cache/dir"));     // Step 1b: Enable caching
auto model = core.read_model(modelPath);                    // Step 2: Read Model
//...                                                       // Step 3: Prepare inputs/outputs
//...                                                       // Step 4: Set device configuration
auto compiled = core.compile_model(model, device, config);  // Step 5: LoadNetwork

このコードでは、device_name で指定されたデバイスがモデルのインポート/エクスポートをサポートしている場合、キャッシュされた 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;                                                  // Step 1: create ov::Core object
auto compiled = core.compile_model(modelPath, device, config);  // Step 2: Compile model by file path

モデルのキャッシュを有効にすると、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;                                                  // Step 1: create ov::Core object
core.set_property(ov::cache_dir("/path/to/cache/dir"));         // Step 1b: Enable caching
auto compiled = core.compile_model(modelPath, device, config);  // Step 2: Compile model by file path
../../../../_images/caching_times.svg

高度なサンプル

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

import openvino.properties.device as device

# Find 'EXPORT_IMPORT' capability in supported capabilities
caching_supported = 'EXPORT_IMPORT' in core.get_property(device_name, device.capabilities)
// Get list of supported device capabilities
std::vector<std::string> caps = core.get_property(deviceName, ov::device::capabilities);

// Find 'EXPORT_IMPORT' capability in supported capabilities
bool cachingSupported = std::find(caps.begin(), caps.end(), ov::device::capability::EXPORT_IMPORT) != caps.end();