インテルの GPU を使用して YOLOv8 で 1000fps 越えを達成するには

この記事は、medium.com に公開されている「How to get YOLOv8 Over 1000 fps with Intel GPUs?」https://medium.com/openvino-toolkit/how-to-get-yolov8-over-1000-fps-with-intel-gpus-9b0eeee879 の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。

この記事の PDF 版は下記からご利用になれます。
https://www.isus.jp/wp-content/uploads/pdf/openvino_05_how-to-get-yolov8-over-1000-fps-with-intel-gpus.pdf

著者: Raymond Lo インテル コーポレーション AI ソフトウェア・エバンジェリスト

OpenVINO™ とインテル® Arc™ A770m グラフィックスがあれば YOLOv8 で 1000fps 越えを達成できます!

GPU で AI 推論を実行することは新しいトピックではありません。最近では、AI のトレーニングと推論に GPU を使用するアプリケーションも多くなりました。では、新しいインテル® Arc™ グラフィックスを使用して同じことができるでしょうか? どうすれば良いのでしょうか?

答えは OpenVINO™ を使用することです。私が (インテルに入社する前に) 初めて AI に取り組んだとき、TensorFlow* を使用して YOLO のような物体検出を実行しようとしました。そのときに気になったのは、最適化やハードウェア・アクセラレーション機能が備わっていない CPU のパフォーマンスでした。動作は非常に遅く、エンジンが 1 つのコアで動作していることがよく分かりました (非常に遅いわけです)。その当時、優れたリアルタイム・パフォーマンスを得るには高価なグラフィックス・カードが必要でした。現在では、YOLOv8 と OpenVINO™ (英語) https://github.com/openvinotoolkit/openvino_notebooks/tree/main/notebooks/230-yolov8-optimization により、状況は大きく変わりました。CPU、iGPU、dGPU を、同じコードベースでシームレスに連携できます。これは素晴らしいことです。

この記事で覚えてほしいことは、Neural Network Compression Framework (ニューラル・ネットワーク圧縮フレームワーク、NNCF) https://github.com/openvinotoolkit/nncf (英語) でモデルを INT8 向けに圧縮および最適化して、VNNI https://www.intel.com/content/www/us/en/developer/articles/guide/deep-learning-with-avx512-and-dl-boost.html (英語)、インテル® AMX https://www.intel.co.jp/content/www/jp/ja/products/docs/accelerator-engines/advanced-matrix-extensions/overview.html 、インテル® XMX https://www.intel.com/content/www/us/en/develop/documentation/oneapi-gpu-optimization-guide/top/xe-arch.html (英語) のようなハードウェア・アクセラレーションに対応する方法です。

変換と最適化により、精度にほとんど影響を与えることなく、モデルは「軽量」で高速になります。
![openvino_05_figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/fa48757c-dc34-8ec5-54d8-d3e336ea2461.png)

【シングルストリームの推論】
第 12 世代インテル® Core™ プロセッサーを搭載したノートブックでは、(1 つの 1080p webcam で) 45fps でした。驚くべきことに、ノートブックは「フル稼働」状態ではなく、ほかの多くの推論タスクを実行する余裕があります。

どんな魔法を使ったのでしょうか? その魔法とは、OpenVINO™ の GPU プラグイン https://docs.openvino.ai/latest/openvino_docs_OV_UG_supported_plugins_GPU.html (英語) によるデバイスの切り替え (device = "GPU") でした。

run_object_detection(source=0, flip=True, use_popup=False, model=ov_model, device="GPU")

![openvino_05_figure2_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/f15d2d9b-eee7-5e7e-2994-7ebc1cb20424.gif)

iGPU と OpenVINO™ で YOLOv8 を実行。かなりシームレスです。

インテル® Arc™ A770m グラフィックスに切り替えると、10% の負荷では GPU はほとんど使用されていません。
![openvino_05_figure3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/3cbb0f6e-3e88-7462-968f-6fc34a066b21.png)
dGPU は、使用率が比較的低い状態で多くの推論を並列で実行できます。

