Amazon Web Services ブログ

AWS IoT Greengrass を使用した GPU ベースのエッジデバイス上での YOLOv8 のデプロイとベンチマーク

この記事は、Romil Shah によって投稿された Deploying and benchmarking YOLOv8 on GPU-based edge devices using AWS IoT Greengrass を翻訳したものです。

はじめに

製造業、ロジスティクス、エネルギー分野のお客様は、エッジで機械学習(ML)モデルを実行する必要がある場合、しばしば厳しい要件に直面します。このような要件の中には、低いレイテンシーでの処理、インターネットへの接続性の低さ、もしくは通信断絶、データセキュリティなどがあります。このようなお客様にとって、エッジで ML プロセスを実行することは、クラウドで実行するよりも多くの利点があります。ディープラーニングベースの ML モデルの場合、GPU ベースのエッジデバイスは、エッジでの ML モデルの実行を強化することができます。

AWS IoT Greengrass を使用すると、エッジデバイスの管理とこれらのデバイスへの ML モデルのデプロイを行うことができます。この投稿では、Ultralytics から GPLv3 ライセンスにて配布されている YOLOv8 モデルを NVIDIA ベースのエッジデバイスにデプロイして実行する方法を示します。特に、PyTorch や TensorRT などの様々な ML ライブラリでコンパイルされた YOLOv8 モデルをテストし、ベンチマークを実行するために、NVIDIA Jetson Orin™ NX 16GB モジュールをベースにした Seeed Studio の reComputer J4012 を使用しています。reComputer J4012 上で動作する複数の YOLOv8 モデルフォーマットのパフォーマンスを紹介します。AWS IoT Greengrass コンポーネントは、モデルと推論コードをエッジデバイスにデプロイする効率的な方法を提供します。推論は MQTT メッセージを使って呼び出され、推論出力も MQTT トピックをサブスクライブすることで得られます。YOLOv8 をクラウドでホスティングすることに興味があるお客様には、Amazon SageMaker エンドポイント上 でYOLOv8 をホスティングする方法を紹介するブログをご参照ください。

ソリューションの概要

以下の図は、ソリューション全体の AWS アーキテクチャを示しています。Seeed Studio の reComputer J4012 は、AWS IoT Core を使用して AWS IoT Thing としてプロビジョニングされ、カメラに接続されます。開発者は、自分の環境から com.aws.yolov8.inference Greengrass コンポーネントをビルドし、AWS IoT Core にパブリッシュすることができます。コンポーネントがパブリッシュされると、特定されたエッジデバイスにデプロイすることができ、コンポーネントへのメッセージングは AWS IoT コンソールを使って MQTT で管理されます。パブリッシュされると、エッジデバイスは推論を実行し、MQTT を使用して AWS IoT Core にアウトプットを戻します。

YOLOv8 at Edge Architecture

前提条件

ウォークスルー

Step1: エッジデバイスのセットアップ

ここでは、エッジデバイスである reComputer J4012 デバイスを正しく構成するために、必要なライブラリの依存関係をインストールし、デバイスを最大電力モードに設定し、デバイスを AWS IoT Greengrass で構成する手順を説明します。現在、reComputer J4012 には JetPack 5.1 と CUDA 11.4 がプリインストールされており、デフォルトではreComputer J4012 の JetPack 5.1 システムは最大電力モードで動作するように設定されていません。Step 1.1 と 1.2 では、他の必要な依存関係をインストールし、デバイスを最大電力モードに切り替えます。最後に Step 1.3 で、AWS IoT Greengrass でデバイスのプロビジョニングを行い、エッジデバイスが安全に AWS IoT Core に接続し、他の AWS サービスと通信できるようにします。

Step1.1 依存関係のインストール

  1. エッジデバイスのターミナルから以下のコマンドを使用して Github のリポジトリを Clone します:
    $ git clone https://github.com/aws-samples/deploy-yolov8-on-edge-using-aws-iot-greengrass
    Bash
  2. utils ディレクトリに移動し、以下のように install_dependencies.sh スクリプトを実行します:
    $ cd deploy-yolov8-on-edge-using-aws-iot-greengrass/utils/
    $ chmod u+x install_dependencies.sh
    $ ./install_dependencies.sh
    Bash

Step1.2 エッジデバイスを最大電力モードに設定

  1. エッジデバイスのターミナルから以下のコマンドを使用して最大電力モードに切り替えます:
    $ sudo nvpmodel -m 0
    $ sudo jetson_clocks
    Bash
  2. 上記のコマンドを実行後、変更を適用するためにデバイスを再起動しますかと質問されるので「yes」と入力して再起動を行ってください。

