自動デバイス選択#

自動デバイス選択モード (略して AUTO) は、 “仮想” または “プロキシー” デバイスを使用します。これは、特定の種類のハードウェアにバインドされず、推論用の処理ユニットを自動的に選択します。利用可能なデバイスを検出し、タスクに最適なデバイスを選択し、その最適化設定を構成します。これにより、アプリケーションを一度作成することで、どこにでもデプロイできます。

プロセスから一部のハードウェアを除外することを選択すると、選択は “ヒント” 構成 API で定義されたパフォーマンス要件や、デバイスの優先順位リストの制限にも依存します。

選択の論理は次のとおりです:

  1. サポートされているデバイスを確認します。

  2. 入力モデルの精度を確認します (精度の詳細については、ov::device::capabilities を参照してください)。

  3. 以下の表に示されるように、特定のモデルをサポートする最も優先度の高いデバイスを選択します。

  4. モデルの精度が FP32 であり、それをサポートできるデバイスがない場合は、モデルを FP16 をサポートするデバイスにオフロードします。

デバイスの優先順位

サポートされるデバイス

サポートされるモデル精度

1

dGPU (例: インテル® Iris® Xe MAX)

FP32、FP16、INT8、BIN

2

iGPU (例: インテル® UHD グラフィックス 620 (iGPU))

FP32、FP16、BIN

3

インテル® CPU (例: インテル® Core™ i7-1165G7)

FP32、FP16、INT8、BIN

4

インテル® NPU (例: インテル® Core™ Ultra)

現在、NPU はデフォルトの優先順位リストから除外されていることに注意してください。推論に使用するには、明示的に指定する必要があります。

AUTO の仕組み#

リストの最初のデバイスへのモデルのロードが失敗すると、AUTO はいずれかのデバイスが成功するまで、そのラインにある次のデバイスへのロードを試行します。重要なことは、最適なデバイス用にモデルがキャッシュされていない限り、AUTO はデフォルトでシステムの CPU を使用して推論を開始することです。これは、待ち時間が非常に短く、追加のレイテンシーなしで推論を開始できるためです。CPU が推論を実行している間、AUTO は最適なデバイスにモデルをロードし続け、準備ができたらタスクをデバイスに転送します。これにより、モデルのコンパイルがはるかに遅いデバイス (GPU がその例) は、初期ステージでは推論に影響を与えません。例えば、CPU と GPU を使用する場合、AUTO の最初の推論レイテンシーは、GPU を単独で使用する場合よりも向上します。

優先リストから CPU を除外するか、ov::intel_auto::enable_startup_fallback によって初期の CPU アクセラレーション機能を無効にした場合、初期のモデル・コンパイル・ステージをサポートできなくなることに注意してください。ステートフル操作を持つモデルが候補リストにある場合、CPU にロードされます。それ以外の場合、これらのモデルは通常のフローに従い、優先順位に基づいてデバイスにロードされます。

../../../_images/autoplugin_accelerate.svg

このメカニズムは、ベンチマーク・アプリで AUTO を使用のサンプルセクションで観察でき、AUTO を使用したときに最初の推論のレイテンシー (モデルのコンパイルと最初の推論の実行にかかる時間) がどのように短縮されるかを示しています。次に例を示します:

benchmark_app -m ../public/alexnet/FP32/alexnet.xml -d GPU -niter 128
benchmark_app -m ../public/alexnet/FP32/alexnet.xml -d AUTO -niter 128

プロセスの実行時間が長ければ長いほど、リアルタイム・パフォーマンスは最適なデバイスのパフォーマンスに近づきます。

AUTO を使用#

OpenVINO™ 命名規則に従って、自動デバイス選択モードには “AUTO” ラベルが割り当てられます。追加のパラメーターを指定せずに定義してデフォルトを使用することも、次のセットアップ・オプションを使用してさらに構成することもできます:

プロパティー (C++ バージョン)

値と説明

<デバイス候補リスト>

:

AUTO

AUTO: <device names> (スペースなしのカンマ区切り)

選択可能なデバイスをリスト。デバイスの順序は、高から低の順に優先されます。指定しない場合、デフォルトとして AUTO が使用され、すべてのデバイスが候補として “表示” されます。

ov::device::priorities

:

<device names> (スペースなしのカンマ区切り)

AUTO で選択するデバイスを指定。デバイスの順序は、高から低の順に優先されます。この構成はオプションです。

ov::hint::performance_mode

:

ov::hint::PerformanceMode::LATENCY

