Amazon Web Services ブログ

AWS IoT Greengrass Version 2 を使用して Amazon SageMaker Neo および NVIDIA DeepStream アプリケーションを実行する

AWS IoT Greengrass Version 2 (V2) は、re:Invent 2020 にて一般提供されましたAWS IoT Greengrass は、 Internet of Things(IoT)のオープンソースエッジランタイムおよびクラウドサービスであり、デバイスソフトウェアの構築、デプロイ、および管理を支援します。お客様は、家庭、工場、車両、企業の何百万ものデバイスで IoT アプリケーションに AWS IoT Greengrass を使用しています。 AWS IoT Greengrass V2 は、オープンソースのエッジランタイム、改善されたモジュール性、新しいローカル開発ツール、および改善されたフリートデプロイメント機能を提供するようになりました。この新しいバージョンは、依存関係を管理するコンポーネントフレームワークを提供し、アプリケーションに必要となる柔軟なコンポーネントをデプロイするだけでよいため、デプロイメントサイズを縮小できます。コンポーネントは、 YAML または JSON 形式のレシピに定義します。さらに、アプリケーションは AWS Lambda である必要はありません。選択した言語でコマンドラインアプリケーションを作成し、レシピを含んだパッケージを作成できるようになりました。もちろん、AWS IoT Greengrass V2 は、 Lambda アプリケーションを実行可能にするコンポーネントも提供しています。 GitHub にある AWS IoT Greengrass V2 オープンソースプロジェクトにアクセスし、AWS IoT Greengrass V2 の AWS IoT Greengrass 開発者ガイド で新着情報を学ぶことができます。

この記事では、AWS IoT Greengrass V2と NVIDIA Jetson モジュール間の統合について、次の 2 つのユースケースを用いて説明します。

  1. Amazon SageMaker Neo を使用して NVIDIA Jetson モジュール (Nano、TX2、Xavier NX、およびAGX Xavierをサポート) に GPU アクセラレーションした画像分類モデルを デプロイして実行する方法
  2. NVIDIA DeepStream を使用して Jetson モジュールにビデオ分析パイプラインをデプロイする方法

アーキテクチャ

2つのユースケースセクションは、相互に依存していません。 NVIDIA DeepStream サンプルアプリケーションのみをデプロイする場合は、 セクション 1 をスキップし、セクション 2 を実施することができます。

前提条件

セクション 0: AWS IoT Greengrass V2 のインストール

この記事では AWS IoT Greengrass V2 のインストール方法について詳しくは触れません。エッジデバイスに AWS IoT Greengrass V2 をインストールし、動作させるための詳細な手順については、開発者ガイドの AWS IoT Greengrass V2 の開始方法 を参照してください。

AWS IoT Greengrass V2 のインストールをすぐに始めたい場合は、 GitHub にあるインストールスクリプトを Jetson モジュール上で実行することができます。正常にインストールされたら、次のセクションに進むことができます。

セクション 1: Amazon SageMaker Neo コンパイル済みモデルによる画像分類

このセクションでは、Amazon SageMaker Neo でコンパイル及び最適化された画像分類ニューラルネットワークモデルを 実行する方法について説明します。動物の画像分類などの一般的な方法です。

この例では、 NPY ファイルに変換された事前作成済みの JPEG 画像 (犬の写真) を取得し、その画像に対して推論 (分類) を実行します。推論結果をメッセージとし MQTT で AWS IoT Core に送信します。

犬の写真

図1 : 犬の写真

AWS IoT Greengrass V2 に関して、このセクションでは Jetson モジュールに 3 つの AWS IoT Greengrass コンポーネントをデプロイします。

  1. variant.Jetson.DLR – 適切な Amazon SageMaker Neo DLR をデバイスへインストールします。 AWS IoT Greengrass V2 DLR インストーラの詳細については、開発者ガイドを参照してください。
  2. variant.Jetson.ImageClassification.ModelStore – Jetson モジュールに最適化された ResNet18 画像分類モデルをインストールします。
  3. aws.greengrass.JetsonDLRImageClassification – 画像分類を実行し、 MQTT プロトコルを使用して AWS IoT Core にメッセージを送信する Python のサンプルプログラムが含まれています。

注意 : このデプロイメント例では、仮想環境外にいくつかの Python パッケージをインストールします。具体的には、 python-opencv を Jetpack 4.4 の一部としてインストールします。そのため、 Debian パッケージのインストールが長時間になる可能性があります。 NumPy のインストールについても同様で、長時間かかる可能性があります。

 

