前回の記事では、Jetson Nano上でAWS IoT Greengrassを動かしました。
Jetson Nano Developer KitでAWS IoT Greengrassを動かしてみる
今回は、Jetson Nano上でMLの推論を試してみます。
Greengrassは事前に生成したMLのモデルを使って推論を実行する事が可能です。
AWS IoT Greengrass ML Inference
推論で使うモデルが必要になるので、今回はこちらの「AWS マネジメントコンソール を使用して Machine Learning Inference を設定する方法」を参考にしながら作業を進めます。
MXNetのインストール
AWSのドキュメントではJetson TX2向けの手順やライブラリが有るのですが、Jetson NanoはCUDA10の為、そのまま使えません。
で、ソースからインストールやら色々ハマった結果、公式のフォーラムで解決策が提供されていたので、それを参考にインストールしました。
sudo apt-get install -y git build-essential libatlas-base-dev libopencv-dev graphviz python-pip
sudo pip install mxnet-1.4.0-cp27-cp27mu-linux_aarch64.whl
ついでにGreengrassSDKもインストールします
sudo pip install greengrasssdk
MXNet モデルパッケージを作成する
- squeezenet_v1.1-0000.params
- squeezenet_v1.1-symbol.json
- synset.txt
この3つのファイルをzipに固めるらしいのだが、このドキュメントのURLからダウンロードしようとしても、タイムアウトしてちっともDL出来ない。。。
探してみたら、githubにあげている人がいたので、そこからDLしました。
https://github.com/dzimine/aws-greengrass-ml-inference/tree/master/lambdas/GreengrassImageClassification/squeezenet
Lambda 関数を作成して公開する
ドキュメントだとMXNetのビルド中にサンプルソースが生成されるとのことだが、今回はビルドしていないのでソースが見つからない。
以前に、試した際に取っておいたソースが有るので、今回はこれを使う。そのソースだと、Jetson TX2のオンボードカメラやRaspberry PiのPiCameraを使う内容なので、Jetson Nano向けにUSBカメラが使えるように変更したソースをgithubに上げました。
https://github.com/sparkgene/greengrassObjectClassification
(ソース取得元は、AWS IoTのマネージメントコンソールで Software > Machine learning inference > Runtimes and precompiled framework libraries configure downloadでソフトウエアの画面を開き、MXNet Nvidia Jetson TX2のdownloadでダウンロードしたファイルの中にmxnet_examples.tar.gzがあるのでそれを展開するとexamples/greengrassObjectClassificationに見つかります)
この3つのファイルをzip化して、新しく作成したLambdaに登録する。
Lambdaの登録とAliasの作成はこちらを参考にしてください。
LambdaをGreengrassに登録する際、以下のように設定を変更する
- Memory limit
- 128M
- Lambda lifecycle
- Make this function long-lived and keep it running indefinitely
Greengrass グループにリソースを追加する
ビデオカメラ
次に、Lambdaからビデオカメラにアクセスさせる必要があるので、Greengrassの画面でローカルリソースの追加を行います。

Device を選んで、ビデオのパスに/dev/video0を指定します。(環境によって変わります)
パーミッションではAutomatically add OS group permissions of the Linux group that owns the resource にチェックを付けます。

読み書き権限が必要なので、Read and write accessを選ぶ。最後に保存をします。

モデル
次に、推論で使うモデルもリソースに追加します。
Machine Learningを選び、Add machine learning resourceで新規に追加します

先の手順でzipに固めたモデルをS3に上げておきます。ここでは、S3にあげてあるモデルを指定します。

local pathには、Lambda内から参照する際のパスを指定します。Lambdaに紐付けるので、登録したLambdaを探して選択します。LambdaからはRead-only accessで大丈夫です。

AWS IoTへのPublish
今回のサンプルだと、物体を検出したらMQTTでデータをAWS IoTに上げる仕組みにしているので、Greengrass側のSubscriptionにデータの流れを登録します。
SubscriptionのメニューからAdd Subscriptionを選択します。

SourceにLambda、targetにIoT Cloudを指定すると、LambdaからPublishされた、メッセージがAWS IoT Coreにルーティングされます。Nextをクリックします。

このサブスクリプションをどのトピックに紐付けるかを指定します。サンプルソースでは、data/jetsonnanoというtopicに対してpublishするので、合わせます。Nextを押すと確認画面が表示されるので、確認して登録をします。

動作確認
クラウド側の設定が終わったので、Jetson Nanoにデプロイします。先に、USBカメラの接続をしておきます。
デプロイに時間がかかるので、この間に、AWS IoTのテストメニューを開いて、data/jetsonnanoを監視します。

デプロイがされ、しばらくすると以下のように、推論した結果が表示されます。

まとめ
MXNetのインストールはどうなるかと思ったが、なんとかなりました。
ハマらなければ、結構簡単に推論アプリを実行するところまで進められました。
Raspberry Piより性能が高く、Jetson TX2より安いので、色々なシーンで利用できるかなと思います。
GPUを使う場合(9/5追記)
こちらの記事を参照してください。
Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す(GPU編)
免責
発言内容は個人的な意見であり、所属する企業を代表するものではありません。
掲載しているソースコードは、サンプルレベルの物ですので動作を保証するものではありません。