ov::hint::PerformanceMode::THROUGHPUT

ov::hint::PerformanceMode::CUMULATIVE_THROUGHPUT

アプリケーションが優先するパフォーマンス・オプションを指定します。

ov::hint::model_priority

:

ov::hint::Priority::HIGH

ov::hint::Priority::MEDIUM

ov::hint::Priority::LOW

モデルの優先度を示します。

重要: このプロパティーはまだ完全にはサポートされていません。

ov::execution_devices

推論が実行されているランタイム・ターゲット・デバイスをリストします。

返される結果の例としては、(CPU)``(``CPU は一時的なデバイスであり、CPU がモデルのコンパイル段階での高速化に使用されることを示します) CPUGPUCPU GPUGPU.0 などがあります。

ov::intel_auto::enable_startup_fallback

:

true

false

最初に CPU をアクセラレーション (またはヘルパーデバイス) として有効/無効にします。デフォルト値は true で、デフォルトで CPU がアクセラレーションとして使用されることを示します。

ov::intel_auto::enable_runtime_fallback

:

true

false

現在選択されているデバイスで推論要求が失敗した場合、他のデバイスへのランタイム・フォールバックを有効または無効にし、失敗した推論要求を再度実行します。

デフォルト値は true です。

ov::intel_auto::schedule_policy

:

ROUND_ROBIN

DEVICE_PRIORITY

AUTO 累積モード (MULTI) のハードウェア・プラグインに割り当てる推論要求のスケジュール・ポリシーを指定します。

デフォルト値は DEVICE_PRIORITY です。

AUTO による推論は、デバイスプラグインが使用される場合と同様に構成されます: 構成を使用してプラグイン上でモデルをコンパイルし、推論を実行します。

ここのサンプルコードでは、コードの先頭に次の import (Python)/using (C++) が含まれていることを前提としています。

import openvino as ov 
import openvino.properties as properties 
import openvino.properties.device as device 
import openvino.properties.hint as hints 
import openvino.properties.streams as streams 
import openvino.properties.intel_auto as intel_auto
#include <openvino/openvino.hpp>

デバイスの候補と優先順位#

デバイス候補リストを使用すると、優先順位をカスタマイズし、AUTO で使用できるデバイスの選択を制限できます。

  • デバイス候補リストが指定されていない場合、AUTO はシステム内に存在するすべてのデバイスが使用できると想定します。

  • デバイス名なしの AUTO を指定した場合、AUTO はシステム内に存在するすべてのデバイスが使用可能であると想定し、ネットワークをすべてのデバイスにロードし、デフォルトの優先順位 (高から低) に基づいて推論を実行します。

デバイスの優先順位を指定するには、AUTO: <device names> にデバイス名を優先順位 (高から低) で入力するか、ov::device::priorities プロパティーを使用します。

AUTO の使用とデバイスの指定については、次のコードを参照してください:

 core = ov.Core() 

# デバイス候補のデフォルトリストを使用して、AUTO でモデルをコンパイルします。
# 次の行は同等です: 
compiled_model = core.compile_model(model=model) 
compiled_model = core.compile_model(model=model, device_name="AUTO") 

# オプション 
# AUTO で使用するデバイスを指定することもできます。
# 次の行は同等です: 
compiled_model = core.compile_model(
     model=model, device_name="AUTO:GPU,CPU") 
compiled_model = core.compile_model( 
     model=model, 
     device_name="AUTO", 
     config={device.priorities: "GPU,CPU"}, ) 

# オプション 
# AUTO プラグインは明示的なオプションで (グローバルに) 事前設定されます: 
core.set_property( 
    device_name="AUTO", properties={device.priorities: "GPU,CPU"} 
)
ov::Core core; 

// IR、PaddlePaddle、または ONNX 形式でネットワークを読み取る: 
std::shared_ptr<ov::Model> model = core.read_model("sample.xml"); 

// デバイス候補のデフォルトリストを使用して、AUTO でモデルをコンパイルします。
// 次の行は同等です: 
ov::CompiledModel model0 = core.compile_model(model); 
ov::CompiledModel model1 = core.compile_model(model, "AUTO"); 

// Optional 
// AUTO で使用するデバイスを指定することもできます。
// 次の行は同等です: 
ov::CompiledModel model3 = core.compile_model(model, "AUTO:GPU,CPU"); 
ov::CompiledModel model4 = core.compile_model(model, "AUTO", 
    ov::device::priorities("GPU,CPU")); 