デプロイ用のコンポーネントをクローン

このセクションでは、 GitHub のサンプルリポジトリをクローンし、デプロイするコンポーネントを準備します。作業をすすめるためには、 Git のインストールが必要です。

サンプルをデプロイするための準備

1. Jetson モジュールで以下のコマンドを実行し、 GitHub リポジトリをクローンします

git clone https://github.com/aws-samples/aws-iot-greengrass-v2-deploy-nvidia-deepstream.git

2. クローンした GitHub リポジトリの jetson_inference/recipes 内にあるレシピを GreengrassCore (例 : ~/GreengrassCore/recipes) にコピーします。コピーした後の GreengrassCore ディレクトリは、以下のような構成になります。

デプロイメントのためのディレクトリ構成

3. jetson_inference/artifacts ディレクトリにあるコンテンツを GreengrassCore/artifacts ディレクトリにコピーして、以下のような構成になるようにします。

GitHub リポジトリのディレクトリ構成

4. 次に、 AWS IoT Greengrass V2 クラウドサービスにコンポーネントバージョンをアップロードします。レシピとアーティファクトをコピーした Jetson デバイスの Greengrass ディレクトリ (~/GreengrassCore) にて、以下コマンドを実行します。Invalid choice: 'greengrassv2' がコマンド実行結果として表示された場合、 AWS CLI を最新にアップデートしてください。

aws greengrassv2 create-component-version --inline-recipe \
    fileb://recipes/aws.greengrass.JetsonDLRImageClassification-1.0.0.json
aws greengrassv2 create-component-version --inline-recipe \
    fileb://recipes/variant.Jetson.DLR-1.0.0.json
aws greengrassv2 create-component-version --inline-recipe \
    fileb://recipes/variant.Jetson.ImageClassification.ModelStore-1.0.0.json

AWS IoT Greengrass V2 を介して Jetson モジュールにサンプルコンポーネントをデプロイ

このセクションを開始する前に、 Jetson デバイスに AS IoT Greengrass V2 が正常にインストールされていることを確認してください。 AWS IoT Greengrass V2 サービスにコンポーネントをアップロードすることで、 AWS IoT Greengrass CoreがインストールされたJetsonデバイス上にこのサンプルのコンポーネントをデプロイすることができます。 AWS IoT Greengrass Core ソフトウェア V2 のインストールが成功しているかを確認します。「前提条件」を参照してください。

Jetson モジュールにコンポーネントをデプロイ

  1. AWS IoT Core コンソールに移動します。
  2. Greengrass を選択します。
  3. コンポーネントを選択します。 (AWS CLI で事前に作成した 3 つのコンポーネントが表示されます)
  4. 事前に作成したコンポーネントのいずれか一つを選択します。
  5. デプロイをクリックします。
  6. 新しいデプロイを作成を選択します。
  7. 次へをクリックします。
  8. デプロイ情報の名前を入力します。
  9. デプロイターゲットのターゲットタイプモノのグループを選択し、ターゲット名としてデバイス Core の名前を選択します。コアデバイスは、 AWS マネジメントコンソールの AWS IoT Greengrass Core ページで確認できます。
  10. 次へをクリックします。
  11. コンポーネントの選択ページで、事前に作成した 3 つのコンポーネントが選択されていることを確認し、次へをクリックします。

    デプロイするコンポーネント

  12. コンポーネントを設定ページで、次へをクリックします。
  13. 詳細設定を構成ページで、次へをクリックします。
  14. レビューページで、デプロイをクリックします。

推論結果の確認

3 つのコンポーネントのデプロイが成功すると、すぐに推論を開始します。

これにより、デプロイが成功した結果として Jetson デバイスから取得された推論データが表示されます。データが表示されない場合、「Jetson モジュールにコンポーネントをデプロイ」で概説されている各手順を実行し正常にデプロイしたことを確認するか、 AWS IoT Greengrass V2 Troubleshootingガイドを参照してください。

MQTT テストクライアントで結果を表示

  1. AWS マネジメントコンソール上で、 AWS IoT Core を選択します。
  2. テストをクリックします。
  3. MQTT テストクライアントをクリックします。

    メッセージをフィルターするためにトピック名を入力 ※キャプチャ画像は、最新のUIではありません

  4. トピックのサブスクリプションに demo/topic と入力します。
  5. トピックへのサブスクライブをクリックします。

    推論/分類 メッセージ ※キャプチャ画像は、最新のUIではありません

