Ultralytics YOLO27: ウェイトリストに登録する。
Get Started
本番環境でのUltralytics YOLO·ランタイムを選ぶ·レッスン 1/9
レッスン中級

デプロイ先を選ぶ

デバイス、レイテンシの予算、フリートからランタイムとエクスポート形式を決め、デバイス上で確認します。

夕暮れ時の都市高速道路を見下ろす交通カメラ。Ultralytics YOLOが車、バン、トラックを追跡し、それぞれにクラスとIDのラベルが付いています

同じYOLO26nでも、CPU上でONNX Runtimeを使うと画像1枚あたり38.9 ms、T4 GPU上でTensorRTを使うと1.7 msです(YOLO26のベンチマーク)。ランタイムを誤って選ぶと、必要以上に高性能なハードウェアに費用をかけるか、処理が追いつかないカメラを出荷することになります。このレッスンでは、デバイス上で実測した数値を使い、10分で根拠を示せる選定を行います。

成果

デバイスに適したランタイムとformat=の値を選び、FPS目標をミリ秒単位の予算に換算して、ベンチマークを繰り返して選択を確認します。

短期集中コース
すでに使い方をご存じの方は、こちらをご覧ください。
  1. NVIDIA GPUまたはJetson → TensorRT(engine)、対象デバイス上でビルドします。Intel CPU、iGPU、またはNPU → OpenVINO(openvino)。

  2. Apple → CoreML(coreml)。Android → LiteRT(litert)。Snapdragon NPU → QNN(qnn)。Raspberry Pi → NCNN(ncnn)。

  3. その他 → ONNX Runtime(onnx)。サーバーを使わない場合は、マネージド型のUltralytics Platformエンドポイントを利用します。

  4. 予算 = 1000 ÷ FPS − デコードと後処理の時間です。デバイス上で候補を計測し、平均ではなくp95で評価します。

実践的

デバイスを起点にする#

ランタイムは慣習ではなく、推論を実行する場所に基づいて選びます。上から順にたどり、最初に該当する項目で止めます。

各ランタイムは、エクスポートモードのformat=の値に対応します。

目標ランタイムformat=注意点
NVIDIA GPU、JetsonTensorRTengineエンジンをビルドしたGPUファミリーとTensorRTバージョンでのみ実行できます
Intel CPU、iGPU、NPUOpenVINOopenvinoIntel向けに最適化されています。他の環境で使う前に計測してください
任意のCPUまたはGPUONNX Runtimeonnx実行プロバイダーを明示的に選択してください
iPhone、iPad、MacCoreMLcoremlエクスポートはmacOSまたはLinuxで実行できます。Windowsでは実行できません
Android、組み込みデバイスLiteRTlitertINT8にはキャリブレーション用のdataが必要です
Snapdragon NPUQualcomm QNNqnn量子化エクスポートのみ対応しています。Hexagonのターゲットをnameとして指定してください
Raspberry Pi、ARM CPUNCNNncnnRaspberry Piガイドで紹介されている最速の形式
ブラウザーONNX Runtime Webonnxnまたはsモデルを使用してください

最近のAppleプラットフォームでは、Appleの新しいCore AI形式(format=coreai。macOS 26以降のApple siliconまたはx86-64 Linuxでエクスポート)にもエクスポートできます。エクスポートが初めてですか?デプロイ向けエクスポートのレッスンで基本を説明しています。

推論サーバーをまったく実行したくない場合、Ultralytics Platformではモデルを42のリージョンのいずれかに専用エンドポイントとしてデプロイでき、プロフィールの「Deployments」タブで各エンドポイントの稼働場所を確認できます。

アクティブなデプロイ、HTTPリクエスト、エラー率、P95レイテンシの概要カードと、デプロイリージョンの世界地図を表示するUltralytics Platformプロフィールの「Deployments」タブ

この方法についてはエンドポイントのデプロイと呼び出しで説明しています。このコースの残りの内容は、モデルを自分で実行する場合を対象としています。

