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

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

[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