セクション 2: AWS IoT Greengrass V2 を使用して NVIDIA DeepStream アプリケーションをデプロイ

NVIDIA の Jetson 製品ファミリー を使用することで、サーバクラスのコンピューティングをエッジで動作するデバイスに拡張することができます。 NVIDIA は、エッジでの AI パフォーマンスを最適化するために TensorRT と CUDA を利用した DeepStream と呼ばれるストリーミング分析ツールキットを開発しました。 DeepStream SDK は、画像とセンサーデータを実用的な洞察に変換するための、エンドツーエンドのビデオ処理と ML 推論分析ソリューションを提供します。

このセクションでは、 NVIDIA Jetson モジュールに DeepStream アプリケーションと DeepStream アプリケーションによって実行される新しい ML モデルをデプロイするのに、 AWS IoT Greengrass V2 がどのように役立つかを示します。

このデモでは、 NVIDIA が DeepStream で開発したサンプルのモデルと DeepStream アプリケーションを使用します。カスタマイズされたモデルや DeepStream アプリケーションを使用することもできます。

デプロイ手順を開始する前に、 Jetson モジュールに DeepStream がインストールされているかを確認

1. アプリケーションを起動するために、ターミナルでコマンドを実行します。

 deepstream-app -c <path_to_config_file>

** <path_to_config_file> は、アプリケーション設定ファイルへのパスを示しています。

2. ターミナルで DeepStream アプリケーションが正常に起動しているかを確認します。

注意 : Jetson Nano を使用している場合、設定ファイルは以下を使用することを推奨しています。

/opt/nvidia/deepstream/<your deepstream
version>/samples/configs/deepstream-app/source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt

アプリケーションが正常に起動したら、デプロイに進みます。アプリケーションがうまく起動しない場合は、詳細を確認するために DeepStream ドキュメントの Troubleshooting ガイドを参照してください。

AWS IoT Greengrass V2 を使用して NVIDA DeepStream アプリケーションをデプロイ

ステップ 0: DeepStream アプリケーションパッケージを作成

このセクションのステップを完了する前に、まずはサンプル DeepStream アプリケーションを使用するのか、カスタマイズされたデプロイメントパッケージを使用するのかを決めます。 3 つのコンポーネントを含んだサンプル DeepStream アプリケーションを作成済みです。

  • ML モデル(NVIDIA が提供している DeepStream SDK に含まれているモデル)
  • サンプル DeepStream アプリケーション設定ファイルの変更されたバージョン
  • サンプル DeepStream プライマリ GIE 設定ファイルの変更されたバージョン

以下のデプロイ手順に沿って、上のファイルをサンプルとして使用するか、カスタマイズされたバージョンの DeepStream 設定ファイルと訓練済み ML モデルを使用することができます。

ステップ 1: ローカル環境の準備

  1. GitHub リポジトリをクローンしていない場合、ローカル環境で以下コマンドを実行します。
    git clone https://github.com/aws-samples/aws-iot-greengrass-v2-deploy-nvidia-deepstream.git
  2. ローカルの環境変数にクローンした GitHub リポジトリのパスを設定します。
    cd aws-iot-greengrass-v2-deploy-nvidia-deepstream && export DEMO_PATH=${PWD}

ステップ 2: Amazon S3 バケットにパッケージをアップロード

  1. 以下コマンドを実行して S3 バケットを作成します。 (既に S3 バケットを作成している場合は、この手順をスキップし、ステップ 3 では作成済みのバケットを使用します。)
    aws s3 create-bucket –bucket [YOUR_S3_BUCKET_NAME]
  2. クローンした GitHub リポジトリの nvidia_deepstream_integration ディレクトリへ移動します。
    cd $DEMO_PATH/nvidia_deepstream_integration
  3. S3 バケットにサンプルデプロイメントパッケージをアップロードします。
    aws s3 cp jetson_deployment.zip s3://[YOUR_S3_BUCKET_NAME]/jetson_deployment.zip

