OpenVINO™ をアプリケーションと統合#
ここで示す手順に従って、アプリケーションに典型的な OpenVINO™ ランタイム推論パイプラインを実装できます。続行する前に、OpenVINO ランタイムがインストールされていることを確認し、環境変数を設定してください (Linux* の場合は <INSTALL_DIR>/setupvars.sh
を、Windows* PowerShell では setupvars.ps1
、または Windows* CMD では setupvars.bat
を実行します)。そうしないと、OpenVINO_DIR
変数が find_package
呼び出しを渡すように構成されません。
ステップ 1. OpenVINO ランタイムコアの作成#
OpenVINO™ ランタイムでの動作に必要なファイルをインクルードして、利用可能なデバイスを管理し、モデル・オブジェクトを読み取る OpenVINO™ コアを作成します:
import openvino as ov
core = ov.Core()
#include <openvino/openvino.hpp>
ov::Core core;
#include <openvino/c/openvino.h>
ov_core_t* core = NULL;
ov_core_create(&core);
ステップ 2. モデルをコンパイル#
ov::CompiledModel
クラスは、デバイス固有のコンパイル済みモデルを表します。ov::CompiledModel
を使用すると、テンソル名またはインデックスによって情報の入力または出力ポートを取得できます。このアプローチは、ほとんどのフレームワークに適合しています。AUTO モード では、推論を実行する最適なハードウェアが自動的に選択されます。
ov::Core::compile_model()
を使用して、特定のデバイス向けモデルをコンパイルします:
compiled_model = core.compile_model("model.xml", "AUTO")
compiled_model = core.compile_model("model.onnx", "AUTO")
compiled_model = core.compile_model("model.pdmodel", "AUTO")
compiled_model = core.compile_model("model.pb", "AUTO")
compiled_model = core.compile_model("model.tflite", "AUTO")
def create_model(): # この例は、ov::Function を作成する方法を示します
#
# モデルを構築するには、次の手順に従ってください:
# https://docs.openvino.ai/2024/openvino-workflow/running-inference/integrate-openvino-with-your-application/model-representation.html
data = ov.opset8.parameter([3, 1, 2], ov.Type.f32)
res = ov.opset8.result(data)
return ov.Model([res], [data], "model")
model = create_model()
compiled_model = core.compile_model(model, "AUTO")
ov::CompiledModel compiled_model = core.compile_model("model.xml", "AUTO");
ov::CompiledModel compiled_model = core.compile_model("model.onnx", "AUTO");
ov::CompiledModel compiled_model = core.compile_model("model.pdmodel", "AUTO");
ov::CompiledModel compiled_model = core.compile_model("model.pb", "AUTO");
ov::CompiledModel compiled_model = core.compile_model("model.tflite", "AUTO");
auto create_model = []() {
std::shared_ptr<ov::Model> model;
// モデルを構築するには、次の手順に従ってください:
// https://docs.openvino.ai/2024/openvino-workflow/running-inference/integrate-openvino-with-your-application/model-representation.html
return model;
};
std::shared_ptr<ov::Model> model = create_model();
compiled_model = core.compile_model(model, "AUTO");
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model_from_file(core, "model.xml", "AUTO", 0, &compiled_model);
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model_from_file(core, "model.onnx", "AUTO", 0, &compiled_model);
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model_from_file(core, "model.pdmodel", "AUTO", 0, &compiled_model);
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model_from_file(core, "model.pb", "AUTO", 0, &compiled_model);
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model_from_file(core, "model.tflite", "AUTO", 0, &compiled_model);
// モデルを構築
ov_model_t* model = NULL;
ov_core_read_model(core, "model.xml", NULL, &model);
ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model(core, model, "AUTO", 0, &compiled_model);
ov::Model
オブジェクトは、OpenVINO™ ランタイム内のモデルを表します。詳細については、OpenVINO™ モデルの表現ご覧ください。
上記のコードは、モデル・オブジェクトから単一ハードウェア・デバイスに関連付けられたコンパイル済みモデルを作成します。必要な数のコンパイル済みモデルを作成し、それらを同時に使用することができます (ハードウェアの上限まで)。サポートされているデバイスと推論モードの詳細については、推論デバイスとモードの記事を参照してください。
ステップ 3. 推論要求の作成#
ov::InferRequest
クラスは、OpenVINO™ ランタイムでのモデル推論のメソッドを提供します。次のコードを使用して推論要求を作成します (詳細については、InferRequest のドキュメントを参照してください)。
infer_request = compiled_model.create_infer_request()
ov::InferRequest infer_request = compiled_model.create_infer_request();
ov_infer_request_t* infer_request = NULL;
ov_compiled_model_create_infer_request(compiled_model, &infer_request);
ステップ 4. 入力をセット#
外部メモリーを使用して ov::Tensor
を作成し、ov::InferRequest::set_input_tensor
メソッドを使用してこのテンソルをデバイスに配置できます:
# 外部メモリーからテンソルを作成
input_tensor = ov.Tensor(array=memory, shared_memory=True)
# 1 つの入力を持つモデルの入力テンソルを設定 infer_request.set_input_tensor(input_tensor)
// 入力が 1 つあるモデルの入力ポートを取得
auto input_port = compiled_model.input();
// 外部メモリーからテンソルを作成
ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), memory_ptr);
// 1 つの入力を持つモデルの入力テンソルを設定
infer_request.set_input_tensor(input_tensor);
// 入力が 1 つあるモデルの入力ポートを取得
ov_output_const_port_t* input_port = NULL;
ov_model_const_input(model, &input_port);
// 入力ポートから入力形状を取得
ov_shape_t input_shape;
ov_const_port_get_shape(input_port, &input_shape);
// 入力のタイプを取得
ov_element_type_e input_type;
ov_port_get_element_type(input_port, &input_type);
// 外部メモリーからテンソルを作成
ov_tensor_t* tensor = NULL;
ov_tensor_create_from_host_ptr(input_type, input_shape, memory_ptr, &tensor);
// 1 つの入力を持つモデルの入力テンソルを設定
ov_infer_request_set_input_tensor(infer_request, tensor);
テキストデータをモデル入力とする方法については、追加資料を参照してください。
ステップ 5. 推論を開始#
OpenVINO™ ランタイムは、同期モードまたは非同期モードの推論をサポートします。非同期 API を使用すると、アプリケーションの全体的なフレームレートを向上させることができます。推論の完了を待機する代わりに、アクセラレーターがビジー状態でもアプリはホスト上で動作し続けることができます。ov::InferRequest::start_async
を使用して非同期モードでモデル推論を開始し、ov::InferRequest::wait
を呼び出して推論結果を待機することができます。
infer_request.start_async()
infer_request.wait()
infer_request.start_async();
infer_request.wait();
ov_infer_request_start_async(infer_request);
ov_infer_request_wait(infer_request);
このセクションでは、単純なパイプラインを示します。推論を実行する他の方法の詳細については、推論の実行をお読みください。
ステップ 6. 推論結果の処理#
出力テンソルを調べて、推論結果を処理します。
# 1 つの出力を持つモデルの出力テンソルを取得
output = infer_request.get_output_tensor()
output_buffer = output.data
# output_buffer[] - 出力テンソルデータへのアクセス
// テンソル名による出力テンソルの取得
auto output = infer_request.get_tensor("tensor_name");
const float *output_buffer = output.data<const float>();
// output_buffer[] - 出力テンソルデータへのアクセス
ov_tensor_t* output_tensor = NULL;
// テンソル・インデックスによる出力テンソルの取得
ov_infer_request_get_output_tensor_by_index(infer_request, 0, &output_tensor);
テキストデータをモデル出力とする方法については、追加資料を参照してください。
ステップ 7. 割り当てられたオブジェクトを解放 (C のみ)#
メモリーリークを避けるために、C API で開発されたアプリケーションは、割り当てられたオブジェクトを順に解放する必要があります。
ov_shape_free(&input_shape);
ov_tensor_free(output_tensor);
ov_output_const_port_free(input_port);
ov_tensor_free(tensor);
ov_infer_request_free(infer_request);
ov_compiled_model_free(compiled_model);
ov_model_free(model);
ov_core_free(core);
ステップ 8. OpenVINO™ ランタイムを使用したアプリケーションのリンクとビルド (例)#
このステップはプロジェクトによって異なる場合があります。この例では、プロジェクト構成に CMake とともに C++ および C アプリケーションが使用されます。
プロジェクトの構造を作成#
project/
├── CMakeLists.txt - ビルドする Cmake ファイル
├── ... - 追加フォルダー (includes など) /
└── src/ - ソースフォルダー
└── main.cpp
build/ - ビルド・ディレクトリー
...
project/
├── CMakeLists.txt - ビルドする Cmake ファイル
├── ... - 追加フォルダ (includes など) /
└── src/ - ソースフォルダー
└── main.c
build/ - ビルド・ディレクトリー
...
Cmake スクリプトを作成#
追加の CMake ビルドオプションの詳細については、CMake のページを参照してください。
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenVINO REQUIRED)
add_executable(${TARGET_NAME} src/main.cpp)
target_link_libraries(${TARGET_NAME} PRIVATE openvino::runtime)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenVINO REQUIRED)
add_executable(${TARGET_NAME_C} src/main.c)
target_link_libraries(${TARGET_NAME_C} PRIVATE openvino::runtime::c)
プロジェクトのビルド#
現在マシンで利用可能なビルドツールを使用して CMake を使用してプロジェクトをビルドするには、次のコマンドを実行します:
cd build/
cmake ../project
cmake --build .
関連情報#
画像分類、テキスト予測などのアプリケーションに OpenVINO パイプラインを実装する方法の具体的な例については、OpenVINO サンプルページを参照してください。
Hugging Face の OpenVINO IR 形式のモデル。