はじめに
AMD Ryzen AI Max+ 395の内蔵GPU、Radeon 8060SでYOLO26nを動かし、物体検出デモ「yolodemo」のライブ測定で 平均606.2 FPS を達成しました。入力サイズは448×448、バッチサイズは1、演算精度はFP32です。
動画入力と検出結果の配信が動作している状態で、30秒の測定を3回行いました。各回の結果は600.4、610.5、607.6 FPSで、いずれも600 FPSを超えています。
このFPSは、最新の入力フレームに対して完了した推論の回数を表します。同じフレームを繰り返し推論するため、30 FPSの映像でも推論FPSは600を超えます。毎秒600枚の異なる映像フレームを取り込み、描画・配信したという意味ではありません。
公開しているリポジトリはこちらです。
デモ動画
実際の動作はこちらの動画で確認できます。
yolodemoでできること
yolodemoは、USBカメラやローカル動画を入力に、ブラウザで物体検出結果を確認するデモです。画面上のスライダーでRadeon GPUとRyzen AI NPUを切り替えられます。
GPUとNPUの推論入力は、ともに448×448、batch=1です。表示映像は元の縦横比を維持し、推論FPSと入力FPSを分けて表示します。カメラ入力では1920×1080・30 FPSを要求し、実際に取得できた解像度や入力FPSも確認できます。
今回紹介する600 FPS超えはGPU側の結果です。GPUではFP32 ONNXモデルをMIGraphXで実行し、NPU側ではA16W8量子化とCPU分類ヘッドを組み合わせた別の構成を使っています。
測定環境
ライブ測定ログに記録されたGPU環境は次のとおりです。
| 項目 | 構成 |
|---|---|
| プロセッサー | AMD Ryzen AI Max+ 395 |
| GPU | AMD Radeon 8060S Graphics(gfx1151) |
| OS | Ubuntu 26.04.1 LTS |
| モデル | YOLO26n |
| 入力 | 1×3×448×448、固定shape |
| 演算精度 | FP32 |
| Python | 3.12.13 |
| PyTorch | 2.13.0+rocm10.0.0 |
| Ultralytics | 8.4.194 |
| ONNX Runtime | 1.29.0 |
| 推論バックエンド | MIGraphXExecutionProvider |
MIGraphX関連パッケージの版などは、公開版の環境記録にもまとめています。過去のPyTorch FP16構成とは実行環境が異なるため、比較するときは測定ごとの精度・バックエンド・入力サイズを確認してください。
600 FPSを超えた測定結果
動画を入力し、MJPEGストリームを受信しながら、GPUワーカーの推論完了カウンターを測定しました。
| 試行 | 推論完了回数 | 実測時間 | 推論FPS |
|---|---|---|---|
| 1 | 18,014 | 30.003秒 | 600.4 |
| 2 | 18,304 | 29.981秒 | 610.5 |
| 3 | 18,241 | 30.023秒 | 607.6 |
| 合計 | 54,559 | 90.007秒 | 606.2 |
合計のFPSは、全試行の推論完了回数を、全試行の実測時間の合計で割った値です。計測スクリプトはデモの状態APIからカウンターを取得し、推論停止やバックエンドの変更も確認します。
GPUでは各推論の実行後に同期し、完了を確認してからカウンターを増やします。GPUへの実行要求をキューに積んだ回数を数える方式ではありません。
測定に含まれる処理
推論ループでは、GPU上に保持したFP32入力に対してMIGraphXを実行します。新しいフレームが届いた際の入力更新と、表示に必要な検出結果のCPU転送もループ内で行います。
動画デコード、letterboxによる前処理、映像配信は並行して動作します。この測定にはそれらとの競合による負荷がありますが、各推論に毎回デコードから表示までを行う構成ではありません。606.2 FPSの逆数は約1.65 msですが、この値は映像取得からブラウザ表示までの遅延を表しません。
推論単体の5分測定
別途保存した推論単体の測定では、5分間で182,834回、平均609.4 FPSでした。こちらはGPU入力を事前確保し、画像読込・前処理・入力コピー・結果転送・JSON生成・描画を含めない条件です。
ライブ測定の606.2 FPSと推論単体の609.4 FPSは、測定範囲と時間が異なります。ライブデモで5分間600 FPS超えを検証した結果としては扱っていません。測定記録と条件は、yolofast_pubのGPU測定結果で確認できます。
GPU実装で行ったこと
GPUワーカーでは、固定shapeのFP32 ONNXモデルをONNX RuntimeのMIGraphX Execution Providerで実行しています。実装はyolodemoのGPUワーカーで公開しています。
入力バッファとI/O Bindingを再利用する
入力用のGPUバッファは初期化時に確保し、繰り返し使います。PyTorchのテンソルをDLPack経由でONNX RuntimeのOrtValueに変換してI/O Bindingに登録することで、同じGPUメモリを入力として指定できます。
新しい映像が届いたときは、ページロックしたホストメモリを経由してGPU入力を更新します。推論を繰り返すたびに、入力領域を確保し直す必要はありません。
MIGraphX側でHIPグラフを再生する
GPUワーカーでは、次の設定を有効にしています。
os.environ['ORT_MIGRAPHX_HIP_GRAPH_ENABLE'] = '1'
固定した入力バッファと組み合わせ、MIGraphX側でHIPグラフを再生する構成です。初期化時にはモデルの入力shape・型・出力shapeとI/O Bindingの利用を確認し、MIGraphXを使う条件を満たさない場合は起動を停止します。
ただし、今回の記録だけからHIPグラフ単独の高速化率は求めていません。公開したグラフ再生あり・なしの測定は実行時間や順序が揃っていないためです。
FP32を採用し、検出結果も確認する
今回採用したのはFP32構成です。FP16の候補は検出照合に失敗したため、採用結果には含めていません。
デモ起動時には、実画像3枚と合成入力5個の計8入力を使い、FP32 PyTorchとFP32 MIGraphXの検出結果を比較します。信頼度0.25以上の検出に対して、検出数・クラスの一致、IoU 0.95以上、スコア差0.03以下を要求します。今回のライブ測定ログでは、8入力すべてが合格しています。
これとは別に、同じ448入力のFP32構成をCOCO val2017全5,000枚で評価した記録も公開しています。
| 実行方式 | COCO mAP50–95 |
|---|---|
| FP32 PyTorch | 35.762346% |
| FP32 MIGraphX | 35.762364% |
この評価ではmAPがほぼ一致しました。評価条件は信頼度0.001以上、同じletterbox処理と座標復元、COCOevalのbbox評価、maxDets=[1,10,100]です。起動時の8入力による照合とは別の検証であり、640入力の結果とも区別しています。
精度評価と不採用構成を含む記録は、公開GPU測定結果を参照してください。
AMD公式でもUltralyticsのAMD GPU対応を紹介
AMDは2026年10月26日付のブログ記事、Ultralytics YOLO on AMD GPUs: Train, Run, and Deploy with ROCm™で、UltralyticsのAMD GPU対応を紹介しています。
公式記事では、PyTorchとROCmによるYOLO26の学習・推論、およびONNX Runtime経由のMIGraphX実行を説明しています。検証済みプラットフォームにはRyzen AI Max+ PRO 395も含まれています。今回使用したMax+ 395とは製品表記が異なりますが、Ryzen AI Max系でも同じソフトウェア構成を検討する際の参考になります。
公式記事の基本的な使い方は、UltralyticsでモデルをONNXにエクスポートし、そのONNXを読み込んで推論する流れです。yolodemoでも同じMIGraphX Execution Providerを使い、固定GPU入力バッファやI/O Bindingを組み合わせて推論ループを実装しています。
公式記事の「最大67%のレイテンシ削減」は、複数のモデル・タスクを評価した中の最大値です。本記事の448入力・ライブ測定とは条件が異なるため、600 FPS達成の比較値には使っていません。
デモを動かすには
ソースコードは次のコマンドで取得できます。
git clone https://github.com/kotetsuy/yolodemo.git
cd yolodemo
GPU・NPUランタイム、モデル重み、校正・検証画像などを準備したうえで、モデルを生成して起動します。デモはGPUとNPUの両ワーカーを初期化するため、両方の前提環境が必要です。
./create_models.sh --setup-quant
./create_models.sh --check
./create_models.sh
./start_all.sh
起動すると、ブラウザで http://127.0.0.1:8000 を開きます。測定用の入力を用意し、デモが動作している状態で、次のコマンドからGPUを30秒×3回測定できます。
.venv/bin/python scripts/benchmark_demo.py \
--backends gpu \
--seconds 30 \
--repeats 3
モデル・画像・SDKはリポジトリに含めていません。公開ツールを取得しただけで測定環境が揃う構成ではないため、環境準備の範囲と依存関係はyolodemoの日本語READMEとyolofast_pubのREADMEを確認してください。実行環境や入力動画によってFPSは変わります。
おわりに
Ryzen AI Max+ 395のRadeon 8060Sで、FP32のYOLO26nをライブデモ中に平均606.2 FPSで実行できました。固定shape、入力バッファの再利用、I/O Binding、MIGraphXによる実行を組み合わせた結果です。
内蔵GPUでの処理速度に加え、同じ画面でGPUとNPUを切り替えて試せる点も、このデモの特徴です。コードや測定条件に関心があれば、yolodemoとyolofast_pubを参照してください。