FPS目標をミリ秒単位の予算に換算する#

「リアルタイム」は要件ではなく、数値が要件です。何かをベンチマークする前に計算してください。

段階例:カメラあたり20 FPS
フレーム予算 = 1000 ÷ FPS50 ms
デコード分を差し引く(RTSP、1080p)約10 ms
トラッキング、カウント、出力先の分を差し引く約5 ms
ピークに備えて20%の余裕を差し引く10 ms
モデルに割り当てられる時間約25~30 ms

次の判断基準を適用してください。

  • デバイスのCPUでYOLO26nがモデル予算を超える場合は、他のことを試す前にアクセラレーター(GPU、iGPU、NPU)に移行するか、imgszを小さくしてください。YOLO26のベンチマークでは、YOLO26nはCPU ONNXで38.9 ms、T4のTensorRTで1.7 msです。
  • 1台のデバイスで複数のカメラを処理する場合は、モデル予算をカメラ台数で割ってください。
  • フリートに多数のデバイスタイプが含まれる場合は、デバイスごとのビルドが不要なランタイムを優先するか、デバイスクラスごとにビルドを用意してください。
  • 呼び出し元のコードがSwift、Kotlin、またはC++の場合は、採用を決める前に、その言語に対応するランタイムのSDKを確認してください。

候補をデバイス上でベンチマークする#

仕様書や他の人のベンチマークは出発点にすぎません。判断は実際にデプロイするハードウェア上で、平均ではなく遅いフレームを基準に行います。中央値では高速でも20フレームに1回停止するランタイムでは、フレームがドロップします。このスクリプトは各候補をエクスポートし、実際のフレームで100回推論を計測して、95パーセンタイル(p95)で評価します。

from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download

BUDGET_MS = 30  # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino")  # runtimes the decision tree allows on this machine

if __name__ == "__main__":  # exports and inference can start worker processes on macOS and Windows
    frame = str(safe_download("https://ultralytics.com/images/bus.jpg"))  # use a real frame from your camera
    for fmt in CANDIDATES:
        model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
        for _ in range(5):  # warm up: the first calls include one-time setup
            model(frame, verbose=False)
        runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
        p50, p95 = runs[49], runs[94]
        verdict = "meets" if p95 <= BUDGET_MS else "misses"
        print(f"{fmt:9s} p50 {p50:5.1f} ms  p95 {p95:5.1f} ms  {verdict} the {BUDGET_MS} ms budget")

このコースのテストに使用したApple silicon搭載ノートPCで、他のジョブがCPUを共有している状態での結果:

onnx      p50  30.0 ms  p95  46.4 ms  misses the 30 ms budget
openvino  p50  22.8 ms  p95 113.5 ms  misses the 30 ms budget

行ごとに確認します。

  • speed["inference"]はデコードや描画を含まない、そのフレームに対するモデル自体の処理時間です。そのため、ランタイムを公平に比較できます。
  • OpenVINOは中央値で優位ですが、p95では2倍以上遅くなります。平均で判断すると、負荷の高いタイミングで停止するランタイムを出荷してしまいます。p95で判断した場合、このマシンではONNX Runtimeのほうが安定した選択肢です。
  • どちらも予算を満たしていないため、ここで次に試すべきなのは、別のCPUランタイムではなく、小さいimgsz、アクセラレーター、またはデバイスあたりのカメラ台数の削減です。

形式ごとの精度と速度を手早く比較するには、ベンチマークモードで各形式をエクスポート、検証、計測できます。

yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnx

format=を省略すると、マシンが対応するすべての形式を比較できます。COCO8の検証画像は4枚しかないため、mAP列はスモークテストとして扱い、精度の判断には独自のデータセットYAMLを使用してください。

よくある落とし穴#

異なるマシンでベンチマークする