Step1.3 エッジデバイスに IoT Greengrass をセットアップ

  1. デバイスを自動的にプロビジョニングするため、reComputer J4012 のターミナルから以下のコマンドを実行してください:
    $ cd deploy-yolov8-on-edge-using-aws-iot-greengrass/utils/
    $ chmod u+x provisioning.sh
    $ ./provisioning.sh
    Bash
  2. (オプション) デバイスを手動でプロビジョニングする場合には、AWS の公開ドキュメントに記載されている手順に従ってください。このドキュメントでは、デバイスの登録、認証とセキュリティのセットアップ、安全な通信の設定、IoT Thing の作成、ポリシーと権限のセットアップなどのプロセスを解説しています。
  3. IoT Thing IoT Thing Group を入力するように要求されるので、ご自身のデバイスのモノの名前を入力してください。省略した場合にはデフォルトの値(GreengrassThing と GreengrassThingGroup)が設定されます。
  4. セットアップされると、以下の図のように AWS IoT Core のコンソール上からこれらのデバイスが見えるようになります:

YOLOv8 at Edge Thing

YOLOv8 at Edge Thing Group

Step2: エッジデバイスへのモデルのダウンロード/変換

ここでは、YOLOv8 PyTorch モデルの 3 つの主要カテゴリーにフォーカスします: 検出、セグメンテーション、分類です。各モデルタスクは、性能と複雑さに基づいてさらに 5 つのタイプに細分化され、以下の表のようにまとめることができます。各モデルタイプは、モデルのサイズに基づき、「Nano」(低レイテンシ、低精度)から「Extra Large」(高レイテンシ、高精度)までに分類されます。

Model Types 検出 セグメンテーション 分類
Nano yolov8n yolov8n-seg yolov8n-cls
Small yolov8s yolov8s-seg yolov8s-cls
Medium yolov8m yolov8m-seg yolov8m-cls
Large yolov8l yolov8l-seg yolov8l-cls
Extra Large yolov8x yolov8x-seg yolov8x-cls

エッジデバイス上のデフォルトの PyTorch モデルを ONNXTensorRT フレームワークに変換してダウンロードする方法を示していきます。

Step2.1 PyTorch ベースモデルのダウンロード

  1. reComputer J4012 のターミナル上から、パスを edge/device/path/to/models から、モデルをダウンロードしたい場所に変更し、環境を設定するために以下のコマンドを実行します:
    $ echo 'export PATH="/home/$USER/.local/bin:$PATH"' >> ~/.bashrc
    $ source ~/.bashrc
    $ cd {edge/device/path/to/models}
    $ MODEL_HEIGHT=480
    $ MODEL_WIDTH=640
    Bash
  2. reComputer J4012 のターミナル上で、PyTourch のベースモデルをダウンロードするために以下のコマンドを実行します:
    $ yolo export model=[yolov8n.pt OR yolov8n-seg.pt OR yolov8n-cls.pt] imgsz=$MODEL_HEIGHT,$MODEL_WIDTH
    Bash

Step2.2 モデルの ONNX と TensorRT への変換

  1. 以下のコマンドで PyTourch のモデルを ONNX モデルに変換します:
    $ yolo export model=[yolov8n.pt OR yolov8n-seg.pt OR yolov8n-cls.pt] format=onnx imgsz=$MODEL_HEIGHT,$MODEL_WIDTH
    Bash
  2. 以下のコマンドで ONNX モデルを TensorRT モデルに変換します:
    [Convert YOLOv8 ONNX Models to TensorRT Models]
    $ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/targets/aarch64-linux/lib' >> ~/.bashrc
    $ echo 'alias trtexec="/usr/src/tensorrt/bin/trtexec"' >> ~/.bashrc<br />$ source ~/.bashrc
    $ trtexec --onnx={absolute/path/edge/device/path/to/models}/yolov8n.onnx --saveEngine={absolute/path/edge/device/path/to/models}/yolov8n.trt
    Bash

Step3: ローカルマシンもしくは EC2 インスタンスをセットアップしてエッジデバイスで推論を行う

ここでは、Greengrass Development Kit (GDK) を使用して、ローカルマシン上でコンポーネントをビルドし、AWS IoT Core にパブリッシュし、エッジデバイスにデプロイし、AWS IoT コンソールを使用して推論を実行する方法を示します。このコンポーネントは、ML モデルのロード、推論の実行、MQTT を使用した AWS IoT Core へのアウトプットのパブリッシュを担当します。推論コンポーネントをエッジデバイスにデプロイするには、推論コードを Greengrass コンポーネントに変換する必要があります。これはローカルマシン、もしくはAWS 認証情報とAmazon Simple Storage Service (S3) へのアクセス権限をもった IAM ポリシーが設定された Amazon Elastic Compute Cloud (EC2) インスタンス上で行う必要があります。

