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