【1000fps 越えを達成するには?】
ここで、記事のタイトルに戻ります。どうすれば 1000fps 越えを達成できるのでしょうか? その秘訣は、スループット・モードでマルチストリームと複数の推論リクエストを使用する (つまり、複数を並列で実行する) ことです。例えば、"benchmark_app" を使用して、モデルのスループットを計算できます。ボトルネックが発生しないように前処理パイプラインと後処理パイプラインを微調整する必要があります。

前置きはこれくらいにして、NUC の CPU -> iGPU -> dGPU のベンチマーク結果を示します。
![openvino_05_figure4 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/e82370eb-bc02-bbff-1bb6-65d221a83f3c.jpeg)
NUC のセットアップ

# Inference FP32 model (OpenVINO IR)
!benchmark_app -m $model_path -d CPU -api async -shape "[1,3,640,640]"
![openvino_05_figure5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/c531a3a5-290b-b4a0-f6f2-cac4a7d4556e.png)
CPU 上の FP32 モデルでは ~75fps

# Inference INT8 model (OpenVINO IR)
!benchmark_app -m $int8_model_path -d CPU -api async -shape "[1,3,640,640]"
![openvino_05_figure6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/cfa2c652-31d2-620d-b87d-06781b616647.png)
CPU 上の INT8 モデルでは ~183fps

!benchmark_app -m $int8_model_path -d GPU.0 -api async -shape "[1,3,640,640]"
![openvino_05_figure7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/ef3594eb-dddc-6591-60e4-1bfc8ece2445.png)
iGPU 上では ~204fps

!benchmark_app -m $int8_model_path -d GPU.1 -api async -shape "[1,3,640,640]"
準備はいいですか?

![openvino_05_figure8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/b5369387-0cf1-ac38-81b4-93d8681a404e.png)
なんと、インテル® Arc™ A770m グラフィックス上の INT8 モデルでは 1073.97fps になりました!

1000fps 越え達成です!

途中の過程を詳しく知りたい場合は、OpenVINO™ ノートブック https://github.com/openvinotoolkit/openvino_notebooks  (英語) のコードを確認してください。皆さんのコメントを歓迎します。
![openvino_05_figure9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/04c6adf6-909e-39d4-f738-01fd171559f7.png)
最適化ツールを実行し、結果をプレビューしてコーディング方法を学ぶこともできます。

試してみて、結果をお知らせください。コーディングを楽しみましょう!

#iamintel

＜OpenVINO™ ツールキットとは＞
AI を加速する無償のツールである OpenVINO™ ツールキットは、インテルが無償で提供しているインテル製の CPU や GPU、VPU、FPGA などのパフォーマンスを最大限に活用して、コンピューター・ビジョン、画像関係をはじめ、自然言語処理や音声処理など、幅広いディープラーニング・モデルで推論を最適化し高速化する推論エンジン / ツールスイートです。

OpenVINO™ ツールキット・ページでは、ツールの概要、利用方法、導入事例、トレーニング、ツール・ダウンロードまでさまざまな情報を提供しています。ぜひ特設サイトにアクセスしてみてください。

https://www.intel.co.jp/content/www/jp/ja/internet-of-things/openvino-toolkit.html

◆法務上の注意書き

インテルのテクノロジーを使用するには、対応したハードウェア、ソフトウェア、またはサービスの有効化が必要となる場合があります。

性能は、使用状況、構成、その他の要因によって異なります。

性能の測定結果はシステム構成の日付時点のテストに基づいています。また、現在公開中のすべてのセキュリティー・アップデートが適用されているとは限りません。詳細は、システム構成を参照してください。絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。

インテルの最適化機能は、インテルのコンパイラーまたはその他のインテル製品を対象としたものであり、他社製品に同等の最適化を行えないことがあります。

インテルは、サードパーティーのデータについて管理や監査を行っていません。ほかの情報も参考にして、正確かどうかを評価してください。

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

本資料に記載されているインテル製品に関する侵害行為または法的調査に関連して、本資料を使用または使用を促すことはできません。本資料を使用することにより、お客様は、インテルに対し、本資料で開示された内容を含む特許クレームで、その後に作成したものについて、非独占的かつロイヤルティー無料の実施権を許諾することに同意することになります。

本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスも許諾するものではありません。唯一の例外として、本資料に含まれるコードは、http://opensource.org/licenses/0BSD (英語) のとおり、ゼロ条項 BSD オープンソース・ライセンス (0BSD) の対象になるものとします。