Jetson nanoが発売されました。
一応NvidiaですからAI分野に特化したボードってことになりますが、Pi3 B+にMobidiusを追加した価格より、機能面を考慮すると大幅に安いというような衝撃的な仕様でもあります。
実際はどうなのかってのが今回の内容。NvidiaのJetson関連ボードはTK1から始まってTX1、TX2、Xavierとなってますが、今回のボードはTK1とTX1の中間ぐらいの構成になってます。
いつものように、メーカーの宣伝が派手なので本当のところは?って、誰でも思うところだと思います。私の理想とする環境はかなり偏ってるので、そのつもりで読んでいただければと思います。
OSのインストールは超簡単。
今までのTXシリーズは内部eMMc起動のために煩わしい手順が必要でした。今回はそれをやめてSSDブートに変更したため、インストールで引っかかりにくくなりました。メーカーのインストール手順で何の問題もありませんが、最初にUbuntuが立ち上がるまではPi3より遙かに早かったとだけは言えます。インストール完了時点でCUDAもCUDNNもOPENCV3.3もインストールされてるので文句の付け様がありません。
標準ではWIFIやBlutoothは付いていません。CPUを取り外すとM2コネクタが付いているので汎用のWIFIカードを付けるか、USBドングルってことになります。今回は手っ取り早く余ってるWIFIドングルを使ってみました。
Jetsonシリーズの常で、日本語環境には向かないので、インストール時は注意してください。ある程度環境を作ってから日本語化する方が無難。マーSDカード(32GB以上)枚数が経済的に許す限りOSをたくさん作っておけば良いことですから、そんなに心配する必要も無いとは思います。
CPUのスピードは?
いつもの簡易テストでメインコアのCPUテストをしてみるとPI3(Pi3B+1200hzsでオーバークロック)が56.30secに対して 、Nanoは最大能力にすると17.48secでした。そんなに早くはありませんが、それでもPI3B+の約3.2倍!!
Nanoのオーバークロック方法は、今までのJetsonシリーズとはとは違い、コマンド化されたようです。USB電源から起動可能ですがオーバークロックさせると、システムが止まってしまいます。事前に5V 4A電源(これが上限のようです)とジャンパーピンを取り付ける必要があります。さらにFANを付け足すと一応安心。
実際動かしてみると、普通に使うんであればこれ以上のスピードはいらないんじゃないかって思いました。でもそこはLunux。汎用にするには少し問題もあることは使ってる方なら分かると思います。
最大の能力を引き出すには、以下2つのコマンドを続けて実行します。
sudo nvpmodel -m 0
sudo jetson_clocks
nvpmodelはNanoの場合0か1の2者選択のみのようでした。0が最大で1が最小です。また、現在の設定値(CPU,GPUの周波数)を確認するには sudo jetson_clocks --show を実行します、
以下の動画はプレインストールされているCUDA Example(GPUを使ったサンプル)を実行させたものですが、この段階でスピード的にはTX2でした(思っていたよりかなり早かった)。
Openframeworksが動くか?
動きました。過去に紹介したTX2の手順で基本的に10.01のインストールが可能です。ただし公式のものは、Ubuntu 18.04でコンパイルエラーになるので、今のところnightly buildsを使う必要があります。また、tess2及びkissのライブラリも再コンパイルが必要でした。すぐにバージョンアップされる可能性があるので、インストール方法は時期を改めて紹介します。OFのnightly builds内容を見ると次期バージョンでは標準でOpenCV4(注目すべきはdnn!!)が使えるようです。この画像は実際にNanoで実行させたものですが、今持ってる最新のMacBook Proとスピードが変わらない....。早っ!!
DARKNET(YOLO)のインストール
今までの経験上インストールにはさほど問題なかったのですが、今回も、これを使わせていただきました。ソース内容が時間単位で変更されています、この方は一体どのくらいの能力を秘めてるんでしょう。DARKNETを利用したC++でのソフト開発はなかなかハードルが高いのですが、最後の説明のように本来のスピードを保ったままOpenframeworksに移植できています。
Nanoで使うには、Makefileの修正が必要です。以下最初の方で赤文字部分の修正が必要(6行の修正)。NanoはTX1とCUDAアーキテクチャが同じのようです(ここでちょっと手こずりました)。修正後 make コマンド一発で、一応DARKNETが動く環境ができます。
4/27:追記----------------------------------------------------------------------------
.bashにCUDAのパスを追加しないとnvccが使えないのでエラーが出ます。なので以下2行の追加必要。
export PATH=/usr/local/cuda/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}
----------------------------------------------------------------------------
***********************************************************
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0
# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)
DEBUG=0
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] \
# -gencode arch=compute_61,code=[sm_61,compute_61]
OS := $(shell uname)
# Tesla V100
# ARCH= -gencode arch=compute_70,code=[sm_70,compute_70]
# GeForce RTX 2080 Ti, RTX 2080, RTX 2070, Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Tesla T4, XNOR Tensor Cores
# ARCH= -gencode arch=compute_75,code=[sm_75,compute_75]
# Jetson XAVIER
# ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]
# GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
# ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61
# GP100/Tesla P100 - DGX-1
# ARCH= -gencode arch=compute_60,code=sm_60
# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]
# For Jetson Tx2 or Drive-PX2 uncomment:
# ARCH= -gencode arch=compute_62,code=[sm_62,compute_62]
*********************************************************
ジャー肝心のAI認識です。
結論的にはTX2とかXavier並の性能に追いつかせることは無理のようです、いつものようにコツが必要。YOLO3とかYOLO2では満足なスピードは得られません。つまりかなり遅いし、YOLO3に至ってはアプリに組み込むとメモリが完全に不足する雰囲気です。でもNvidiaでの公式発表ではTiny YOLO3がかなりのスピードで実行できているのが気になるところ。
Tiny YOLO3の学習済みデータの大きさは、標準(大体200MB前後)のものより1/6(35MB)程度なので認識率は正直?です。今回は今まで作ったジャンケンのアノテーション済みデータを元にTiny YOLO3を試してみました
データ:16,115枚
クラス数:4 (サーモグラフィー白黒画像を使ったグーチョキパーと顔の認識)
母艦:intel i7 6700K、 GPU GTX 1080Ti
lossが最小値から上がってきているの8000回目で止めています。ちなみに採用したデータは6000回目のもので、この時の計算時間はなんとわずか45分でした。ただしグラフが大きく振れているので認識のばらつきがある気配...。以下はYolov2の学習状況ですが、比べてみるとLossの下限を含めてずいぶん違うことが分かると思います。v2でも6000回がベターで学習時間は2時間程度でした。今回はCUDNN_HALF設定(16ビット浮動小数点)なので前回より早かった可能性があります。でも、今回のように本格的な学習作業(画像の大きなモノ)は、nanoではトライするだけ無駄と思われますのでご注意を.....。多分メモリーが不足して初期段階で止まってしまうと思われます。
今回nanoテスト用に使ったサンプルソース(以下の動画)は、元々XavierでYOLO3を動かすために自分で作ったものです。PI3で赤外線センサーカメラ表示処理をした後(左側のディスプレイ)、WIFIで画像データをNanoに送り、認識が確実になるよう画像拡大補間やノイズ処理などを施した上で、画像認識をさせた後(右側のディスプレイ)、その認識座標他を再度PI3に送って認識結果を表示させています。「おうちクラウドAI」と名付けました。つまり、離れたところにPI3を置けば、PI3でリアルタイム画像認識をしているような感覚です。
赤外線センサーは、Nano直付けでも良い(ただしSPI設定はかなり難しいので今後に期待)のですが、使用用途から考えてWiFiの方が断然有利なので、あえて手間のかかる処理を加えて画像と各種データの送受信をしています。この程度のAI認識ではTinyでも特に問題が無いことが分かります。PI3、Nano双方でGPIOが使えるので応用は無限大!!
何よりスピードが早い。今回はLEPTON3(FLIRの赤外線センサーカメラ)の画像読み込みにPIを使ってますが、ESP8266でも可能。3年間積み上げてきたものです。たった1万円強のJetson nanoで動くとなると感慨もひとしおです。
つまりJetson Nanoって....。
判断は皆さんにお任せします。
Jetson Nanoの記事を追加しました。
追伸
おかげさまで、今まで作ったすべてのモノをさらに進化させて展示することができました。いろいろな意見をいただいて、とても有意義な2日間となりました。みなさんありがとうございました。
様々なディバイスで独立した処理を実行しています。BosonとLeptonは今僕にできるサイコウの詳細な表示が実現できました。XavierもnanoもiPhoneやm5Stackでも!!。この画像に写ってるだけでも「おうちクラウドAI」は2系統で同時実行してます。6種類のディスプレイで違った処理をしてるのですが判別できるでしょうか?(設定と起動までが大変な作業でしたが....)