症状: ワークステーションではモデルが60 FPSを達成しましたが、デバイスではフレームがドロップします。 対処: デプロイ先のハードウェア、または入手可能な最も近い環境でベンチマークを実施し、他のプロセスやカメラなど、本番環境で想定される負荷をかけて実行します。

TensorRTエンジンはデバイス固有

症状: データセンターのGPUでビルドした.engineをJetson Orinで読み込めません。 対処: インストール時にターゲット上でビルドします(Platformのエクスポートドキュメントによると、YOLO26nのFP16ビルドはJetson Orinで約5分かかります)。または、デバイスクラスとTensorRTバージョンごとにビルドを用意し、どのデバイスでも再ビルドできるように.ptまたは.onnxを同梱します。

提供時のサイズでベンチマークする

yolo benchmarkは、指定したimgszで測定します。本番環境でimgsz=1280を使用する場合は、1280でベンチマークしてください。計算量はピクセル数に応じて増加するため、640での数値では1280でのデプロイ時の負荷を約4倍過小評価します。

エッジデバイスでは4つの点を確認する#

Raspberry Pi、NVIDIA Jetson、Jetson上のDeepStreamの各ガイドで、一般的なターゲットを詳しく説明しています。エッジデバイスの採用を決める前に、次の点を確認してください。

  • コールドスタート:TensorRTエンジンはどこでビルドされ、誰が完了を待ちますか?
  • 電力と熱:筐体はモデルを最大FPSで終日実行し続けられますか?
  • メモリ:モデルに加えて、フレームバッファーとトラッカーの状態を保持する余裕はありますか?INT8ではモデルが使用するメモリが半分になります。
  • 更新:新しいbest.ptを1,000台のデバイスにどう届けますか?Dockerイメージを使うと、環境を統一できます。
試してみる

実際のプロジェクト、または計画中のプロジェクトについて、ターゲットデバイス、カメラあたりのFPS、デバイスあたりのカメラ台数、呼び出し元の言語、フリートの規模を記載した5行のデプロイ概要を作成してください。ミリ秒単位のモデル予算に換算し、判断ツリーから候補を選び、ターゲットまたは手元にある最も近いマシンで(モデルと候補を指定して)pick_runtime.pyを実行してください。

完了条件
以下のすべてを満たすと、レッスンは完了です。
  • 概要にはデバイス、ランタイム、正確なformat=の値が記載されています。

  • FPS目標からモデルのミリ秒単位の予算を算出し、差し引いた項目も示しています。

  • デバイス上で測定した候補ごとのp50およびp95推論時間と、予算に対する評価があります。

解答を表示

小売分析の展開を想定した概要の例:

質問回答
デバイスIntel Core Ultra CPU搭載の店舗内ミニPC 40台。ディスクリートGPUなし
FPSとカメラカメラあたり10 FPS、ボックスあたり2台のカメラ
呼び出し元Linux上のPythonサービス
フリートDockerイメージから更新する40台のボックス

予算:1000 ÷ 10 = フレームあたり100 ms。デコードとトラッキングに約15 msを差し引き、20%の余裕を確保すると約65 msが残ります。これを2台のカメラで共有するため、推論あたり約30 msです。判断ツリーでは(Intel CPU向けに)OpenVINOを推奨し、ONNX Runtimeを代替候補としています。そこで、店舗のボックス1台で次のように測定します。

python pick_runtime.py  # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30

OpenVINOのドキュメントに記載されたCore Ultra 7 155H CPUのベンチマークでは、YOLO26nはOpenVINO FP32で13.4 msです。そのため、yolo26nは十分な余裕をもって予算内に収まるはずです。両方のカメラパイプラインを実行した実機でp95が30 ms未満なら、OpenVINOを採用してください。予算を超える場合は、ハードウェアを購入する前に、ボックスの内蔵GPUとdevice="intel:gpu"を試してください。

次のステップ

ターゲットを選んだら、次のレッスンでONNXにエクスポートし、エクスポート後もPyTorchと同じ結果が得られることを確認します。