Amazon Web Services ブログ

NVIDIA DeepStream on JetsonモジュールをAWS IoT CoreとAWS IoT Greengrassと統合する方法

AWSはコンシューマ製品や製造設備などのエッジデバイスにAWSのサービスを拡張し、インテリジェントに行動できるようにするべく必要な技術をお客様に提供するために、エッジコンピューティングの提供を継続的に進化させています。これにより、お客様は不要なコストやレイテンシーを回避し、エッジデバイスを安全かつ効率的に管理できるようになります。

AWS IoT Greengrassを利用して、AWSクラウドテクノロジーをエッジデバイスに拡張することにより、生成されたデータに対しローカルでアクションを起こしつつ、クラウドでリアルタイムのデータ分析、データの保存と可視化、機械学習モデルの精度の高いトレーニングを行うことが出来ます。AWSはエッジからクラウドまでのテクノロジーソリューションを提供するだけでなく、世界中のさまざまなデバイスプロバイダーと連携し、お客様の特定のユースケースに合わせて適切なハードウェアを選択できるようにしています。

NVIDIA DeepStream SDKは、インテリジェントなビデオ分析アプリやサービスを構築することを促進ためのフレームワークです。NVIDIA Jetson製品を使用することで、お客様はエッジで動作するデバイスにサーバークラスの計算性能を拡張することができます。Jetsonプラットフォーム上のTensorRT及び、CUDAと組み合わせてDeepStreamを使用することで、お客様は高スループットで低レイテンシのソリューションを構築し、展開することができます。

この記事では、NVIDIA DeepStream on JetsonモジュールとAWS IoTサービスを統合することで、AWSの技術とインフラストラクチャを使ってビジネス要件を満たす革新的なソリューションを構築する方法を紹介します。

ソリューション概要

この記事の目的は、NVIDIA DeepStream ApplicationsがAWS IoT CoreAWS IoT GreengrassにMQTTメッセージを発行できるようにする方法の概要を提供することです。次の図は、この投稿でデモしたソリューションのアーキテクチャを示しています。

以下のセクションでは、DeepStream SDKのメッセージブローカーAPIをインストール及び設定し、AWS IoT CoreにMQTTメッセージを発行するまでの手順を順に説明します。(JetsonデバイスでAWS IoT Greengrassに対応させたい場合は、最後のセクション「AWS IoT Greengrassとの互換性」を参照してください)。

  • 手順1:AWS DeepStreamアダプタのダウンロード
  • 手順2(オプション):共有ライブラリを手動でビルド
  • 手順3:AWSのIoT認証情報でDeepStreamアプリをプロビジョニング
  • 手順4:Jetsonデバイスへ証明書の転送
  • 手順5:DeepStreamアプリを実行

ソリューションの手順を説明した後、AWS IoT RulesでIoTメッセージを処理する方法と、AWS DeepStreamアダプタをAWS IoT Greengrassに接続する方法を説明します。

前提条件

  • Administrator権限を持つAWSアカウント
  • インターネットに接続できる、DeepStream SDKがインストールされたJetsonデバイス
  • NVIDIAのドキュメントに記載されているようにGstreamerをインストールされている

このソリューションの手順の便宜上、DeepStream SDKがインストールされているパスの環境変数を作成する方法を示します。<DeepStream SDK PATH>をJetsonデバイス上のDeepStream SDKのパスに置き換えてください。

$ export DEEPSTREAM_SDK_PATH=<DeepStream SDK PATH>