// オプション 
// AUTO プラグインは明示的なオプションで (グローバルに) 事前設定されます: 
core.set_property("AUTO", ov::device::priorities("GPU,CPU"));

OpenVINO ランタイムでは、関数呼び出しで “GPU.0” のエイリアスとして “GPU” を使用できることに注意してください。デバイスの列挙の詳細については、推論デバイスとモードを参照してください。

利用可能なデバイスを確認#

システムにあるデバイスを確認するには、以下に示すデバイス API を使用できます。使用方法については、デバイスのプロパティーと構成の照会を参照してください。

openvino.runtime.Core.available_devices

「Hello デバイス照会 Python サンプル」を参照してください。

ov::runtime::Core::get_available_devices()

「Hello デバイス照会 C++ サンプル」を参照してください。

デバイス候補リストからデバイスを除外#

例えば、他のジョブの実行に CPU を予約するため、ハードウェア・デバイスを AUTO から除外することもできます。その場合、AUTO は推論にデバイスを使用しません。これを行うには、次の例のように、AUTO: <device names> で CPU の前にマイナス記号 (-) を追加します。

compiled_model = core.compile_model(model=model, device_name="AUTO:-CPU")
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO:-CPU");

次に、AUTO は利用可能なすべてのデバイスを照会し、CPU を候補リストから削除します。

デバイス候補リストから CPU すると、CPU はモデルの初期コンパイルステージをサポートできなくなることに注意してください。詳細は、AUTO の仕組みを参照してください。

AUTO のパフォーマンス・ヒント#

ov::hint::performance_mode プロパティーを使用すると、AUTO のパフォーマンス・オプションをより効率的に指定できます。AUTO のデフォルトのヒントは LATENCY です。

以下の THROUGHPUT と CUMULATIVE_THROUGHPUT のヒントは、非同期推論パイプラインのパフォーマンスのみを向上させます。このトピックに関する詳細は、非同期 API のドキュメントを参照してください。次のノートブックでは、非同期パイプラインを設定する例を示します:

レイテンシー#

このオプションでは低レイテンシーが優先され、各推論ジョブの応答時間が短くなります。単一の入力画像で推論が必要なタスクに最適なパフォーマンスを発揮します。例: 超音波スキャン画像の医学的分析。また、環境内で動作する産業用ロボットの反応、または自律走行車の障害物回避などのリアルタイムのアプリケーション・タスクにも適合します。

パフォーマンスのヒントが設定されていない場合、AUTO は ov::device::properties を設定していないデバイスに LATENCY を設定します。例えば、ov::device::properties(<DEVICE_NAME>, ov::hint::performance_mode(ov::hint::LATENCY)))。

THROUGHPUT#

このオプションは、高スループットを目標とし、レイテンシーと電力のバランスを優先します。ビデオフィードや大量の画像の推論など、複数のジョブを伴うタスクに最適です。

CUMULATIVE_THROUGHPUT#

LATENCYTHROUGHPUT では、パフォーマンス・オプションを使用して 1 つのターゲットデバイスを選択できますが、CUMULATIVE_THROUGHPUT オプションを使用すると、複数のデバイスで推論を実行することでスループットを高めることができます。CUMULATIVE_THROUGHPUT を使用すると、AUTO は候補リスト内の利用可能なデバイス (AUTO で指定) にネットワーク・モデルをロードし、デフォルトまたは指定された優先順位に基づいてそれらのデバイスで推論を実行します。

CUMULATIVE_THROUGHPUT でデバイスの優先順位が指定されている場合、AUTO は優先順位に基づいてデバイス上で推論要求を実行します。次の例では、AUTO は常に最初に GPU を使用し、GPU がビジーな場合は次に CPU を使用します:

compiled_model = core.compile_model(model, "AUTO:GPU,CPU", {hints.performance_mode: hints.PerformanceMode.CUMULATIVE_THROUGHPUT})
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO:GPU,CPU", ov::hint::performance_mode(ov::hint::PerformanceMode::CUMULATIVE_THROUGHPUT));

デバイス名を指定せずに AUTO が使用され、システム内に複数の GPU がある場合、CUMULATIVE_THROUGHPUT モードはデフォルトですべての GPU を使用します。システムに 3 つ以上の GPU デバイスがある場合、AUTO はデバイス候補リストから CPU を削除し、すべての GPU で実行し続けます。システムデバイスとその一意の識別子の完全なリストは、ov::Core::get_available_devices を使用して照会できます (詳細については、デバイス・プロパティーの照会を参照してください)。GPU を明示的に指定するには、AUTO でコンパイルする際に優先順位を設定します:

