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 CoreとAWS 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のパスに置き換えてください。
DeepStream SDKのインストールが正しくされているか確認するために、${DEEPSTREAM_SDK_PATH}/sources/apps/sample_apps/deepstream-app
のディレクトリに移動し、以下のコマンドを実行してサンプルプリケーションを実行します。
<path_to_config_file>
はサンプルアプリケーションの設定ファイルのパスを指定します。以下の設定ファイルを利用することをおすすめします。
サンプルアプリケーションが正常に実行された場合は、次のソリューションのデプロイメントに進むことができます。 このサンプルアプリケーションの実行に問題がある場合は、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
にコピーします
手順2(オプション):共有ライブラリを手動でビルド
共有ライブラリ(.soファイル)はコンパイル済みで、手順1でcloneしたGitHubリポジトリのaws_protocol_adaptor/device_clientディレクトリに含まれています。共有ライブラリをカスタマイズしたい場合は、この手順 2 に従って、共有ライブラリファイルを再コンパイルすることで、MQTT メッセージの受信・送信用に最適化されたバッファサイズや TLS 接続のタイムアウト値などのカスタマイズ機能を追加することができます。
手動で共有ライブラリをビルドする場合は、
- AWS IoT device SDK library を格納するために、aws_protocol_adaptorの中に新しいディレクトリを作成します
- AWS IoT device SDK Embedded-C Version3を作成したディレクトリにcloneします
- AWS IoT device SDKはMbed TLSに依存しているため、
aws-iot-sdk/external_libs/
に移動し、Mbed TLSのリポジトリからcloneします
- device_clientに移動して、ビルドを実行します
- ビルドが終わると、フォルダ内の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つあります
- これらを以下のようにそれぞれ名前を変更します
- 以下の様にJetsonデバイスに
cert
ディレクトリを作成し、コピーします。この例では同じネットワーク内にJetsonデバイスと証明書をダウンロードしたPCがある前提です
- あるいは、クラウド上の安全なストレージにアップロードして、Jetsonモジュールからダウンロードすることもできます。
- 注意: これらの証明書をJetsonモジュールに転送できたら、このデモでは以下のディレクトリにこれらの証明書を置くことにします。このデモでは、これらの証明書を以下のディレクトリに配置しますが、
cfg_aws.txt
ファイルで指定することでカスタムディレクトリを使用することができます。
- Jetsonデバイス上で以下に移動します
cfg_aws.txt
を編集します- <YOUR IOT HOST ADDRESS>を自分のAWS IoT Coreのエンドポイントに変更します。エンドポイントの確認方法は、IoT Coreのマネージメントコンソールの左のメニューで
Settings
を開くと、Endpoint
の枠に表示されています
- <YOUR IOT HOST ADDRESS>を自分のAWS IoT Coreのエンドポイントに変更します。エンドポイントの確認方法は、IoT Coreのマネージメントコンソールの左のメニューで
<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
コマンドを使ってビルドします
- 次に、以下のコマンドでtest4を実行します
- 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コマンドを使ってビルドします
- deepstream-test5をテストする前に、設定ファイルを編集します
- sink1(message broker sink)の下のmsg-broker-proto-libが、以下を参照するように変更します
- 次に同じsink1の下にあるmsg-broker-configを以下を参照するように修正します
- 次に、
topic
を選択したトピック名に修正し、sink0のtypeをFakeSinkに修正します - 次に以下のコマンドを実行します
- 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ルールからストレージパイプラインへの設定については、以下のドキュメントが参考になります。
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チームによるテスト、デバッグサポートに対し協力をいただき大変感謝しています。
原文はこちら
翻訳はソリューションアーキテクト 市川が担当しました。