DeepStream SDKのインストールが正しくされているか確認するために、${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-appのディレクトリに移動し、以下のコマンドを実行してサンプルプリケーションを実行します。

$ deepstream-app -c <path_to_config_file>

<path_to_config_file>はサンプルアプリケーションの設定ファイルのパスを指定します。以下の設定ファイルを利用することをおすすめします。

${DEEPSTREAM_SDK_PATH}/samples/configs/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

サンプルアプリケーションが正常に実行された場合は、次のソリューションのデプロイメントに進むことができます。 このサンプルアプリケーションの実行に問題がある場合は、DeepStream SDK 開発ガイドを参照しトラブルシューティングを行ってください。

ソリューションのデプロイメント

手順1:AWS DeepStreamアダプタのダウンロード

AWS DeepStream アダプタをダウンロードするには、

  • JetsonデバイスでDownloadsディレクトリに移動します
  • GitHubよりaws-iot-core-integration-with-nvidia-deepstreamをcloneまたはダウンロードします
  • aws_protocol_adaptorディレクトリを${DEEPSTREAM_SDK_PATH}/sources/libsにコピーします
$ cd ~/Downloads
$ git clone git@github.com:awslabs/aws-iot-core-integration-with-nvidia-deepstream.git
$ cd aws-iot-core-integration-with-nvidia-deepstream
$ cp -r aws_protocol_adaptor ${DEEPSTREAM_SDK_PATH}/sources/libs

手順2(オプション):共有ライブラリを手動でビルド

共有ライブラリ(.soファイル)はコンパイル済みで、手順1でcloneしたGitHubリポジトリのaws_protocol_adaptor/device_clientディレクトリに含まれています。共有ライブラリをカスタマイズしたい場合は、この手順 2 に従って、共有ライブラリファイルを再コンパイルすることで、MQTT メッセージの受信・送信用に最適化されたバッファサイズや TLS 接続のタイムアウト値などのカスタマイズ機能を追加することができます。

手動で共有ライブラリをビルドする場合は、

$ mkdir ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/aws-iot-sdk
$ cd {DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/aws-iot-sdk
$ git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git
  •  AWS IoT device SDKはMbed TLSに依存しているため、aws-iot-sdk/external_libs/に移動し、Mbed TLSのリポジトリからcloneします
$ cd ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/aws-iot-sdk/external_libs/mbedTLS
$ git clone https://github.com/ARMmbed/mbedtls.git
  • device_clientに移動して、ビルドを実行します
$ cd ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client
$ make clean
$ make
  • ビルドが終わると、フォルダ内のlibnvds_aws_proto.soが更新されます

手順3:AWSのIoT認証情報でDeepStreamアプリをプロビジョニング

AWS IoT Coreの認証情報をDeepStreamアプリにプロビジョニングするには、

  • AWSマネージメントコンソールでAWS IoT Coreのコンソールを開きます
  • 左側のメニューから、Secure -> Policiesと開きます
  • 右上のCreateを選択します
  • Policy作成のウィザードが表示されます
    • 注意: 今回のデモでは、AWS IoT Coreで任意のアクションですべてのリソースにアクセスできるようにするためのポリシーを作成する方法を説明します。本番環境では、ベストプラクティスとして、リソースと許可されたアクションを指定して、最低限の権限を付与していることを確認する必要があります)。

  • 必須の項目を入力し、Createを選択します
  • IoT Coreコンソールの左側のメニューから、Manage -> Thingsと開、右上のCreateを選択すると、Thingの作成ウィザードが開始します

  • Create a single thingを選択します

  • Thingのnameにはds_appと入力します。他の項目はそのままでNextを選択します
  • Create certificateを選択します

  • 作成された証明書はすべてダウンロードします
  • Root証明書のリンクはダウンロードではなく別のページが開きますので、その中のAmazon Root CA1をダウンロードします。このリンクから直接開くことも出来ます
  • Activateを選択して証明書を有効にします

最後にAttach Policyを選択し、作成したポリシーds_app_policyを選択します

手順4:Jetsonデバイスへ証明書の転送

Jetsonデバイスへ証明書を転送するには、

  • ダウンロードしたディレクトリに移動します
  • 以下のような名前の証明書が4つあります
XXX-certificate.pem.crt
XXX-private.pem.key
XXX-public.pem.key
AmazonRootCA1.pem
  • これらを以下のようにそれぞれ名前を変更します
certificatePem.cert.pem
privateKey.private.key
publicKey.public.key
root.ca.pem
  • 以下の様にJetsonデバイスにcertディレクトリを作成し、コピーします。この例では同じネットワーク内にJetsonデバイスと証明書をダウンロードしたPCがある前提です
$ scp certificatePem.cert.pem privateKey.private.key publicKey.public.key root.ca.pem <YOUR_JETSON_IP>:${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/certs/
  • あるいは、クラウド上の安全なストレージにアップロードして、Jetsonモジュールからダウンロードすることもできます。
  • 注意: これらの証明書をJetsonモジュールに転送できたら、このデモでは以下のディレクトリにこれらの証明書を置くことにします。このデモでは、これらの証明書を以下のディレクトリに配置しますが、 cfg_aws.txt ファイルで指定することでカスタムディレクトリを使用することができます。
$ mkdir ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/certs
$ mv <4 CERTS FILES> ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/certs
  • Jetsonデバイス上で以下に移動します
$ cd ${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/
  • cfg_aws.txtを編集します
    • <YOUR IOT HOST ADDRESS>を自分のAWS IoT Coreのエンドポイントに変更します。エンドポイントの確認方法は、IoT Coreのマネージメントコンソールの左のメニューでSettingsを開くと、Endpointの枠に表示されています

  • <DEEPSTREAM SDK PATH>を実際にインストールされているDeepStream SDK PATHに書き換えます
    • 警告: 絶対パスではなく相対パスを使用すると、証明書の解析に失敗するエラーが発生します。これが発生した場合、このファイルに戻って証明書パスを編集し、DeepStreamアプリケーションを再起動することができます。
  • ThingNameとClientIDを、先の手順で作成したThing名ds_appを指定します

手順5:DeepStreamアプリを実行

最後に、NVIDIAが開発したテストアプリを使用して、アダプタのセットアップを検証します。NVIDIA DeepStream SDKのサンプルアプリフォルダ(${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps)にあるtest4とtest5の両方でテストを実行します。deepstream-test4では、AWS IoT Coreに公開するカスタムペイロードを生成するためのバッファ付きユーザメタデータNVDS_EVENT_MSG_METAとしてカスタムオブジェクトを追加するデモを行うことができます。deepstream-test5では、パイプラインで”nvmsgconv”と”nvmsgbroker”プラグインを使用し、NVDS_META_EVENT_MSGタイプのメタデータを作成し、AWS IoT Coreにアップロードする方法をデモすることができます。どちらのアプリも、このメッセージブローカーのインストールと機能性の検証に役立ちます。

Test App 4の使い方

  • Jetsonデバイス上で、DeepStream SDKのtest4${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-test4に移動し、makeコマンドを使ってビルドします
$ cd ${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-test4
$ make
  • 次に、以下のコマンドでtest4を実行します
$ ./deepstream-test4-app -i ../../../../samples/streams/sample_720p.h264 -p ../../../libs/aws_protocol_adaptor/device_client/libnvds_aws_proto.so --conn-str=hello -c ../../../libs/aws_protocol_adaptor/device_client/cfg_aws.txt -t test --no-display
  • AWS IoT Coreのコンソールに移動し、左側のメニューからtestを選びます
  • トピックのサブスクリプションのボックスの中にtest(または、全てのデータを受信したい場合は#)と入力し、Subscribe to topicを選択します。テストアプリが正しく実行されていれば、以下のようにメッセージが表示されるのを確認することが出来ます。

Test App 5の使い方

  • Jetsonデバイス上で、DeepStream SDKのtest5${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-test5に移動し、makeコマンドを使ってビルドします
$cd ${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-test5
$ make
  • deepstream-test5をテストする前に、設定ファイルを編集します
$cp configs/test5_config_file_src_infer.txt configs/test5_config_file_src_infer_aws.txt
$ vim configs/test5_config_file_src_infer_aws.txt
  • sink1(message broker sink)の下のmsg-broker-proto-libが、以下を参照するように変更します
${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/libnvds_aws_proto.so
  • 次に同じsink1の下にあるmsg-broker-configを以下を参照するように修正します
${DEEPSTREAM_SDK_PATH}/sources/libs/aws_protocol_adaptor/device_client/cfg_aws.txt
  • 次に、topicを選択したトピック名に修正し、sink0のtypeをFakeSinkに修正します
  • 次に以下のコマンドを実行します
$ ./deepstream-test5-app -c configs/test5_config_file_src_infer_aws.txt 
  • AWS IoT Coreのコンソールに移動し、左側のメニューからtestを選びます
  • トピックのサブスクリプションのボックスの中にtest(または、全てのデータを受信したい場合は#)と入力しSubscribe to topicを選択します
  • テストアプリが正しく実行されていれば、以下のようにメッセージが表示されるのを確認することが出来ます。

以上で、AWS IoT CoreやAWS IoT GreengrassにMQTTメッセージを発行するためのDeepStream SDKのメッセージブローカーAPIのインストールと設定の手順は終了です。

次に、AWS IoTルールでIoTメッセージを処理する方法と、AWS DeepStreamアダプタをAWS IoT Greengrassに接続する方法を説明します。

AWS IoTルールでIoTメッセージを処理する

AWS IoT Coreにメッセージが入ってくると、それをさらに処理したり、AWSクラウドに保存したりするためのオプションがたくさんあります。簡単な例としては、AWS IoTルールを使用して、これらのメッセージをカスタマイズしたAWS Lambda関数にプッシュし、メッセージを解析してAmazon DynamoDBに格納するというものがあります。このIoTルールからストレージパイプラインへの設定については、以下のドキュメントが参考になります。

AWS Lambda アクションを使用したルールの作成

DynamoDB で単一の項目の読み取りと書き込み

Implementing a Serverless AWS IoT Backend with AWS Lambda and Amazon DynamoDB

以下のドキュメントは、本番対応のAWSデータパイプラインを構築する際にさらに役立情報です。

AWS IoT Analytics コンソールクイックスタートガイド

Integrating IoT data with your data lake with new AWS IoT Analytics features

Kinesis Data Analyticsを使ったリアルタイム IoTデバイスモニタリング

AWS IoT を使用した Kinesis Data Firehose への書き込み

AWS IoT Greengrassに対応

このAWS DeepStreamアダプタはAWS IoT Greengrassへの接続もサポートしています。cfg_aws.txt<YOUR IOT HOST ADDRESS>をGreengrass Endpoint/IPアドレスに変更することができます。

Greengrass Endpoint/IPアドレスを調べるには、いくつかの方法があります。GreengrassデバイスのIPアドレスを知っているか、Greengrassデバイス上で ifconfigを実行して調べる場合は、それを直接<YOUR IoT HOST ADDRESS>とします。AWS IoT GreengrassはDiscovery APIも提供しており、デバイスと同じGreengrassグループ内にあるAWS IoT Greengrassコアに接続するために必要な情報をデバイスから取得することができます。

お使いのデバイスをAWS IoT Greengrassに接続できるようにするための詳細は、AWS IoT Greengrass開発者ガイドのモジュール 4: AWS IoT Greengrass でのデバイスの操作に従ってください。

今回の記事では、DeepStream SDKのメッセージブローカーAPIを活用して、AWS IoT CoreやAWS IoT GreengrassにMQTTメッセージを発行する方法を説明しました。ライブラリをインストールし、設定ファイルを設定し、ライブラリをインストールした状態でDeepStream SDKでサンプルアプリ4とアプリ5を実行するプロセスを説明しました。最後に、パブリッシュされたMQTTメッセージをさらに処理してAWSクラウドに保存するためのオプションについてお話しました。この仕組をどのように利用したか、ぜひお聞かせください。

AWS IoTサービスを利用してNVIDIA DeepStreamのデプロイをスケールアップまたは自動化する方法については、AWS IoT Greengrass Deploying NVIDIA DeepStream on Edgeを参照してください。

謝辞

このブログを書くにあたり、NVIDIA Jetsonチームによるテスト、デバッグサポートに対し協力をいただき大変感謝しています。

原文はこちら
翻訳はソリューションアーキテクト 市川が担当しました。