Step3.1 ローカルマシンもしくは EC2 インスタンスからのエッジデバイスへのコンポーネントのビルド/パブリッシュ/デプロイ

  1. ローカルマシンもしくは EC2 インスタンスのターミナルから、GitHubのリポジトリを Clone し、環境を設定します:
    $ git clone https://github.com/aws-samples/deploy-yolov8-on-edge-using-aws-iot-greengrass
    $ export AWS_ACCOUNT_NUM="ADD_ACCOUNT_NUMBER"
    $ export AWS_REGION="ADD_REGION"
    $ export DEV_IOT_THING="NAME_OF_OF_THING"
    $ export DEV_IOT_THING_GROUP="NAME_OF_IOT_THING_GROUP"
    Bash
  2. components/com.aws.yolov8.inference ディレクトリの recipe.json を開き、Configuration の項目を編集します。ここで、 model_loc はStep 2.1 にて定義したエッジデバイス上でのモデルの場所です:
    "Configuration": 
    {
        "event_topic": "inference/input",
        "output_topic": "inference/output",
        "camera_id": "0",
        "model_loc": "edge/device/path/to/yolov8n.pt" OR " edge/device/path/to/models/yolov8n.trt"
    }
    JSON
  3. ターミナル上で以下のコマンドを実行することで、ローカルマシンもしくは EC2 インスタンスに GDK をインストールします:
    $ python3 -m pip install -U git+https://github.com/aws-greengrass/aws-greengrass-gdk-cli.git@v1.2.0
    $ [For Linux] apt-get install jq
    $ [For MacOS] brew install jq
    Bash
  4. ローカルマシンもしくは EC2 インスタンス上の utils ディレクトリで deploy-gdk-build.sh のスクリプトを実行することで、自動的にコンポーネントをビルド、パブリッシュ、デプロイします:
    $ cd utils/
    $ chmod u+x deploy-gdk-build.sh
    $ ./deploy-gdk-build.sh
    Bash

Step3.2 AWS IoT Core を使って推論を実行します

ここでは、AWS IoT Core コンソールを使用してモデルを実行し、出力を取得する方法を示します。モデルの選択は、ローカルマシンまたは EC2 インスタンスの recipe.json で行う必要があり、deploy-gdk-build.sh スクリプトを使用して再デプロイを行う必要があります。推論が開始されると、エッジデバイスはモデルフレームワークを識別し、それに応じてワークロードを実行します。エッジデバイスで生成された出力は、MQTT を使用してクラウドにプッシュされ、トピックをサブスクライブすることで見ることができます。下図は、推論のタイムスタンプ、モデルタイプ、ランタイム、フレーム/秒、モデルフォーマットを示しています。

YOLOv8 at Edge MQTT client

AWS コンソール上で MQTT メッセージを見るには以下を行います:

  1. AWS IoT Core コンソールにて、左のメニューバーのテストの下にある MQTT テストクライアントを選択し、トピックをサブスクライブするのタブから inference/output のトピックを入力し、サブスクライブをクリックします。
  2. トピックに公開するのタブから inference/input のトピックを入力し、以下の JSON をメッセージペイロードとして入力します。推論を開始する/中断する/終了する用途に応じて status を start, pause, stop に編集します:
    {
        "status": "start"
    }
    JSON
  3. 推論が開始すると、アウトプットがコンソール上に表示されます。

YOLOv8 at Edge MQTT

Seeed Studio reComputer J4012 上でYOLOv8 のベンチマークを実施

我々は、reComputer J4012 上で様々な YOLOv8 モデルの ML 実行時間を比較し、その結果を以下にまとめました。モデルはテストビデオ上で実行され、異なるモデル形式と入力形状についてのレイテンシメトリクスが得られました。興味深いことに、PyTorch モデルの実行時間はモデルの入力サイズが異なってもあまり変化しなかったのに対し、TensorRT は入力形状が小さくなるにつれて実行時間の顕著な改善が見られました。PyTorch の実行時間に変化がない理由は、PyTorchモデルが入力形状のサイズを変更するのではなく、モデルの入力形状(640×640)に合わせて画像の形状を変更するためです。

