Hello NPU#
この Jupyter ノートブックは、ローカルへのインストール後にのみ起動できます。
OpenVINO™ での NPU 動作#
目次:
このチュートリアルでは、OpenVINO で NPU デバイスインテル® AI Boost (インテル® Core™ Ultra 世代の CPU で導入) の操作方法の概要を説明します。NPU の主要なプロパティーのいくつかを説明し、パフォーマンスのヒントを使用して NPU 上でモデルをコンパイルする方法を示します。
このチュートリアルでは、さまざまな構成で NPU パフォーマンスと CPU を比較するのに実行できる Benchmark_app のコマンド例も示します。
はじめに
ニューラル・プロセシング・ユニット (NPU) は、特定のニューラル・ネットワーク計算タスクを他のデバイスからオフロードして、リソース管理をより合理化できる低電力ハードウェア・ソリューションです。
NPU プラグインは OpenVINO™ の PIP インストールに含まれており、これを正常に使用するには適切な NPU ドライバーをインストールする必要があることに注意してください。
NPU デバイスの詳細については、このページを参照してください。
必要なパッケージをインストール#
%pip install -q "openvino>=2024.1.0" torch torchvision --extra-index-url https://download.pytorch.org/whl/cpu
Note: you may need to restart the kernel to use updated packages.
デバイス照会による NPU のチェック#
このセクションでは、利用可能な NPU を一覧表示し、そのプロパティーを確認する方法を説明します。いくつかの主要なプロパティーが定義されています。
Core.available_devices で NPU を一覧表示#
OpenVINO ランタイムは、推論に使用できるデバイスを確認する available_devices
メソッドを提供します。次のコードは、インテル NPU が表示される互換性のある OpenVINO デバイスのリストを出力します (ドライバーが正常にインストールされていることを確認してください)。
import openvino as ov
core = ov.Core()
core.available_devices
['CPU', 'GPU', 'NPU']
core.get_property でプロパティーを確認#
NPU に関する情報を取得するには、デバイスのプロパティーを使用できます。OpenVINO では、デバイスにはその特性と構成を説明するプロパティーがあります。各プロパティーには、get_property
メソッドで照会できる名前と関連する値があります。
デバイス名などのプロパティーの値を取得するには、次のように get_property
メソッドを使用します:
device = "NPU"
core.get_property(device, "FULL_DEVICE_NAME")
'Intel(R) AI Boost'
各デバイスには、SUPPORTED_PROPERTIES
と呼ばれる特定のプロパティーもあり、デバイスで使用可能なすべてのプロパティーを表示できます。core.get_property("NPU", "SUPPORTED_PROPERTIES")
によって返された辞書を単純にループし、そのプロパティーを照会することで、各プロパティー値を確認できます。
print(f"{device} SUPPORTED_PROPERTIES:\n")
supported_properties = core.get_property(device, "SUPPORTED_PROPERTIES")
indent = len(max(supported_properties, key=len))
for property_key in supported_properties:
if property_key not in ("SUPPORTED_METRICS", "SUPPORTED_CONFIG_KEYS", "SUPPORTED_PROPERTIES"):
try:
property_val = core.get_property(device, property_key)
except TypeError:
property_val = "UNSUPPORTED TYPE"
print(f"{property_key:<{indent}}: {property_val}")
主要なプロパティーの簡単な説明#
最後のコマンドに見られるように、各デバイスにはいくつかのプロパティーがあります。主要なプロパティーの一部は次のとおりです: - FULL_DEVICE_NAME
(NPU の製品名)。- PERFORMANCE_HINT
(デバイス固有の設定を気にすることなく、レイテンシーやスループットなどの特定のパフォーマンス・メトリックに合わせてデバイスを調整する高レベルの方法)。- CACHE_DIR
(コンパイル時間を短縮するモデルのキャッシュデータが保存されるディレクトリー)。- OPTIMIZATION_CAPABILITIES
(この NPU でサポートされるモデルのデータタイプ (INT8、FP16、FP32 など))。
デバイスとプロパティーの詳細については、デバイス・プロパティーの照会ページを参照してください。
NPU のモデルのコンパイル#
これで、システム内に存在する NPU が判明し、プロパティーを確認できました。OpenVINO NPU プラグインを使用してモデルを簡単にコンパイルおよび実行できます。
モデルのダウンロードと変換#
このチュートリアルでは resnet50
モデルを使用します。resnet50
モデルは画像分類タスクに使用されます。このモデルは、1000 クラスに分類された 100 万枚以上の画像を含む ImageNet データセットでトレーニングされました。Resnet50 の詳細については、論文を参照してください。
モデルのダウンロード#
torchvision から ResNet50 CV 分類モデルを取得します。
from pathlib import Path
# Resnet モデルファイル用のディレクトリーを作成
MODEL_DIRECTORY_PATH = Path("model")
MODEL_DIRECTORY_PATH.mkdir(exist_ok=True)
model_name = "resnet50"
from torchvision.models import resnet50, ResNet50_Weights
# create model object
pytorch_model = resnet50(weights=ResNet50_Weights.DEFAULT)
# モデルをトレーニング・モードから推論モードに切り替え
pytorch_model.eval();
モデルを OpenVINO IR 形式に変換#
Pytorch モデルを FP16
精度の OpenVINO IR に変換するには、モデル・トランスフォーメーション API を使用します。モデルは、model/ir_model/
ディレクトリーに保存されます。モデル変換の詳細については、このページを参照してください。
precision = "FP16"
model_path = MODEL_DIRECTORY_PATH / "ir_model" / f"{model_name}_{precision.lower()}.xml"
model = None
if not model_path.exists():
model = ov.convert_model(pytorch_model, input=[[1, 3, 224, 224]])
ov.save_model(model, model_path, compress_to_fp16=(precision == "FP16"))
print("IR model saved to {}".format(model_path))
else:
print("Read IR model from {}".format(model_path))
model = core.read_model(model_path)
Read IR model from modelir_modelresnet50_fp16.xml
注: NPU は INT8
量子化モデルもサポートします。
デフォルト構成でコンパイル#
モデルの準備ができたら、read_model
メソッドを使用してモデルを読み取る必要があります。次に、compile_model
メソッドを使用して、モデルをコンパイルするデバイスの名前 (この場合は “NPU”) を指定します。
compiled_model = core.compile_model(model, device)
モデルのキャッシュを使用したコンパイル時間の短縮#
使用されるモデルによっては、デバイス固有の最適化やネットワーク・コンパイルにより、コンパイルステップに時間がかかることがあり、特に大規模なモデルの場合は、アプリケーションのユーザー・エクスペリエンスが低下する可能性があります。この問題を解決するには、モデルキャッシュを使用します。
モデルのキャッシュは、コンパイルされたモデルを自動的にエクスポートして再利用することで、アプリケーションの起動遅延を軽減します。この分野では、次の 2 つのコンパイル関連のメトリックが重要です:
初めての推論レイテンシー (FEIL): デバイス上でモデルを初めてコンパイルして実行するのに必要なすべてのステップを測定します。これには、モデルのコンパイル時間、デバイス上でモデルをロードして初期化するのに必要な時間、および最初の推論の実行が含まれます。
初回推論レイテンシー (FIL): 事前コンパイルされたモデルをデバイスにロードして初期化し、最初の推論を実行するのに必要な時間を測定します。
NPU UMD モデルのキャッシュは、現在の NPU ドライバーでデフォルトで有効化されているソリューションです。コンパイル (FEIL に含まれる) 後にモデルをキャッシュに保存することで、初回推論 (FIL) までの時間を短縮します。UMD キャッシュの詳細については、こちらをご覧ください。このキャッシュにより、初回コンパイル後にモデルのロードにかかる時間が短縮されます。
cache_dir
プロパティーを設定することで有効にできます。UMD モデルキャッシュ#
UMD キャッシュの仕組みを確認するには、次の例を参照してください:
import time
from pathlib import Path
start = time.time()
core = ov.Core()
# 前と同じようにモデルをコンパイル
model = core.read_model(model=model_path)
compiled_model = core.compile_model(model, device)
print(f"UMD Caching (first time) - compile time: {time.time() - start}s")
UMD Caching (first time) - compile time: 3.2854952812194824s
start = time.time()
core = ov.Core()
# UMD キャッシュを確認するためにモデルを再度コンパイル
model = core.read_model(model=model_path)
compiled_model = core.compile_model(model, device)
print(f"UMD Caching - compile time: {time.time() - start}s")
UMD Caching - compile time: 2.269814968109131s
OpenVINO モデルのキャッシュ#
OpenVINO モデルキャッシュを理解するには、次のように OpenVINO キャッシュを使用します。
# キャッシュフォルダーを作成
cache_folder = Path("cache")
cache_folder.mkdir(exist_ok=True)
start = time.time()
core = ov.Core()
# キャッシュフォルダーを設定
core.set_property({"CACHE_DIR": cache_folder})
# モデルをコンパイル
model = core.read_model(model=model_path)
compiled_model = core.compile_model(model, device)
print(f"Cache enabled (first time) - compile time: {time.time() - start}s")
start = time.time()
core = ov.Core()
# キャッシュフォルダーを設定
core.set_property({"CACHE_DIR": cache_folder})
# 前と同じようにモデルをコンパイル
model = core.read_model(model=model_path)
compiled_model = core.compile_model(model, device)
print(f"Cache enabled (second time) - compile time: {time.time() - start}s")
Cache enabled (first time) - compile time: 0.6362860202789307s
Cache enabled (second time) - compile time: 0.3032548427581787s
OpenVINO キャッシュが無効になっている場合:
start = time.time()
core = ov.Core()
model = core.read_model(model=model_path)
compiled_model = core.compile_model(model, device)
print(f"Cache disabled - compile time: {time.time() - start}s")
Cache disabled - compile time: 3.0127954483032227s
実際の時間短縮は環境や使用されているモデルによって異なりますが、アプリケーションを最適化する際には必ず考慮する必要があります。詳細については、モデルキャッシュのドキュメントを参照してください。
スループットとレイテンシーのパフォーマンスに関するヒント#
デバイスとパイプラインの構成を簡素化するため、OpenVINO は推論のバッチサイズと並列スレッドの数を自動的に設定する高レベルのパフォーマンス・ヒントを提供します。“LATENCY” パフォーマンス・ヒントは推論時間を高速化するように最適化され、“THROUGHPUT” パフォーマンス・ヒントは全体的な帯域幅または FPS を高くするように最適化されます。
“LATENCY” パフォーマンス・ヒントを使用するには、以下のようにモデルをコンパイルする際に {"PERFORMANCE_HINT": "LATENCY"}
を追加します。NPU の場合、これによりバッチサイズと並列ストリームの数が自動的に最小化され、すべてのコンピューティング・リソースが単一の推論をできるだけ早く完了することに集中できるようになります。
compiled_model = core.compile_model(model, device, {"PERFORMANCE_HINT": "LATENCY"})
“THROUGHPUT” パフォーマンス・ヒントを使用するには、モデルをコンパイルするときに {"PERFORMANCE_HINT": "THROUGHPUT"}
を追加します。NPU の場合、これにより複数の処理ストリームが作成され、すべての実行コアが効率良く利用されることで使用可能なメモリーを埋めるバッチサイズが最適化されます。
compiled_model = core.compile_model(model, device, {"PERFORMANCE_HINT": "THROUGHPUT"})
benchmark_app とのパフォーマンス比較#
モデルのコンパイルに利用できるさまざまなオプションを考えると、特定のアプリケーションで最適な設定を知るのは難しい場合があります。幸いなことに、OpenVINO ではパフォーマンス・ベンチマーク・ツールである benchmark_app
が提供されています。
benchmark_app
の基本的な構文は次のとおりです:
benchmark_app -m PATH_TO_MODEL -d TARGET_DEVICE -hint {throughput,cumulative_throughput,latency,none}
ここで、TARGET_DEVICE
は、available_devices
メソッドによって表示される任意のデバイス、および前述の MULTI および AUTO デバイスであり、hint は括弧内の値のいずれかになります。
benchmark_app を実行するにはモデルパスのみが必要ですが、デバイス引数とヒント引数の両方が役立ちます。より高度な使用法については、benchmark_app -h
を実行するか、ドキュメントで確認できます。次の例は、レイテンシーに重点を置いて NPU を使用し、単純なモデルをベンチマークする方法を示しています:
benchmark_app -m {model_path} -d NPU -hint latency
benchmark_app
ログエントリーを参照してください。!benchmark_app -m {model_path} -d CPU -hint latency
[Step 1/11] Parsing and validating input arguments
[ INFO ] Parsing input parameters
[Step 2/11] Loading OpenVINO Runtime
[ INFO ] OpenVINO:
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ] Device info:
[ INFO ] CPU
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ]
[Step 3/11] Setting device configuration
[Step 4/11] Reading model files
[ INFO ] Loading model files
[ INFO ] Read model took 14.00 ms
[ INFO ] Original model I/O parameters:
[ INFO ] Model inputs:
[ INFO ] x (node: x) : f32 / [...]/ [1.3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 5/11] Resizing model to match image sizes and given batch
[ INFO ] Model batch size: 1
[Step 6/11] Configuring input of the model
[ INFO ] Model inputs:
[ INFO ] x (node: x) : u8 / [N,C,H,W] / [1,3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 143.22 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] Model:
[ INFO ] NETWORK_NAME: Model2
[ INFO ] OPTIMAL_NUMBER_OF_INFER_REQUESTS: 1
[ INFO ] NUM_STREAMS: 1
[ INFO ] AFFINITY: Affinity.HYBRID_AWARE
[ INFO ] INFERENCE_NUM_THREADS: 12
[ INFO ] PERF_COUNT: NO
[ INFO ] SCHEDULING_CORE_TYPE: <Type: 'float32'>
[ INFO ] PERFORMANCE_HINT: LATENCY
[ INFO ] EXECUTION_MODE_HINT: ExecutionMode. PERFORMANCE
[ INFO ] PERFORMANCE_HINT_NUM_REQUESTS: 0
[ INFO ] ENABLE_CPU_PINNING: False
[ INFO ] SCHEDULING_CORE_TYPE: SchedulingCoreType.ANY_CORE
[ INFO ] MODEL_DISTRIBUTION_POLICY: set()
[ INFO ] ENABLE_HYPER_THREADING: False
[ INFO ] EXECUTION_DEVICES: ['CPU']
[ INFO ] CPU_DENORMALS_OPTIMIZATION: False
[ INFO ] LOG_LEVEL: Level. NO
[ INFO ] CPU_SPARSE_WEIGHTS_DECOMPRESSION_RATE: 1.0
[ INFO ] DYNAMIC_QUANTIZATION_GROUP_SIZE: 0
[ INFO ] KV_CACHE_PRECISION: <Type: 'float16'>
[Step 9/11] Creating infer requests and preparing input tensors
[ WARNING ] No input files were given for input 'x'!.This input will be filled with random values!
[ INFO ] Fill input 'x' with random values
[Step 10/11] Measuring performance (Start inference asynchronously, 1 inference requests, limits: 60000 ms duration)
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 28.95 ms
[Step 11/11] Dumping statistics report
[ INFO ] Execution Devices:['CPU']
[ INFO ] Count: 1612 iterations
[ INFO ] Duration: 60039.72 ms
[ INFO ] Latency:
[ INFO ] Median: 39.99 ms
[ INFO ] Average: 37.13 ms
[ INFO ] Min: 19.13 ms
[ INFO ] Max: 71.94 ms
[ INFO ] Throughput: 26.85 FPS
!benchmark_app -m {model_path} -d NPU -hint latency
[Step 1/11] Parsing and validating input arguments
[ INFO ] Parsing input parameters
[Step 2/11] Loading OpenVINO Runtime
[ INFO ] OpenVINO:
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ] Device info:
[ INFO ] NPU
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ]
[Step 3/11] Setting device configuration
[Step 4/11] Reading model files
[ INFO ] Loading model files
[ INFO ] Read model took 11.51 ms
[ INFO ] Original model I/O parameters:
[ INFO ] Model inputs:
[ INFO ] x (node: x) : f32 / [...]/ [1.3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 5/11] Resizing model to match image sizes and given batch
[ INFO ] Model batch size: 1
[Step 6/11] Configuring input of the model
[ INFO ] Model inputs:
[ INFO ] x (node: x) : u8 / [N,C,H,W] / [1,3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 2302.40 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] Model: [ INFO ] DEVICE_ID:
[ INFO ] ENABLE_CPU_PINNING: False
[ INFO ] EXECUTION_DEVICES: NPU.3720
[ INFO ] INFERENCE_PRECISION_HINT: <Type: 'float16'>
[ INFO ] INTERNAL_SUPPORTED_PROPERTIES: {'CACHING_PROPERTIES': 'RO'}
[ INFO ] LOADED_FROM_CACHE: False
[ INFO ] NETWORK_NAME:
[ INFO ] OPTIMAL_NUMBER_OF_INFER_REQUESTS: 1
[ INFO ] PERFORMANCE_HINT: PerformanceMode.LATENCY
[ INFO ] PERFORMANCE_HINT_NUM_REQUESTS: 1
[ INFO ] PERF_COUNT: False
[Step 9/11] Creating infer requests and preparing input tensors
[ WARNING ] No input files were given for input 'x'!.This input will be filled with random values!
[ INFO ] Fill input 'x' with random values
[Step 10/11] Measuring performance (Start inference asynchronously, 1 inference requests, limits: 60000 ms duration)
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 7.94 ms
[Step 11/11] Dumping statistics report
[ INFO ] Execution Devices:NPU.3720
[ INFO ] Count: 17908 iterations
[ INFO ] Duration: 60004.49 ms
[ INFO ] Latency:
[ INFO ] Median: 3.29 ms
[ INFO ] Average: 3.33 ms
[ INFO ] Min: 3.21 ms
[ INFO ] Max: 6.90 ms
[ INFO ] Throughput: 298.44 FPS
UMD モデルキャッシュの効果を確認するため、benchmark_app を実行し、モデルの読み取り時間とコンパイル時間の違いを確認します:
!benchmark_app -m {model_path} -d NPU -hint latency
[Step 1/11] Parsing and validating input arguments
[ INFO ] Parsing input parameters
[Step 2/11] Loading OpenVINO Runtime
[ INFO ] OpenVINO:
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ] Device info:
[ INFO ] NPU
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ]
[Step 3/11] Setting device configuration
[Step 4/11] Reading model files
[ INFO ] Loading model files
[ INFO ] Read model took 11.00 ms
[ INFO ] Original model I/O parameters:
[ INFO ] Model inputs:
[ INFO ] x (node: x) : f32 / [...]/ [1.3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 5/11] Resizing model to match image sizes and given batch
[ INFO ] Model batch size: 1
[Step 6/11] Configuring input of the model
[ INFO ] Model inputs:
[ INFO ] x (node: x) : u8 / [N,C,H,W] / [1,3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 2157.58 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] Model:
[ INFO ] DEVICE_ID:
[ INFO ] ENABLE_CPU_PINNING: False
[ INFO ] EXECUTION_DEVICES: NPU.3720
[ INFO ] INFERENCE_PRECISION_HINT: <Type: 'float16'>
[ INFO ] INTERNAL_SUPPORTED_PROPERTIES: {'CACHING_PROPERTIES': 'RO'}
[ INFO ] LOADED_FROM_CACHE: False
[ INFO ] NETWORK_NAME:
[ INFO ] OPTIMAL_NUMBER_OF_INFER_REQUESTS: 1
[ INFO ] PERFORMANCE_HINT: PerformanceMode.LATENCY
[ INFO ] PERFORMANCE_HINT_NUM_REQUESTS: 1
[ INFO ] PERF_COUNT: False
[Step 9/11] Creating infer requests and preparing input tensors
[ WARNING ] No input files were given for input 'x'!.This input will be filled with random values!
[ INFO ] Fill input 'x' with random values
[Step 10/11] Measuring performance (Start inference asynchronously, 1 inference requests, limits: 60000 ms duration)
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 7.94 ms
[Step 11/11] Dumping statistics report
[ INFO ] Execution Devices:NPU.3720
[ INFO ] Count: 17894 iterations
[ INFO ] Duration: 60004.76 ms
[ INFO ] Latency:
[ INFO ] Median: 3.29 ms
[ INFO ] Average: 3.33 ms
[ INFO ] Min: 3.21 ms
[ INFO ] Max: 14.38 ms
[ INFO ] Throughput: 298.21 FPS
ログエントリー [Step 4/11] モデルファイルの読み取りと [Step 7/11] モデルのデバイスへのロードからわかるように、初期ロード後のモデルの読み取りとコンパイルにかかる時間は短縮されています。
!benchmark_app -m {model_path} -d CPU -hint throughput
[Step 1/11] Parsing and validating input arguments
[ INFO ] Parsing input parameters
[Step 2/11] Loading OpenVINO Runtime
[ INFO ] OpenVINO:
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ] Device info:
[ INFO ] CPU
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ]
[Step 3/11] Setting device configuration
[Step 4/11] Reading model files
[ INFO ] Loading model files
[ INFO ] Read model took 12.00 ms
[ INFO ] Original model I/O parameters:
[ INFO ] Model inputs:
[ INFO ] x (node: x) : f32 / [...]/ [1.3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 5/11] Resizing model to match image sizes and given batch
[ INFO ] Model batch size: 1
[Step 6/11] Configuring input of the model
[ INFO ] Model inputs:
[ INFO ] x (node: x) : u8 / [N,C,H,W] / [1,3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 177.18 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] Model:
[ INFO ] NETWORK_NAME: Model2
[ INFO ] OPTIMAL_NUMBER_OF_INFER_REQUESTS: 4
[ INFO ] NUM_STREAMS: 4
[ INFO ] AFFINITY: Affinity.HYBRID_AWARE
[ INFO ] INFERENCE_NUM_THREADS: 16
[ INFO ] PERF_COUNT: NO
[ INFO ] SCHEDULING_CORE_TYPE: <Type: 'float32'>
[ INFO ] PERFORMANCE_HINT: THROUGHPUT
[ INFO ] EXECUTION_MODE_HINT: ExecutionMode. PERFORMANCE
[ INFO ] PERFORMANCE_HINT_NUM_REQUESTS: 0
[ INFO ] ENABLE_CPU_PINNING: False
[ INFO ] SCHEDULING_CORE_TYPE: SchedulingCoreType.ANY_CORE
[ INFO ] MODEL_DISTRIBUTION_POLICY: set()
[ INFO ] ENABLE_HYPER_THREADING: True
[ INFO ] EXECUTION_DEVICES: ['CPU']
[ INFO ] CPU_DENORMALS_OPTIMIZATION: False
[ INFO ] LOG_LEVEL: Level. NO
[ INFO ] CPU_SPARSE_WEIGHTS_DECOMPRESSION_RATE: 1.0
[ INFO ] DYNAMIC_QUANTIZATION_GROUP_SIZE: 0
[ INFO ] KV_CACHE_PRECISION: <Type: 'float16'>
[Step 9/11] Creating infer requests and preparing input tensors
[ WARNING ] No input files were given for input 'x'!.This input will be filled with random values!
[ INFO ] Fill input 'x' with random values
[Step 10/11] Measuring performance (Start inference asynchronously, 4 inference requests, limits: 60000 ms duration)
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 31.62 ms
[Step 11/11] Dumping statistics report
[ INFO ] Execution Devices:['CPU']
[ INFO ] Count: 3212 iterations
[ INFO ] Duration: 60082.26 ms
[ INFO ] Latency:
[ INFO ] Median: 65.28 ms
[ INFO ] Average: 74.60 ms
[ INFO ] Min: 35.65 ms
[ INFO ] Max: 157.31 ms
[ INFO ] Throughput: 53.46 FPS
!benchmark_app -m {model_path} -d NPU -hint throughput
[Step 1/11] Parsing and validating input arguments
[ INFO ] Parsing input parameters
[Step 2/11] Loading OpenVINO Runtime
[ INFO ] OpenVINO:
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ] Device info:
[ INFO ] NPU
[ INFO ] Build .................................2024.1.0-14992-621b025bef4
[ INFO ]
[ INFO ]
[Step 3/11] Setting device configuration
[Step 4/11] Reading model files
[ INFO ] Loading model files
[ INFO ] Read model took 11.50 ms
[ INFO ] Original model I/O parameters:
[ INFO ] Model inputs:
[ INFO ] x (node: x) : f32 / [...]/ [1.3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 5/11] Resizing model to match image sizes and given batch
[ INFO ] Model batch size: 1
[Step 6/11] Configuring input of the model
[ INFO ] Model inputs:
[ INFO ] x (node: x) : u8 / [N,C,H,W] / [1,3,224,224]
[ INFO ] Model outputs:
[ INFO ] x.45 (node: aten::linear/Add) : f32 / [...]/ [1,1000]
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 2265.07 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] Model:
[ INFO ] DEVICE_ID:
[ INFO ] ENABLE_CPU_PINNING: False
[ INFO ] EXECUTION_DEVICES: NPU.3720
[ INFO ] INFERENCE_PRECISION_HINT: <Type: 'float16'>
[ INFO ] INTERNAL_SUPPORTED_PROPERTIES: {'CACHING_PROPERTIES': 'RO'}
[ INFO ] LOADED_FROM_CACHE: False
[ INFO ] NETWORK_NAME:
[ INFO ] OPTIMAL_NUMBER_OF_INFER_REQUESTS: 4
[ INFO ] PERFORMANCE_HINT: PerformanceMode.THROUGHPUT
[ INFO ] PERFORMANCE_HINT_NUM_REQUESTS: 1
[ INFO ] PERF_COUNT: False
[Step 9/11] Creating infer requests and preparing input tensors
[ WARNING ] No input files were given for input 'x'!.This input will be filled with random values!
[ INFO ] Fill input 'x' with random values
[Step 10/11] Measuring performance (Start inference asynchronously, 4 inference requests, limits: 60000 ms duration)
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 7.95 ms
[Step 11/11] Dumping statistics report
[ INFO ] Execution Devices:NPU.3720
[ INFO ] Count: 19080 iterations
[ INFO ] Duration: 60024.79 ms
[ INFO ] Latency:
[ INFO ] Median: 12.51 ms
[ INFO ] Average: 12.56 ms
[ INFO ] Min: 6.92 ms
[ INFO ] Max: 25.80 ms
[ INFO ] Throughput: 317.87 FPS
制限事項#
現在、NPU では静的形状を持つモデルのみがサポートされています。
モデルファイルへのパスに非 Unicode 記号が含まれている場合、そのモデルは NPU での推論に使用できません。その場合エラーが返されます。
まとめ#
このチュートリアルでは、OpenVINO で NPU を使用して、そのプロパティーを確認し、さまざまなパフォーマンス・ヒントを通じてモデルのパフォーマンスをカスタマイズする方法を示します。
以下のインタラクティブな Jupyter ノートブックを通じて、OpenVINO を使用したニューラル・プロセシング・ユニット (NPU) のパワーを体験してください:
hello-world: OpenVINO IR モデルで推論を実行して、OpenVINO を始めましょう。
hello-segmentation: セグメント化モデルを使用した推論を詳しく調べ、画像のセグメント化機能を調べます。
tflite-to-openvino: TensorFlow Lite モデルを OpenVINO IR 形式に変換する手順を学習します。
yolov7-optimization: OpenVINO のパフォーマンスを向上させるため YOLOv7 モデルを最適化します。
yolov8-optimization: OpenVINO を使用して YOLOv8 モデルを変換および最適化し、効率的なデプロイを実現します。
vision-background-removal: U^2-Net を使用して高度な画像セグメント化と背景操作を実装します。
handwritten-ocr: 手書きの中国語と日本語のテキストに光学文字認識を適用します。
vehicle-detection-and-recognition: 画像内の車両の検出と認識に事前トレーニング済みのモデルを使用します。
vision-image-colorization: ニューラル・ネットワークを使用して色を追加することで、白黒画像に活気を与えます。
tflite-selfie-segmentation: セルフィーのセグメント化とバックグラウンド処理に TensorFlow Lite モデルを適用します。
object-detection-webcam: ウェブカメラと OpenVINO を使用してリアルタイムのオブジェクト検出を体験してください。
pose-estimation-webcam: ウェブカメラを統合して人間の姿勢をリアルタイムで推定します。
action-recognition-webcam: ウェブカメラを使用して、人間の行動をライブで認識し分類します。
style-transfer-webcam: 事前トレーニング済みのモデルを使用して、ウェブカメラのフィードを芸術的なスタイルでリアルタイムに変換します。
3D-pose-estimation-webcam: OpenVINO を使用して 3D 複数人物姿勢推定を実行します。