ステップ 3: AWS IoT Greengrass V2 コンポーネントを作成

  1. greengrass_component.json ファイルの名前の末尾に AWS IoT Greengrass V2 で使用しているバージョン番号を付け足します。以下、実例です。
    mv greengrass_component.json greengrass_component-1.0.0.json
  2. テキストエディタで greengrass_component.json ファイルを開いて、プレースホルダー [YOUR_S3_BUCKET_NAME] をステップ 2 で作成した S3 バケット名に置換します。
  3. AWS IoT Greengrass V2 コンポーネントを AWS IoT Greengrass クラウドサービスへアップロードします。
    aws greengrassv2 create-component-version --inline-recipe fileb://greengrass_component-1.0.0.json
    上のコマンドの実行結果として以下のようなメッセージが表示されます。

    {
        “arn”: “arn:aws:greengrass:us-west-2:XXXXXXXXXXXX:components:deepstream-deployment:versions:1.0.0”,
        “componentName”: “deepstream-deployment”,
        “componentVersion”: “1.0.0”,
        “creationTimestamp”: “2021-03-19T14:13:30.1V200-07:00”,
        “status”: {
            “componentState”: “REQUESTED”,
            “message”: “NONE”,
            “errors”: {}
        }
    }

** 注意 : デフォルトでは AWS IoT Greengrass V2 のロールで S3 バケットにアクセスすることはできません。手動で以下コマンドを実行するか、 AWS マネジメントコンソールにて、 AWS IoT Greengrss V2 ロールに S3 へにアクセス権限を付与してください。

aws iam attach-role-policy --role-name [Your_Greengrass_V2_role_name] --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

Invalid choice: 'greengrassv2' がコマンド実行結果として表示された場合、 AWS CLI を最新にアップデートしてください。

ステップ 4: AWS IoT Greengrass V2 コンポーネントをデプロイ

  1. AWS IoT コンソールの以下ページに遷移し、デプロイをクリックします。

    AWS マネジメントコンソール, AWS IoT Greengrass V2 コンポーネントのデプロイ

  2. /greengrass/v2/logs ディレクトリにある AWS IoT Greengrass Core ソフトウェア V2 の実行ログから、コンポーネントが正常に動作していることを確認します。
    • フォルダ内に greengrass.log ファイル (nucleus コンポーネント) とコンポーネント毎に <componentName>.log ファイルが作成されます。
    • 設定済みの DeepStream パイプラインシンクの推論結果を監視することで確認することもできます。

セクション 3: 追加リソース

AWS IoT Greengrass V2 コンポーネントのローカルデプロイ

AWS IoT Greengrass V2 の開始方法 – 最初のコンポーネントを作成する」で概説されているように、インターネットに接続せずにローカルデバイスにデプロイすることもできます。

カメラソースを変更

画像推論からカメラ推論に変更することができます。多くの Jetson モジュールにはカメラが付属されていないため、カメラとの接続方法がカメラの種類によって異なる場合があります。詳細については、 inference.py ファイルを参照してください。

DeepStream テスト IoT アプリケーション

DeepStream アプリケーションには、 Gst-nvmsgbroker と呼ばれる機能があります。このプラグインは、 MQTT プロトコルを使用して AWS IoT Core にペイロードメッセージを送信することができます。 NvDsPayload メタデータが付与されたすべてのバッファを受信し、 nvds_msgapi_* インターフェースを使用してメッセージをサーバーに送信します。DeepStream アプリケーションの MsgBroker シンクとして AWS IoT Core または AWS IoT Greengrass を使用する必要がある場合は、以下のGitHubリポジトリにある共有ライブラリが必要です。

AWS IoT Core Integration with NVIDIA DeepStream

AWS IoT Greengrass V1 (クラシック) と NVIDIA DeepStream の統合

DeepStream と AWS IoT Greengrass V1 の統合について知りたい方は、GitHub リポジトリを参照してください。

まとめ : 構築を始めましょう!

この記事では、 NVIDIA Jetson デバイス上で AWS IoT Greengrass V2 を利用した 2 つの方法を示しました。 SageMaker Neo を使用した画像分類と動画データに対する DeepStream 動画分析パイプラインのデプロイです。 AWS IoT Greengrass の新バージョンを使用し、評価、テスト、及び開発に役立てられるよう、2021 年 12月 31 日までは AWS アカウントの最初の 1,000デバイスに AWS IoT Greengrass の料金は発生しません。ただし、 AWS IoT Greengrass で実行されるアプリケーションが使用する AWS IoT Core など、他の AWS サービスの料金については引き続き発生します。

 

原文はこちら

翻訳はソリューションアーキテクト 久次米が担当しました。