前回の記事から約2ヶ月
その間にJETSON-TX1と言う、一昔前のGPU付きのパソコンが、PI並みに小型化されたすんごいボードを手に入れました。
ディープラーニング環境構築までかなり手間取ったのですが、一応入り口までたどり着いたので、記事にすることにしました。今話題のディープラーニングをドローンなどに組み込みやすくしたボードだそうです。ディスプレイにはPI用のIGZOディスプレイを使いました。
今回はJetpack 2.2 Ubuntu(64bit)版でcaffeとtorch7のインストールと実行までをざっと書いてみます。Jetpack 2.1(32bit)との比較などもちらっと入れてみます。Jetpacとは、OS及びGPU関連のソフトとExample群がまとまったパッケージです。
まずMacでlinuxをデュアルブート
母艦の対象は、64bit版ubuntu14.4 LTSです。余っていた外付けSSDを使いました。インストール方法は、ネット上で探してみてください。バーチャル環境ではJetpacがうまくTX1へ転送できないようです。さらに日本語化しない方がスムーズにインストールできました。
MacへのLinuxインストールが初めってだったのでかなり戸惑いました。Ubuntu母艦環境が構築できない方は、バージョンアップできないので、TX1を手に入れてもあまり意味ありません。
Jetpack64bit版をダウンロード
といってもダウンロードされるのはスクリプトだけです。あとはマニュアルに沿ってインストール。勝手に必要ファイルをダウンロードしてくれます。
TX1は一度電源を抜いて、POWERボタンを押した後、すぐリカバーボタンを押しっぱなし、続けてリセットボタンを押し、リセットボタンを離したら、2秒待ってリカバリースイッチを離すだそうです。多少タイミングがずれても順番がおかしくなければOKでした。
確認方法は lsusb コマンドをターミナルから入力して、Nvidiaで始まるUSB機器が接続されているかどうかです。これが確認できないと以下のインストールができないので注意。表示されない場合は再度TX1の接続をやり直してください。
次にMacとTX1間を付属のUSBケーブルでつなぎます(付属のUSB3ケーブル)。ランケーブルはつながなくても、家庭内でWifi環境ができてればOK。その他には必ずHDMIディスプレイを接続しておくことが必要。(ただしWifiだとインストールに時間がかかります。以下Wifi環境でインストールしてます。)
インストーラを実行
まず母艦に必要ファイルのダウンロードが実施されますが、時間帯によってはかなり遅くなります。問題なければ転送が始まり、終了すると自動起動されたターミナル画面表示が一旦止まります。(1回目は準備はどうですかなのでENTER)
この状態になる前に、エラーが出て先に進めない場合は、母艦のsudo apt-get updateを実行するとエラーが出ています。これを解決しないとTX1への転送が不可能になる(特にCUDA関連)ので母艦を調整する必要があります。ただし、サンプル関連だけが正常に転送できなくなるみたいなので、引っかかったインストール項目を外せばなんとかなります。
2回目で表示が止まったら、母艦からOSの転送終了後TX1が再起動されるので、Xwindow画面が出るまで気長に待ちます。この間TX1の画面が真っ暗なので不安になりますが、起動するまで5分ぐらい待ち、起動されたTX1で以下のことを実行。
1. 設定からBrightr&locを選んで、画面がスリープされない設定にする。
(ロックを抜け出す時、たまにマウスもキーボードも使えなくなる可能性あり)
2. 表示画面を慎重に設定し直す(IGZO設定は回転や拡大設定が必要)
3. ユーザーアカウントで Automatic login を必ずON
どうやらTX1はIGZOとの相性が非常に悪く、これらを実行しないと再起動時、画面が真っ暗になり焦ります。その場合IGZOの電源を差し替えると多分表示されます。また、なぜか起動・終了時のログが表示されません。Pi3に接続したIGZOパネルは、表示が非常に遅かった記憶があるのですが、TX1では全く気になりません。Pi3の画像処理能力が追いついていないのでしょう。
次にWifiの設定をTX1のXwindow上で実行します(ランケーブル接続しない場合)。で、ここまで終わったら母艦に戻ってENTER。母艦が自動的にIPを認識して、インストールがイーサネットに切り替わり再開されます。
さらに続けると
途中フリーズしたように見えますが、動いてます。(TX1の該当フォルダを見てみると確実にファイル容量が増えていきます)ここで故障と勘違いして2回ほど初めからやり直してしまいました。これも相当時間が(長くて1時間)かかります。でやっと終了。ssh ubuntu@tegra-ubuntu.local (パスワードubuntu)で他のパソコンから接続が可能となります。
ここら辺でTX1をapt-get update ,upgradeします。さらに最低限使いやすくするため、nano,Unity-tweak-tool、nautilus-open-terminalをapt-getでインストールしました。
caffe やSimpleCVに必要な依存ファイルのインストール
新しく記事を書いたので、ここを参考にして下さい。時間はかかりますが、全部インストールすると、TX1のかなり手ごわいシステム構築に左右されないで、デープラーニングに専念できます。
takesan.hatenablog.com
Jetpack 64bit版の注意点
32bit版では標準で付いていたfairfoxが付いていない(インストールしても動かない)。その代わりEpiphany Web Browserが付いています(Pi3のと同じ)。このブラウザは早いとかなんとか言われているのですが、Pi3では頻繁に止まり、だんだんスピードが落ちてくるので、私は好きじゃありません。だんだんスピードが遅くなるのはTX1も引き継いでいるようです。TX1の32bit版ではfairfoxがかなりいい線いっていましたので、今後のバジョンアップまで我慢。ちなみにChromeはインストールすらできませんでした。よく考えると、主にダウンロード用に使用するだけなので、今のままでも特に問題はありません。
32bit版ではOpenCV4Tegraが、USB接続したWebCameraを認識しなかったのですが、64bit版も同様。WebCameraを使う場合は、標準OpenCVをインストールして、プログラム中でvideo1を指定すること。標準指定のvideo0では確実にエラーとなり、最悪システム全体がハングアップします。(これが分かるまで2日かかってしまいました。video0はどうやら開発ボードに付いているカメラのようですが、現状でOpencvから一般的な方法での接続は不可)修正すればOpenCV2.4のカメラを使用したexampleが実行できます。標準OpenCVとPythonのOpenCVインストールは上記私の記事を参考にして下さい。
この後暫くしてから日本語環境にしてみましたが、頻繁にXwindowがハングしてしまうのでJetpacを再インストールする羽目になってしまいました。日本語環境にしないほうが安定して動くようです。
OpenCVとは関係ありませんが試しにGPUを使ったCUDAサンプルプログラムを試してみると、こんな感じです。
Pi3ではこんなことは絶対できません。すごい!!(金額もすごいけど)。無数の点の集まりを影付きで煙のように動かしています。
TX1では32bit、64bitとも今の所Openframeworksは実行できません。(私としてはこれがかなりショック)
※2016/12 Openframeworksがインストールできました。ディープラーニングと合体させたらすごいことになりそう。
以下このボードの要、Caffeのインストール方法等を紹介します。まだNIVIDAホームページにも載ってませんので、かなり苦労しました(完了してみると大したことありませんが)。この時点で本体のeMMCは50%を超えてしまうので、SDカードへのインストールをお勧めします。開発ボードにはSATAコネクタも付いているので、余っているHDDなどがあれば、これにインストールしてもOKです。
TX1のGPUクロックレートを変更する方法が
に載っています。ここでは84480000Hzに変更していますが、他の記事を見るともう少し早くできます。つまり起動時の4倍になります。ただしこれを実行すると、画面の反応が相当もたつき出すので、画像を表示するソフトにはお勧めできません。(caffe,torch7等は問題無し。確実にスピード向上を実感できる)
※現時点(2016/11)ではJetpack2.3となり、video0の問題や画面のもたつきが解消された上に、動作スピードも大きく改善されています。この種のボードとしては、お世辞抜きで、最強になっていますので興味のある方は 、次の記事もどうぞ。
※Intel Joule も確認してみました。ディープラーニングではTX1に完全に軍配が上がりますが、Ubuntuの使用勝手及びCPU性能はこちらの方が上でした。
Caffeのインストール
今の所、本家のソースをダウンロードするのが無難です。NIVIDAで公開している32bit版のインストール方法
ではうまくいきません。(makeではなくmake all で一応コンパイル可能。またCUDA、cuDNNインストール部分は無視(この記事ではcuDNN32bit版をインストールしているため))。この記事の中のスピードTESTはかなり早く実行できるのですが、mnistなどの実行がfloat16ではできない。runtestもエラーが出て止まる。つまりかなり不安定=営業用でしょうね)これが実行できれば浮動小数点の精度を落としていてTX1ではスピード的にかなり有利なので、もう少し待つ必要がありそうです。しょうがないので、
sudo apt-get install git
git clone https://github.com/BVLC/caffe.git
ダウンロードしたcaffeディレクトリに入ってMakefile.config.exampleをMakefile.config に変更して、
#USE_CUDNN :=1 の行を
USE_CUDNN :=1 コメントを外す
# CUSTOM_CXX := g++ の行を
CUSTOM_CXX := g++-4.8
に変更しました。この後
make all -j4
でインストール開始。この設定でCUDA+cuDNNを使った最速モードでCaffeがインストールされます。
コンパイルは、途中でNVCCを使ってることが確認できます。これは、GPUを最大限使ったコードを生成するコンパイルということを意味します。逆にNVCCが全く表示されなかったら設定がおかしいということです。MAKE中はワーニングは全く出ませんでした。このコンパイルも結構時間がかかります(20分程度)。うまくコンパイルできたら、make test -j3 make runtest でセルフテストが始まります。
セルフテストがかなり長いので、初めの10分程度テスト状態が正常に動いているか確認した後は、ほったらかしにしておくのが最善。ビルドに失敗していたり、GPUがメモリーオーバーの場合、この間に大概errorが出て止まります。一部記事には数分なんて書いてありますが、何せ2000回程度のテストをランダムで行いますので、TX1ではものすごく長~い。テスト内容とテスト回数は乱数で決めてるので、運が良ければ早く終了するかもしれません。(セルフテストの実行時間はCPUスピードに比例するようです。Macで試してみたら、半分程度の時間で終了しました。)
異常なければ、以下の様に涙の終了みたいなメッセージが出て終了。
エラーがなければすべての操作は正常に実行できることを意味しているようです。ただし、Caffe実行中GPUのメモリオーバーとなった場合は例外。こんな時はXwindow画面を低解像度に変更したりして、なるべくGPUの負担を軽減してやれば上手く行く様です。CaffeのGPUメモリは4Gを想定しているそうですが、TX1はCPU・GPUメモリが共用で4Gらしいので、Caffeのexampleを実行する限りGPUのメモリオーバーエラーにはなりません。
Python用のCaffeライブラリインストール
画面を操作する等、複雑な処理を行う場合は、スクリプト言語としてPythonを標準で使用する様です。(mnistなどで学習の確認などを行う場合は必要なし)
sudo apt-get purge python-pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
(sudo apt-get install python-pipだと後からエラーが出る)
for req in $(cat requirements.txt); do sudo pip install $req; done
(caffe/pythonフォルダ上で実行)
sudo apt-get install python-dev python-numpy python-skimage
cd ..
make pycaffe
終了後 .bashrcにexport PYTHONPATH=~/caffe/python/:$PYTHONPATH として環境変数を設定する必要あり。(~/caffe部分は自分の環境による)
この辺りで再起動して、python 上で import caffe を入力してエラーが起きなければ構築完了。
Caffe付属の例題
面白かったのは web-demoです。これは、実際の学習済みデータを使ったものですが、実行方法は
github.com
に書いてあります。最後のapp.py -hを app.py -g に変更すると、GPUを使った最速モードになります。事前に sudo pip install flask でflaskライブラリをインストールする必要があります。
TX1がサーバーになり、他のコンピューターのweb上でtegra-ubuntu.local:5000と入力すると、手持ちの写真をTX1が勉強した成果を教えてくれます。ちなみに今回の64bit版インストール以前に実行した32bit版では、GPU指定なしで認識に4.73秒。(ちゃんとプードルと答えている。すごおおーい)
GPUをONすると0.422秒!!. 確かNIVIDA推奨のFP16caffeのGPUクロック最速だったと思います。
これが、今回の64bit、GPU84480000Hzだとなんと0.207秒!!!!!!!!!。左下の数値に注目。
この数値の凄さというのは、私のMac(Core i7 3.4Ghz)は、TX1のCPUスピードと比較すると約3倍(Pythonの簡単なテストで比較)高速であるため、仮にMacのCPUのみでこの写真を認識させたとした場合、1.6秒必要となり、そうなると7.7倍高速ということです。
MacでCUDA+cuDNNを稼働させた場合は、TX1の3倍以上早くなるでしょうが、この大きさでこのスピードであれば、現状文句を言う人はいないのではないでしょうか。(この記事を書いた20日後にMacにcuDNNをONにしたCaffeをインストールして確認すると、CPUモードで0.271秒、GPUオプション有りで0.161秒でした。CPUモードが異常に早くなっています。MacのCPUモードでweb-testを実行させたところ、タイミングによってGPUメモリーオーバーエラーが出ます。ということは、Mac版ではCPUモードでも何らかのルーチンでGPUを使っている可能性があります。でもTX1のGPUってかなり効率が良いんですね=Mac-->0.161秒,TX1-->0.207秒GPUコア数は私のMacの1/4。)
ちなみにTX1でSimpleCVもインストールできましたので、前にEdison用に作った顔認識のソースを動かしてみたら、
こんな感じでした。これはTX1から顔認識画像をMJPEG配信しているところです。Pythonで実行していることを考えるとスピード的には十分(当然ですがEdisonとは比べ物にならない)です。(先に書きましたがプログラムソース中のビデオディバイス番号は1にすること。USBにwevCAMERAを接続すると ls /dev の実行で、最後の方にvideo1が表示されます。くれぐれも0にしないこと!!)
OpenCVのcやgpuサンプルでWebCameraを利用するプログラムを実行してみましたが、全てもっさりした動きでした(バイナリなのにSimpleCVとほとんど変わらない!!)。特にgpu版の顔認識サンプルcascadeclassfier_gpuは白黒表示にもかかわらず、感覚ではSimpleCV(今回試したWeb経由画像表示320x180ドット-->ディスプレイダイレクトではない!!)に明らかに負けています。ディスプレイへの表示部分がもたつくようですが、原因は今のところ不明。
もしTX1をロボットなどに組み込んで画像を確認するとすれば、テザリングをONにしたiPhone等を利用することになると思うので、当面SimpleCVで十分というところでしょうか。
以前SimpleCVの動画を少しの工夫でflaskで配信した経験があるので、web-testとSimpleCVを組み合わせれば、Pythonでも動画の認識が簡単にできそうです。しかも0.5秒以内で。面白そうですね。その前にCaffeの本格的な勉強が必要ですけど。
Pythonのライブラリではcv2、SimpleCVでカメラが使えますが、なぜかこちらもSimpleCVの方が表示スピードが速いような気がします。
Jetpackについて現状では、入出力ディバイスの反応について色々不満もありますが、頻繁にバージョンアップされているので、今後が非常に楽しみです。
※この記事以降Jetpackは2.3にバージョンアップされ、画面のもたつき、Cameraの動作についての不満は解消されました。さらにCPU、GPUについてもなぜかスピードがかなり改善されて、上記web-testもなんと倍くらい早くなっています。
次回はTX1にtorch7をインストールして、早稲田大学で開発した白黒写真のカラー化ソフトを実行させてみます。50年以上前の写真に感激しました。
MacでLinuxが動いても、MacファンとすればOSXでCaffeを動かしてTX1と連携させたいですよね。Mac OSX10.11.5にcuDNNを有効にした高速Caffeのインストールに成功しました。やはりすごく早かった...。
では、また。