compiled_model = core.compile_model(model, "AUTO:GPU.1,GPU.0", {hints.performance_mode: hints.PerformanceMode.CUMULATIVE_THROUGHPUT})
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO:GPU.1,GPU.0", ov::hint::performance_mode(ov::hint::PerformanceMode::CUMULATIVE_THROUGHPUT));

サンプルコード#

アプリケーションのパフォーマンス・ヒントを有効にするには、次のコードを使用します:

 core = ov.Core() 

# パフォーマンス・ヒントを有効にして AUTO でモデルをコンパイル: 
# “THROUGHPUT” モードを使用するには: 
compiled_model = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        hints.performance_mode: hints.PerformanceMode.THROUGHPUT 
    }, 
) 
# “LATENCY” モードを使用するには: 
compiled_model = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        hints.performance_mode: hints.PerformanceMode.LATENCY 
    }, 
) 
# “CUMULATIVE_THROUGHPUT” モードを使用するには: 
# ROUND_ROBIN スケジュール・ポリシーを使用するには: 
compiled_model = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        hints.performance_mode: hints.PerformanceMode.CUMULATIVE_THROUGHPUT, intel_auto.schedule_policy: 
        intel_auto.SchedulePolicy.ROUND_ROBIN 
    }, 
)
ov::Core core; 

// IR、PaddlePaddle、または ONNX 形式でネットワークを読み取る: 
std::shared_ptr<ov::Model> model = core.read_model("sample.xml"); 

// パフォーマンス・ヒントを有効にして AUTO でモデルをコンパイル: 
// “THROUGHPUT” オプションを使用するには: 
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO", 
    ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT)); 
// “LATENCY” オプションを使用するには: 
ov::CompiledModel compiled_mode2 = core.compile_model(model, "AUTO", 
    ov::hint::performance_mode(ov::hint::PerformanceMode::LATENCY)); 
// “CUMULATIVE_THROUGHPUT” オプションを使用するには: 
ov::CompiledModel compiled_mode3 = core.compile_model(model, "AUTO", 
    ov::hint::performance_mode(ov::hint::PerformanceMode::CUMULATIVE_THROUGHPUT));

THROUGHPUT および CUMULATIVE_THROUGHPUT の自動バッチ処理の無効化#

ov::hint::PerformanceMode::THROUGHPUT モードと ov::hint::PerformanceMode::CUMULATIVE_THROUGHPUT モードは、デフォルトで自動バッチ処理 (GPU デバイスなど) をトリガーします。ov::hint::allow_auto_batching(false) を設定するか、デフォルトのタイムアウト値を大きな数値 (例: ov::auto_batch_timeout(1000)) に変更することでこれを無効にできます。自動バッチ処理を参照してください。

モデルの優先順位を構成#

ov::hint::model_priority プロパティーを使用すると、Auto-Device プラグイン内のモデルの優先順位を制御できます。高い優先度のモデルは、サポートされている高優先度デバイスにロードされます。優先度の低いモデルは、優先度の高いモデルが占有するデバイスにはロードされません。

 core = ov.Core() 

# 例 1 
compiled_model0 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={hints.model_priority: hints.Priority.HIGH}, 
) 
compiled_model1 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        hints.model_priority: hints.Priority.MEDIUM 
    }, 
) 
compiled_model2 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={hints.model_priority: hints.Priority.LOW}, 
) 
# すべてのデバイス (CPU と GPU) がすべてのネットワークをサポートできると想定します。
# 結果: compiled_model0 は GPU.1 を使用し、compiled_model1 は GPU.0 を使用し、compiled_model2 は CPU を使用します。
# 例 2 
compiled_model3 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={hints.model_priority: hints.Priority.HIGH}, 
) 
compiled_model4 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        hints.model_priority: hints.Priority.MEDIUM 
    }, 
) 
compiled_model5 = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={hints.model_priority: hints.Priority.LOW}, 
) 
# すべてのデバイス (CPU および GPU) がすべてのネットワークをサポートできると想定します。
# 結果: compiled_model3 は GPU.1 を使用し、compiled_model4 は GPU.1 を使用し、compiled_model5 は GPU.0 を使用します。
// 例 1 
ov::CompiledModel compiled_model0 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::HIGH)); 
ov::CompiledModel compiled_model1 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::MEDIUM)); 
ov::CompiledModel compiled_model2 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::LOW)); 
/************ 
すべてのデバイス (CPU と GPU) がすべてのモデルをサポートできると想定します。
結果: compiled_model0 は GPU.1 を使用し、compiled_model1 は GPU.0 を使用し、compiled_model2 は CPU を使用します。
************/ 

