モデルのキャッシュ概要#
OpenVINO™ とアプリケーションの統合で説明されているように、一般的なアプリケーション・フローは次のステップで構成されます。
- コア・オブジェクトを作成:最初のステップでは、利用可能なデバイスを管理してモデル・オブジェクトを読み取ります
- 中間表現の読み取り:中間表現ファイルを ov::Model のオブジェクトに読み込みます
- 入力と出力の準備:必要に応じて、精度、メモリーレイアウト、サイズ、またはカラー形式を操作します
- 構成のセット:デバイス固有の読み込み設定をデバイスに渡します
- ネットワークをコンパイルしてデバイスへロード:特定のデバイスでov::Core::compile_model() メソッドを使用します
- 入力データのセット:入力テンソルを指定します
- 実行:推論を実行し、結果を処理します
ステップ 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 はキャッシュファイルに保存されます:
さらに高速化するには 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: ファイルパスでモデルをコンパイル
高度なサンプル#
すべてのデバイスがネットワークのインポート/エクスポートをサポートしているわけではありません。サポートしないデバイスでは、キャッシュを有効にしても効果はありません。特定のデバイスがモデルのキャッシュをサポートしているか事前に確認するには、アプリケーションで次のコードを実行します:
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();