C API インターフェイスのデモ (C/C++)#

このデモでは、OpenVINO モデルサーバーの C API を使用して C および C++ アプリケーションを作成する方法を示します。アプリケーションのビルドは、エンドツーエンドの使用フローを示すため Docker コンテナ内で実行されます。C API の完全なドキュメントを確認してください。

デモ画像を準備#

サンプルのあるディレクトリーに移動し、すべての依存関係とサンプルを含むデモ Docker イメージをビルドします。このイメージは、openvino/model_server-capi という名前です。サンプルイメージには、アプリケーションに必要なダミーモデルと config.json が含まれています。

git clone https://github.com/openvinotoolkit/model_server.git 
cd model_server/demos/c_api_minimal_app 
make

make コマンドは、ウェブから ovms.tar.gz パッケージをダウンロードし、c_api_minimal_app/capi_files/demos/MakefileCapi を実行してアプリケーションをビルドします。そして、イメージ環境で /ovms/bin/demo1 アプリケーションと /ovms/bin/demo2_c アプリケーションを実行します。

サンプル・アプリケーションのソースコードは、ovms リポジトリー・パス src/main_capi.c および src/main_capi.cpp にあります。または、ビルドされたイメージを変更します。

docker run -it openvino/model_server-capi:latest cat main_capi.c cat main_capi.cpp

その後、MakefileCapi ルールを使用して、変更したサンプルをリビルドして実行します。

make -f MakefileCapi c 
make -f MakefileCapi cpp

main_capi.cpp バイナリーを /ovms/lib の libovms_shared.so ライブラリーとリンクし、/ovms/include ディレクトリーのヘッダーを使用します。

g++ main_capi.cpp -I/ovms/include -L/ovms/lib -lovms_shared -o main_capi ./main_capi

出力例は次のとおりです:

[2022-12-19 11:39:41.428][14][serving][info][modelinstance.cpp:797] Loaded model dummy; version: 1; batch size: 30; No of InferRequests: 12 
[2022-12-19 11:39:41.428][14][serving][debug][modelversionstatus.cpp:88] setAvailable: dummy - 1 (previous state: LOADING) -> error: OK 
[2022-12-19 11:39:41.428][14][serving][info][modelversionstatus.cpp:113] STATUS CHANGE: Version 1 of model dummy status change.New status: ( "state": "AVAILABLE", "error_code": "OK" ) 
[2022-12-19 11:39:41.428][14][serving][info][model.cpp:88] Updating default version for model: dummy, from: 0 
[2022-12-19 11:39:41.428][14][serving][info][model.cpp:98] Updated default version for model: dummy, to: 1 
[2022-12-19 11:39:41.428][14][modelmanager][info][modelmanager.cpp:478] Configuration file doesn't have custom node libraries property. 
[2022-12-19 11:39:41.428][14][modelmanager][info][modelmanager.cpp:495] Configuration file doesn't have pipelines property. 
[2022-12-19 11:39:41.428][14][serving][info][servablemanagermodule.cpp:44] ServableManagerModule started Server ready for inference 
[2022-12-19 11:39:41.428][14][serving][debug][capi.cpp:606] Processing C-API inference request for servable: dummy; version: 1 
[2022-12-19 11:39:41.428][14][serving][debug][modelmanager.cpp:1350] Requesting model: dummy; version: 1.
[2022-12-19 11:39:41.428][14][serving][debug][modelinstance.cpp:1013] Model: dummy, version: 1 already loaded 
[2022-12-19 11:39:41.428][14][serving][debug][modelinstance.cpp:1187] Getting infer req duration in model dummy, version 1, nireq 0: 0.002 ms 
[2022-12-19 11:39:41.428][478][modelmanager][info][modelmanager.cpp:900] Started model manager thread 
[2022-12-19 11:39:41.428][14][serving][debug][modelinstance.cpp:1195] Preprocessing duration in model dummy, version 1, nireq 0: 0.000 ms 
[2022-12-19 11:39:41.428][14][serving][debug][modelinstance.cpp:1205] Deserialization duration in model dummy, version 1, nireq 0: 0.019 ms 
[2022-12-19 11:39:41.428][479][modelmanager][info][modelmanager.cpp:920] Started cleaner thread 
[2022-12-19 11:39:41.429][14][serving][debug][modelinstance.cpp:1213] Prediction duration in model dummy, version 1, nireq 0: 0.369 ms 
[2022-12-19 11:39:41.429][14][serving][debug][modelinstance.cpp:1222] Serialization duration in model dummy, version 1, nireq 0: 0.011 ms 
[2022-12-19 11:39:41.429][14][serving][debug][modelinstance.cpp:1230] Postprocessing duration in model dummy, version 1, nireq 0: 0.000 ms 
[2022-12-19 11:39:41.429][14][serving][debug][capi.cpp:650] Total C-API req processing time: 0.474 ms 
output is correct 
No more job to be done, will shut down 
[2022-12-19 11:39:41.429][14][serving][info][grpcservermodule.cpp:177] GRPCServerModule shutting down 
[2022-12-19 11:39:41.429][14][serving][info][grpcservermodule.cpp:180] Shutdown gRPC server 
[2022-12-19 11:39:41.429][14][serving][info][grpcservermodule.cpp:184] GRPCServerModule shutdown 
[2022-12-19 11:39:41.429][14][serving][info][httpservermodule.cpp:54] HTTPServerModule shutting down [evhttp_server.cc : 320] NET_LOG: event_base_loopexit() exits with value 0 [evhttp_server.cc : 253] NET_LOG: event_base_dispatch() exits with value 1 
[2022-12-19 11:39:41.604][14][serving][info][httpservermodule.cpp:59] Shutdown HTTP server 
[2022-12-19 11:39:41.604][14][serving][info][servablemanagermodule.cpp:54] ServableManagerModule shutting down 
[2022-12-19 11:39:41.604][478][modelmanager][info][modelmanager.cpp:916] Stopped model manager thread 
[2022-12-19 11:39:41.604][479][modelmanager][info][modelmanager.cpp:930] Stopped cleaner thread 
[2022-12-19 11:39:41.604][14][serving][info][modelmanager.cpp:985] Shutdown model manager 
[2022-12-19 11:39:41.604][14][serving][info][modelmanager.cpp:993] Shutdown cleaner thread 
[2022-12-19 11:39:41.604][14][serving][info][servablemanagermodule.cpp:57] ServableManagerModule shutdown