// 例 2 
ov::CompiledModel compiled_model3 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::LOW)); 
ov::CompiledModel compiled_model4 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::MEDIUM)); 
ov::CompiledModel compiled_model5 = core.compile_model(model, "AUTO", 
    ov::hint::model_priority(ov::hint::Priority::LOW)); 
/************ 
すべてのデバイス (CPU と GPU) がすべてのモデルをサポートできると想定します。
結果: compiled_model3 は GPU.1 を使用し、compiled_model4 は GPU.1 を使用し、compiled_model5 は GPU.0 を使用します。 
************/

ターゲット・ランタイム・デバイスの確認#

AUTO で推論が実行されているランタイム・ターゲット・デバイスを照会するには、ov::execution_devices プロパティーを使用できます。これは get_property とともに使用する必要があります。例:

 core = ov.Core() 

# モデルを AUTO でコンパイルし、ログレベルをデバッグに設定 
compiled_model = core.compile_model(model=model, device_name="AUTO") 
# 推論が実行されているランタイム・ターゲット・デバイスを照会 
execution_devices = compiled_model.get_property(properties.execution_devices)
ov::Core core; 

// IR、PaddlePaddle、または ONNX 形式でネットワークを読み取る 
std::shared_ptr<ov::Model> model = core.read_model("sample.xml"); 

// モデルを AUTO でコンパイルし、ログレベルをデバッグに設定 
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO"); 
// 推論が実行されているランタイム・ターゲット・デバイスを照会 
ov::Any execution_devices = compiled_model.get_property(ov::execution_devices);

個々のデバイスの構成と自動デバイスプラグインの作成#

現時点では、上記の方法が AUTO 推論実行の推奨方法ですが、次の手順を代替手段として使用することもできます。現在、これは従来の機能として利用可能であり、AUTO がパフォーマンス・ヒント・オプションを利用できない場合に使用されます。

 core = ov.Core() 

# gpu_config と cpu_config は compile_model() 中にロードされます 
gpu_config = { 
    hints.performance_mode: hints.PerformanceMode.THROUGHPUT, 
    streams.num: 4 
} 
cpu_config = { 
    hints.performance_mode: hints.PerformanceMode.LATENCY, 
    streams.num: 8, 
    properties.enable_profiling: True 
} 
compiled_model = core.compile_model( 
    model=model, 
    device_name="AUTO", 
    config={ 
        device.priorities: "GPU,CPU", 
        device.properties: {'CPU': cpu_config, 'GPU': gpu_config} 
    } 
)
ov::Core core; 

// IR、TensorFlow、TensorFlow Lite、PaddlePaddle、または ONNX 形式でネットワークを読み取る: 
std::shared_ptr<ov::Model> model = core.read_model("sample.xml"); 

// モデルをコンパイルするときに CPU と GPU デバイスを構成 
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO", 
    ov::device::properties("CPU", cpu_config), 
    ov::device::properties("GPU", gpu_config));

OpenVINO サンプルおよびベンチマーク・アプリで AUTO を使用#

Auto-Device プラグインがどのように使用されているかを確認し、パフォーマンスをテストするには、OpenVINO™ サンプルをご覧ください。“-d” コマンドライン・オプション (“デバイス” の略) をサポートするすべてのサンプルは、そのままプラグインを受け入れます。ベンチマーク・アプリケーションは始めるのに最適です - リクエストや CPU スレッドの数などを追加設定することなく、プラグインの最適なパフォーマンスを示します。AUTO のパフォーマンスを評価するには、次のコマンドを使用できます:

無制限にデバイスを選択できる場合:

benchmark_app –d AUTO –m <model> -i <input> -niter 1000

デバイスの選択肢が限られている場合:

benchmark_app –d AUTO:CPU,GPU –m <model> -i <input> -niter 1000

詳細については、ベンチマーク・ツールを参照してください。

“-d AUTO” を使用する場合、デフォルトの CPU ストリームは 1 です。

FP16 IR を使用して自動デバイスを操作できます。

最適なデバイスの選択、GPU ストリーム/スロットルの使用などによって、AUTO 向けに完全に最適化されたデモはまだありません。

関連情報#