入力サイズやモデルの種類にもよりますが、TensorRT でコンパイルされたモデルは PyTorch モデルよりも良い結果を出しました。PyTorch モデルは、モデルの入力形状が小さくなるとレイテンシのパフォーマンスが低下するようであるが、これは余分なパディングによるものです。TensorRT にコンパイルされる間、モデル入力はすでに考慮され、パディングが取り除かれるため、入力形状が小さくなるにつれて性能が向上します。以下の表は、検出とセグメンテーションを実行する PyTorch とT ensorRT モデルを使用して、異なる入力形状に対するレイテンシベンチマーク(前処理、推論、後処理)をまとめたものです。結果は、異なるモデル形式と入力形状での実行時間をミリ秒単位で示しています。生の推論の実行時間については、Seeed Studio のブログ記事で公開されているベンチマーク結果を参照してください。

Model Input Detection – YOLOv8n (ms) Segmentation – YOLOv8n-seg (ms)
[H x W] PyTorch TensorRT PyTorch TensorRT
[640 x 640] 27.54 25.65 32.05 29.25
[480 x 640] 23.16 19.86 24.65 23.07
[320 x 320] 29.77 8.68 34.28 10.83
[224 x 224] 29.45 5.73 31.73 7.43

クリーンアップ

使われていない Greengrass コンポーネントとデプロイメントが全体のコストに影響を与えることはありませんが、エッジデバイスの推論コードを MQTT メッセージを使って停止することは理想的なグッドプラクティスです。GitHub リポジトリには、デプロイをキャンセルするための自動スクリプトも用意されています。同じスクリプトは、以下のように未使用のデプロイメントやコンポーネントを削除するのにも役立ちます:

  1. ローカルマシンもしくは EC2 インスタンスから Step3.1 で使用したのと同じ変数を使って、再度環境変数を設定します:
    $ export AWS_ACCOUNT_NUM="ADD_ACCOUNT_NUMBER"
    $ export AWS_REGION="ADD_REGION"
    $ export DEV_IOT_THING="NAME_OF_OF_THING"
    $ export DEV_IOT_THING_GROUP="NAME_OF_IOT_THING_GROUP"
    Bash
  2. ローカルマシンもしくは EC2 インスタンスから utils ディレクトリへ移動して cleanup_gg.py スクリプトを実行します:
    $ cd utils/
    $ python3 cleanup_gg.py
    Bash

まとめ

この投稿では、YOLOv8 モデルを Seeed StudioのreComputer J4012 デバイスにデプロイし、AWS IoT Greengrass コンポーネントを使用して推論を実行する方法を説明しました。さらに、モデルのサイズ、タイプ、画像サイズなど、様々なモデル構成で reComputer J4012 デバイスのパフォーマンスのベンチマークを行いました。エッジで実行されるモデルのほぼリアルタイムのパフォーマンスを実証し、施設内で何が起きているかを監視、追跡できるようにしました。また、AWS IoT Greengrass が、IoT エッジデバイスの管理、ML モデルのデプロイ、エッジでの推論の実行にまつわる多くのペインポイントをどのように軽減するかについても共有しました。

AWS プロフェッショナルサービスのチームが、エッジでのコンピュータビジョンモデルの構成とデプロイをどのように支援できるかについてのお問い合わせについては、当社のウェブサイトをご覧ください。

Seeed Studio について

まずはじめに、テスト用に AWS Greengrass 認証の reComputer J4012 デバイスを提供してくれた Seeed Studio のパートナーに感謝します。Seeed Studio は AWS パートナーであり、2008 年以来、オープンテクノロジーとアジャイル製造サービスを提供することで、世界の開発者コミュニティに貢献してきました。Seeed Studio は NVIDIA のエリートパートナーであり、カスタムイメージのフラッシュサービス、フリート管理、ハードウェアのカスタマイズなど、組み込みソリューションの統合を簡素化するワンストップ体験を提供しています。Seeed Studio は、統合、製造、フルフィルメントおよび流通を処理することで、お客様の市場投入までの時間を短縮します。NVIDIA Jetson エコシステムの詳細については、こちらをご覧ください。

Romil Shah

Romil Shah は AWS プロフェッショナルサービスのシニアデータサイエンティストです。コンピュータビジョン、機械学習、IoT エッジデバイスの分野で 6 年以上の業界経験を持っています。エッジデバイス向けの機械学習ワークロードの最適化と導入支援を行っています。

Kevin Song

Kevin Song は AWSプロフェッショナルサービスのデータサイエンティストです。生物物理学の博士号を持ち、コンピュータビジョンと機械学習ソリューションの構築において 5 年以上の業界経験を持っています。

この記事はプロフェッショナルサービス本部 シニア IoT コンサルタントの小林が翻訳しました。