2016年4月10日日曜日

Jetson TK1に外部SDをmount

さて、一通り設定が終わり、chainerもかなり苦労しましたが無事インストールできました。(Jetson TK1にはcuDNNが入っていると聞いていたんですが、chainerインストール時に、なぜかcコンパイラが動き出し(CUDAを使えるとインストーラが自動的に認識し、再ビルドしだしたのか?)、"cudnn.hがない”と散々怒られました。ただ、このインストーラが素晴らしく、それでも何とかpyCudaは使えるようにしてくれたようです。
後で調べたら、TK1だとcuda-6.5くらいまでが無難にインストールできて(自分もそうしましたが)、cudnnはcuda-7.0からだそうです。(最新は7.5ですが、それがインストールできたら、一度chainerを pip uninstall chainer して再度入れ直さないとダメだそうです。

1. cudaの威力を確認する
何か時間のかかるもので、威力を確認したくなります。調べていたら、chainer-goghというのが面白そうです。詳細は省きますが、元イメージ + スタイルイメージ = 合成イメージ を作ってくれます。何でこれがDeepLearningなのかよくわかりませんが、caffeの出来合いのモデルを使うそうです。
まず、MacBookProで試してみると、2時間ちょっとかかりました。(下手な古いPC使うと、1日くらいかかるらしいです)
さて、Jeton TK1ですが30分で処理が終わりました。(他のブログにも記事があり、そちらでも30分くらいなので、設定はうまくいっているのでしょう)
速いといえば、速いのですが意外にMacBookProが早くてびっくりです。(こいつのビデオチップはintel内蔵を使っていますので、OpenCVはできてもCUDAは動きません)

2. 外部SDを使えるようにする
Jetson TK1の内蔵SDは16GBしかなく、しかもubuntuのOSやらcudaの設定で5GB以上使ってしまいます。このままchainerを試すそうとしても、すぐにSDが一杯になるのは目に見えてます。
そこで外部SDをつけて、ファイルシステムとして使えるようにしました。

(1)ext4でフォーマットする
基本、SDカードの初期状態はwindowsで使うことを考えてvfatです。しかしそれでは都合が悪いので、ext4でフォーマットします。

$ sudo cfdisk (デバイス名)  # これでまずvfatのパーティションを削除します

デバイズ名は自分の場合は、/dev/mmcblk1でした。(内蔵SDが/dev/mmcblk0でした)調べる一番簡単な方法は、Jetsonを起動しておいて、SDをさすと自動的にマウントされます。そこで、df -h してみるなり、dmesg | tail なりすればわかります。
次にフォーマットです。

$ sudo mkfs.ext4 (デバイス名)-L (ラベル名)

最後の「ラベル名」は必須ではありませんが、つけておくとfstabを書くのが楽になります。

(2)SDカードをマウントする
さてここで/etc/fstab の設定になるのですが、なぜか自分のJetsonでは中身が空っぽです。これどうやって、内蔵SDのマウントしてるんだ?しかもコメントとして、"UNCONFIGURED FSTAB FOT BASE SYSTEM"と書いてあるし不安になってきました。とりあえず調べた通り以下の設定を追加しました。

LABEL=(ラベル名) (マウントポイント) ext4 defaults 2 0

ためしに、sudo mount -a で問題なくマウントできることを確認します。

(3)Jetsonを再起動して自動的にマウントされるかを確認する
自分の場合、ここまでくるのに随分失敗しました。試行錯誤して、これまでのコマンドを何度もやり直しましたし、(2)のmountコマンドでうまくいくのに、起動時はダメとか大変でした。そんなときは起動時にエラーを出力してきますので、メッセージしたがいとりあえずSkipして、dmesg等で何が悪いのかを調べます。
とりあえず、自分の場合はこれでうまくいくようになりました。

64GBのSDをつけましたので、ちょっと大きなものも試せそうです。(本気でやるなら、SATAのI/Fもっているので、そちらに繋いだ方がいいでしょう。)

2016年4月6日水曜日

Jetson TK1購入

さて、早速Jetson TK1が家に来ました。(なんかよくわからないけど、2月末に商社が偶然ある程度の数量を入手できたみたいで、まだ在庫がありました)



(机の上キーボード、マウスが散らかってますが、そのあたりは気にしないように)
ここからが、苦難の道の始まりです。ネットで色々設定方法を調べたのですが、どれも変わっており、どうしたらいいのか全然わからなくなりました。大きな問題が2つ。ホストPCとして、Ubuntu14のマシンが必要なのはわかっていました。(flashromに最新版のromイメージをUSB経由で書き込むのに必要)
しかし、最初にぶつかったのが以下の2つのトラブル。

①Jetsonが/etc/defaults/saneで問題があるといってきて、USBによる接続を拒否する。
 saneはスキャナーのIFらしく、どうもこれを使ってホストPCと接続しているようです。JetsonのDefaultではこれをnoにしてあり、viでyesにしてやる必要があります。(だったら、最初からyesにしておけよ!)
②romイメージの書き込み最中に、なにか127.0.,0.1:33335が開けないと怒られてとまる。
 これはだいたい想像がつきました。ホストPCはUbuntu64bitをセットアップしたばかりです。sshdがインストールしてありませんでした。単にインストールして終わり。

しかし、その後も全然設定ができません。そもそも、設定に使うtoolがぐぐったのと全然違います!進化の早いとこなので、しかたないにしても全然対応がわかりません。(どうやってもうまく行きません。(T_T))

散々、ぐぐった結果やはりJetsonのLinuxはぼろぼろだとのこと。grinch版がいいとのこと。そこで、それをROMに焼くことに決定。
まずはまっさらなUbuntu、L4Tをいれます。

wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/Tegra124_Linux_R21.3.0_armhf.tbz2
wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/Tegra_Linux_Sample-Root-Filesystem_R21.3.0_armhf.tbz2

展開して、ROMに書き込みます。

tar -xvf Tegra124_Linux_R21.3.0_armhf.tbz2
(中略)
cd Linux_for_Tegra/rootfs
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R21.3.0_armhf.tbz2
cd ..
sudo ./apply_binaries.sh

このあと、Jetsonをrecovery-modeで起動して、イメージを焼きます。(一応、同封してあるダンボールの紙にボタンの説明はありました。注意しましょう。当然、英語です)

sudo ./flash.sh jetson-tk1 mmcblk0p1

これをやる前に、USBで接続されていることを、lsusbコマンドで確認。NIVIDIAが見えます。あと、本当ならdeviceとして、/dev/mmcblk0p1が見えるはずなんですが、自分の環境では見えませんでした。 ただ、一応これで書き込みはできました。 さて、ここからはJetson側で起動イメージの差し替えです。ネタは元にありますので、コマンドだけ羅列しておきます。

wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/zImage
wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/jetson-tk1-grinch-21.3.4-modules.tar.bz2
wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/jetson-tk1-grinch-21.3.4-firmware.tar.bz2
sudo tar -C /lib/modules -vxjf jetson-tk1-grinch-21.3.4-modules.tar.bz2
sudo tar -C /lib -vxjf jetson-tk1-grinch-21.3.4-firmware.tar.bz2
sudo cp zImage /boot/zImage

ちょっと不親切ですみませんが、まあこの世界はこんなもんです。
結局、最新版のライブラリはTX1用だけで、TK1にはでていないようです。その後、以下のリポジトリを登録します。

sudo apt-add-repository universe
'universe' distribution component enabled for all sources.
sudo apt-get update
sudo apt-get upgrade

何故か、g++がないので、個別にインストール。

sudo apt-get install  g++

これでやっとCUDAの開発用ライブラリをインストールできる準備ができました。(これまでのはあくまで準備作業です。おいおい、ってな感じですが先は長いです。)
さてやっと、CUDA-6.5のライブラリをインストールします。(最新は7.5ですが、7.0からARMのサポートがなくなったとのこと。TX1しか対応していない。どうするんだNVIDIA)


wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/cuda-repo-l4t-r21.3-6-5-prod_6.5-42_armhf.deb

sudo dpkg -i cuda-repo-l4t-r21.3-6-5-prod_6.5-42_armhf.deb
(中略)
sudo apt-get update
(中略)
sudo apt-get install cuda-toolkit-6-5

これで、CUDA6.5までインストールできました。あとはGPUを使えるように、自分をvideoグループに登録し、PATHを通しておきます。

sudo usermod -a -G video $USER
echo "export PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc

うまくいけば、専用コンパイラのnvccのバージョンが確認できます。

 nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Tue_Feb_17_22:42:19_CST_2015
Cuda compilation tools, release 6.5, V6.5.45

最後に、時間がUTCのままなので日本(Tokyo)にしておきましょう。

さて、Sampleを動かさないと、実感が湧きません。

cuda-install-samples-6.5.sh

このコマンドがインストールされているはずです。これでHOMEにSampleがインストールされますから、そこでmakeします。結構時間がかかりますが、無事Sampleは動きました。昔だったらなんの計算に使おうかと考えますが、今はAIですね。まずはディスクの容量がFlashの16GBしかないので、これをなんとかしないと。