カスタムモデルを使用することもできますが、その場合はビルドイメージにコピーし、それに応じて構成とサンプル・アプリケーションを調整する必要があります。結果として得られるデモイメージの変更を永続的にするには、c_api_minimal_app/capi_files/ ディレクトリー内にある次の dockerfile を変更します: Dockerfile.ubuntu Dockerfile.redhat

そして、OS 固有の引数を指定してデモ make を実行します:

make BASE_OS=redhat

libovms_shared.so をビルド#

ウェブから ovms.tar.gz パッケージを取得する代わりに、ソースから自身でビルドすることもできます。Capi Docker イメージをビルドするには、まず libovms_shared.so ライブラリーと ovms.h ヘッダーを含む ovms.tar.gz パッケージをビルドする必要があります。 ovms git メイン・ディレクトリーで make コマンドを実行します。

git clone https://github.com/openvinotoolkit/model_server.git 
cd model_server make

次に、代替の make target を実行します:

cd demos/c_api_minimal_app make all_docker

Capi ベンチマーク#

このガイドでは、OpenVINO モデルサーバー C-API を使用してベンチマーク・テストを実行する方法を示します。モデルサーバーを起動し、合成データを含む順次要求を送信するマルチスレッド・クライアントからのロードを開始します。特定のモデル、構成、C-API 呼び出しの予想されるスループットとレイテンシーを実証できます。

OpenVINO™ モデルサーバー GitHub リポジトリーのクローンを作成し、トップ・ディレクトリーに移動します。

git clone https://github.com/openvinotoolkit/model_server.git 
cd model_server/demos/c_api_minimal_app

ツールをビルド

make
  • コマンド

docker run openvino/model_server-capi:latest -c /ovms/bin/capi_benchmark 
OpenVINO Model Server 
Usage: 
    /ovms/bin/capi_benchmark [OPTION...]
    -h, --help                Show this help message and exit 
    --log_level LOG_LEVEL     serving log level - one of TRACE, DEBUG, 
                              INFO, WARNING, ERROR (default: ERROR) 
    --config_path CONFIG_PATH 
                              Config file path for OVMS to read (default: 
                              /ovms/src/test/c_api/config_benchmark.json) 
    --niter NITER             number of inferences to conduct (default: 
                              1000) 
    --nstreams NSTREAMS       nstreams from OVMS configuration (default: 
                              1) 
    --servable_name MODEL_NAME 
                              Model name to sent request to 
    --servable_version MODEL_VERSION 
                              workload threads per ireq, if not set 
                              version will be set by default model 
                              version policy (default: 0) 
    --mode MODE                Workload mode.Possible values: 
                              INFERENCE_ONLY, RESET_BUFFER, RESET_REQUEST 
                              (default: INFERENCE_ONLY) 
    --seed SEED               Random values generator seed.

利用可能なモード#

  • INFERENCE_ONLY (デフォルト) は、C-API を使用して推論を実行するのにかかる時間のみを測定します

  • RESET_BUFFER は、推論要求データバッファーの再作成にかかる時間を含みます

  • RESET_REQUEST は、推論要求全体を再作成するのにかかる時間を含みます

サンプルモデルを使用して測定を実行します。config_path オプションを使用して別のモデルを指定し、目的の構成ファイルを指定できます。

docker run openvino/model_server-capi:latest -c '/ovms/bin/capi_benchmark --servable_name dummy --nstreams 12 --config_path /ovms/demos/config_benchmark.json' 
Mode requested: INFERENCE_ONLY 
Server ready for inference 
Benchmark starting workload 
FPS: 235128 
Average latency : 0.053ms 
main() exit