3-Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す(GPU編)

https://qiita.com/sparkgene/items/2562045dee93e6f3826b

前回の記事では、Jetson Nano上でAWS IoT GreengrassのML Inferenceを試しました。
Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す

ただし、前回はCPUを利用した推論が行われていました。今回は、GPUを使った推論を実行するための方法について紹介します。(この記事は前回の記事の環境ができている前提での設定となります)

MXNetをソースコードからビルド

apt-getを利用した方法だと、CUDA9向けのMXNetがインストールされるため、JetsonNanoのGPUを使いたい時に動きません。(JetsonNanoだとCUDA10の為)
そこで、同じスレッドで紹介されている通り、ソースコードからのビルドが必要になります。

I was unable to compile and install MXNET on the jetson nano,Is there an official installation tutorial?

細かいコマンドは、このスレッドに書かれている内容(1. Allocate swap 〜 4. Install MXNet)を参照してほしいのですが、注意点として2つあります。

  • Swapfileは8Gのサイズが必要
    • 手持ちが16GのSDカードだった為、空き領域が少なく試しに4GでSwapfileを作ったらビルドの途中でコケました
    • 32GのSDカードを手に入れてビルドしました
  • make -j3のコマンドがすごく長い
    • ビルドにめっちゃ時間が掛かります。寝る前に実行して朝確認するぐらいの感じでやるといいでしょう
    • 誤ってターミナルを閉じたらコマンドがコケるので、 nohup make -j3 & で、ターミナル落としても大丈夫なようにしましょう

pythonから確認

pythonのコマンドでインタプリタを開いて、GPUが利用可能か確認します

nvidia@nvidia-jetson:~$ python
Python 2.7.15+ (default, Nov 27 2018, 23:36:35)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mxnet as mx
>>> a = mx.nd.ones((2,3), mx.gpu())
>>> print((a*2).asnumpy())
[[2. 2. 2.]
 [2. 2. 2.]]

うまくインストールできたようです!

GPUのモニター

jtopというコマンドがあるので、これをインストールして使えるようにします。(READMEのインストールを参考にしてください)

sudo jtop コマンドを実行すると以下のような画面で確認できます。

スクリーンショット 2019-09-05 15.35.48.png

Lambdaの修正

28行目の引数に context='GPU0' を追加します。

global_model = load_model.ImagenetModel(model_path, 'MXNET', 'synset.txt', 'squeezenet_v1.1')
↓
global_model = load_model.ImagenetModel(model_path, 'MXNET', 'synset.txt', 'squeezenet_v1.1', context='GPU0')

新しいバージョンをデプロイし、エイリアスの参照バージョンを変更します。

Greengrass上のLambdaの修正

Lambdaの設定変更

メモリを2GBに変更するのと、/sys ディレクトリへの読み込みアクセスを有効化する

スクリーンショット_2019-09-05_14_57_03.png

ローカルリソースを追加

GPUを利用する場合は、LambdaからGPUリソースにアクセスする必要があるため、以下のローカルリソースの追加を行います。

リソース名リソースタイプデバイスパス/ソースパス送信先パスLambda 関数の関連
nvhost-ctrl-gpu デバイス /dev/nvhost-ctrl-gpu - 読み取りと書き込みアクセス
shm ボリューム /dev/shm /dev/shm 読み取りと書き込みアクセス
nvhost-ctrl デバイス /dev/nvhost-ctrl - 読み取りと書き込みアクセス
nvhost-prof-gpu デバイス /dev/nvhost-prof-gpu - 読み取りと書き込みアクセス
nvmap デバイス /dev/nvmap - 読み取りと書き込みアクセス
nvhost-dbg-gpu デバイス /dev/nvhost-dbg-gpu - 読み取りと書き込みアクセス

設定例
スクリーンショット 2019-09-05 14.58.41.png

最終的にローカルリソースはこのような設定

スクリーンショット 2019-09-05 16.13.25.png

動作確認

マネージメントコンソールからGreengrassのデプロイを実行します。

jtopでみると、GPUの使用率が上がって、使われているのがわかります。

スクリーンショット 2019-09-05 16.15.09.png

Lambdaのコードを以下のように修正して、カメラから画像を取り出して推論する時間を出力するようにしました

greengrassObjectClassification.py
42    start = time.time()
43    predictions = global_model.predict_from_cam()
44    elapsed_time = time.time() - start
45    print("elapsed_time:{}".format(elapsed_time))

GPUの場合

[2019-09-05T16:22:55.017+09:00][INFO]-elapsed_time:0.0266320705414
[2019-09-05T16:22:55.018+09:00][INFO]-[(0.11811499, 'n04372370 switch, electric switch, electrical switch'), (0.07899597, 'n03476991 hair spray'), (0.067904234, 'n04485082 tripod'), (0.066124074, 'n02783161 ballpoint, ballpoint pen, ballpen, Biro'), (0.057746205, 'n03017168 chime, bell, gong')]

CPU利用の場合

[2019-09-05T16:23:43.222+09:00][INFO]-elapsed_time:0.319680929184
[2019-09-05T16:23:43.223+09:00][INFO]-[(0.1585841, 'n04372370 switch, electric switch, electrical switch'), (0.07223587, 'n02783161 ballpoint, ballpoint pen, ballpen, Biro'), (0.059364777, 'n03476991 hair spray'), (0.056694258, 'n03876231 paintbrush'), (0.051916137, 'n03804744 nail')]

GPUだと推論にかかった時間がelapsed_time:0.0266320705414ですが、CPU利用の場合はelapsed_time:0.319680929184と、10倍ぐらい早くなっているのが確認できました。

まとめ

GPUを使うとかなり早くなりますね。

Greengrassのドキュメントに書かれているリソースとは違ったので、指定するローカルリソースを調べるのはなかなか大変ですが、今回はstraceコマンドを使って、何にアクセスしているかを確認して設定しました。

原文地址:https://www.cnblogs.com/cloudrivers/p/11894004.html