有向非巡回グラフ (DAG) スケジューラー¶
はじめに¶
有向非巡回グラフ (DAG) スケジューラーを使用すると、単一のクライアント要求で実行するモデルのパイプラインを作成できます。パイプラインは、予測要求の各ステップを処理する方法を定義する各種ノードを備えた有向非巡回グラフです。パイプラインを使用すると、すべてのモデルの中間結果をクライアントに返す必要がなくなります。これにより、モデルサーバーに送信される要求の数を最小限に抑え、ネットワークのオーバーヘッドを回避できます。各モデルの出力は別のモデルの入力にマッピングできます。中間結果はサーバーの RAM に保持されるため、後続の推論で再利用でき全体のレイテンシーが短縮されます。
このガイドでは、以下について説明します。
ノードタイプ¶
補助ノードタイプ¶
ノードには、要求ノードと応答ノードという 2 つの特別な種類があります。どちらも事前定義されており、作成するすべてのパイプライン定義に含まれます。
-
要求ノード
このノードはパイプラインを使用するため、どの入力を gRPC/REST 要求経由で送信するかを定義します。ノード名:
request
で参照できます。
-
応答ノード
-
このノードは、どの出力が最終パイプライン状態からフェッチされ、gRPC/REST 応答にパックされるかを定義します。これはパイプラインの最終ステージであるため、パイプライン構成で参照することはできません。最終出力を定義するには、
outputs
に設定します。
-
ディープラーニング・ノード・タイプ¶
-
DL モデル - このノードにはベースとなる OpenVINO™ モデルが含まれており、選択したターゲットデバイスで推論を実行します。これは構成ファイルで定義できます。各モデル入力は、gRPC/REST
request
または別のDL model
出力からの入力であるノードのdata_item
にマップする必要があります。ノードの出力は、別のノードの入力または応答ノードにマッピングされる場合があります。つまり、gRPC/RESTresponse
で公開されます。
カスタム・ノード・タイプ¶
-
カスタム - このノードを使用して、ニューラル・ネットワーク・モデルでは処理できないデータに対するすべての操作を実装できます。これは、custom_node_interface.h で定義された OVMS API を実装する C++ 動的ライブラリーによって表されます。カスタムノードは、OVMS に含まれる OpenCV を使用してデータ処理を実行するか、他のサードパーティー・コンポーネントを含めることができます。カスタム・ノード・ライブラリーは、定義をパイプライン構成に追加することによって OVMS にロードされます。設定には、拡張子
.so
が付いたコンパイル済みバイナリーへのパスが含まれます。カスタムノードはバージョン管理されません。つまり、1 つのカスタム・ノード・ライブラリーが 1 つの名前にバインドされます。別のバージョンをロードするには、別の名前を使用する必要があります。OpenVINO モデルサーバーの Docker イメージには、パイプラインですぐに使用できる事前構築されたカスタムノードが付属しています。ビルトインのカスタムノードのリストを参照し、カスタムノード開発者ガイドでカスタムノードを自身で開発する方法を学習してください。
データの逆多重化¶
パイプラインの実行中に、複数のバッチを含む要求を単一のバッチを含むブランチのセットに分割することができます。これにより、バッチサイズ 1 で構成されたモデルは、任意のバッチサイズで要求を処理できます。内部的には、OVMS デマルチプレクサーがデータを分割し、並列処理により結果を結合します。
ノード出力の逆乗算は、設定ファイルで demultiply_count
を追加することで有効になります。分割後に削除される最初の次元でバッチが結合されることを前提としています。
例:
ノードは形状
[8,1,3,224,224]
を含む出力を返します。デマルチプレクサーは形状
[1,3,224,224]
を指定して 8 つの要求を作成します。次のモデルは、それぞれ出力形状
[1,1001]
を持つ 8 つの要求を並列処理します。結果は形状
[8,1,1001]
を備えた単一の出力に結合されます。
構成ファイル¶
パイプライン設定は、モデル設定ファイルと同様に同じ json ファイルに配置されます。モデルは model_config_list
セクションで定義されますが、パイプラインは pipeline_config_list
セクションで設定されます。パイプライン内のノードは、model_config_list セクションで設定されたモデルのみを参照できます。
基本的なパイプライン・セクションのテンプレートを以下に示します。
{
"model_config_list": [...],
"custom_node_library_config_list": [
{
"name": "custom_node_lib",
"base_path": "/libs/libcustom_node.so"
}
],
"pipeline_config_list": [
{
"name": "<pipeline name>",
"inputs": ["<input1>",...],
"nodes": [
{
"name": "<node name>",
"model_name": <reference to the model>,
"type": "DL model",
"inputs": [
{"input": {"node_name": "request", # reference to pipeline input
"data_item": "<input1>"}} # input name from the request
],
"outputs": [ # mapping the model output name to node output name
{"data_item": "<model output>",
"alias": "<node output name>"}
]
},
{
"name": "custom_node_name",
"library_name": "custom_node_lib",
"type": "custom",
"params": {
"param1": "value1",
"param2": "value2",
},
"inputs": [
{"input": {"node_name": "request", # reference to pipeline input
"data_item": "<input1>"}} # input name from the request
],
"outputs": [
{"data_item": "<library_output>",
"alias": "<node_output>"},
]
}
],
"outputs": [ # pipeline outputs
{"label": {"node_name": "<node to return results>",
"data_item": "<node output name to return results>"}}
]
}
]
}
パイプライン構成オプションの説明¶
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
gRPC/REST 要求で指定された名前フィールドに関連するパイプライン識別子。 |
はい |
|
配列 |
gRPC/REST 要求に必要な入力名を定義します。 |
はい |
|
配列 |
クライアントへの最終的な gRPC/REST 応答のためパイプラインの実行が完了した後に、中間結果 (ノード) から取得される出力 (データ項目) を定義します。 |
はい |
|
配列 |
パイプラインとその接続で使用されるノードを宣言します。 |
はい |
ノードオプション¶
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
他のノードから参照できるノード名。 |
はい |
|
文字列 |
ベースとなるモデルを指定できます ( |
DL モデルノードに必要 |
|
整数 |
推論用のモデルバージョンを指定できます。DL モデルノードでのみ利用可能です。 |
いいえ |
|
文字列 |
ノードの種類は現在、次の 2 種類が利用可能です: |
はい |
|
整数 |
ノード出力を目的のチャンクに分割し、パイプラインの実行を分岐します。 |
いいえ |
|
文字列 |
実行前にパイプラインを収束し、結果を 1 つの入力に収集するようにノードをセットアップします。 |
いいえ |
|
配列 |
このノードと依存関係ノード間の入出力マッピングのリストを定義します。 |
はい |
|
配列 |
モデル出力名のエイリアスマッピングを定義します。後続のノードで使いやすいようにモデル出力名の名前を変更できます。 |
はい |
ノード入力オプション¶
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
ノードを定義します。 |
はい |
|
文字列 |
次が指すノードのリソースを定義します。 |
はい |
ノード出力オプション¶
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
ノードによって公開されるリソースの名前です。 |
はい |
|
文字列 |
データ項目に割り当てられた名前です。後続のノードでこのノードの結果を参照しやすくなります。 |
はい |
カスタム・ノード・オプション¶
パイプラインの定義にカスタムノードが含まれる場合、構成ファイルには custom_node_library_config_list
セクションが含まれる必要があります。次のコンポーネントが含まれます。
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
カスタム・ノード・ライブラリーの名前 - カスタム・ノード・パイプライン定義の参照として使用されます。 |
はい |
|
文字列 |
カスタムノード実装を使用して動的ライブラリーにパスを設定します。 |
はい |
パイプライン構成でのカスタムノード定義は、モデルノードと似ています。ノードの入力と出力は同じ方法で構成できます。この点では、カスタムノード機能は標準ノードと同様です。違いは追加パラメーターにあります。
オプション |
タイプ |
説明 |
必須 |
---|---|---|---|
|
文字列 |
|
はい |
|
文字列 |
|
はい |
|
文字列値を含む json オブジェクト |
カスタムノードの実装で使用できるパラメーターとその値のリスト。 |
いいえ |
パイプラインを使用¶
パイプラインではモデルと同じ API を使用できます。予測を実行する呼び出しは全く同じです。要求の形式はパイプライン定義の入力と一致する必要があります。
パイプライン構成は、gRPC GetModelMetadata 呼び出しと REST メタデータを使用して照会できます。パイプラインの入力と出力の定義を返します。
同様に、GetModelStatus および REST モデル状態呼び出しを使用してパイプラインの状態を照会できます。
パイプラインと個々のモデルの使用における唯一の違いは、バージョン管理です。パイプラインへのすべての呼び出しでは、バージョン・パラメーターは無視されます。パイプラインはバージョン管理されません。ただし、グラフ内のモデルの特定のバージョンを参照することはできます。
パイプラインの例¶
model_zoo_object_detection サンプル・カスタム・ノードを使用したデマルチプレクサーを使用した複数の車両の分析