OpenVINO™ ランタイム Python API 高度な推論¶
警告
ここで説明するすべての方法は、特定のハードウェアとソフトウェアの設定に大きく依存します。さまざまなモデルと入出力サイズを使用して独自の検証を行うことを検討してください。ここで紹介する方法は普遍的なものではなく、特定のパイプラインでは適用される場合とされない場合があります。すべてのトレードオフを考慮し、早まった最適化を避けてください。
CompiledModel
による直接推論¶
CompiledModel
クラスは、モデルを指定して単一の同期推論を実行する __call__
メソッドを提供します。コンパクトなコードに加えて、オブジェクトはすでに作成された InferRequest
を再利用するため、以降の CompiledModel.__call__
への呼び出しはオーバーヘッドが少なくなります。
# Calling CompiledModel creates and saves InferRequest object
results_0 = compiled_model({"input_0": data_0, "input_1": data_1})
# Second call reuses previously created InferRequest object
results_1 = compiled_model({"input_0": data_2, "input_1": data_3})
非同期呼び出しによるレイテンシーの隠蔽¶
非同期呼び出しを使用すると、レイテンシーを隠匿して、コード全体的の実行時間を最適化できます。例えば、InferRequest.start_async
は GIL を解放し、ノンブロッキング呼び出しを提供します。計算集約型の推論完了まで待機する間に、他の呼び出しを処理すると有益です。
使用例:
import time
# Long running function
def run(time_in_sec):
time.sleep(time_in_sec)
# No latency hiding
results = request.infer({"input_0": data_0, "input_1": data_1})[0]
run(time_in_sec)
# Hiding latency
request.start_async({"input_0": data_0, "input_1": data_1})
run(time_in_sec)
request.wait()
results = request.get_output_tensor(0).data # Gather data from InferRequest
注
潜在的な並列化のメリットを得るためコード内の実行フローを最適化するかどうかは、ユーザー/開発者の責任です。
非同期呼び出しによる “リターンの延期”¶
“リターンの延期” は、同期呼び出しから常に返される OVDict
のオーバーヘッドを排除する手法です。“リターンの延期” は以下の場合に適用されます。
出力データの一部のみが必要な場合。例えば、特定のパイプライン・ステップで特定の出力 1 つのみが重要であり、すべての出力は大きいため、コピーにコストがかかる場合。
データを “すぐには” 必要としない場合。例えば、レイテンシー隠匿の一部としてパイプライン内部で後で抽出することができる場合があります。
データをリターンする必要がない場合。例えば、モデルは純粋な
Tensor
インターフェイスでチェーンされている場合があります。
# Standard approach
results = request.infer({"input_0": data_0, "input_1": data_1})[0]
# "Postponed Return" approach
request.start_async({"input_0": data_0, "input_1": data_1})
request.wait()
results = request.get_output_tensor(0).data # Gather data "on demand" from InferRequest