Jetson TK1でchainerを使う

##1.モニター、キーボード接続
(HDMIのみ対応)

##2.電源を入れる

##3.キーボードを日本語に設定
```
sudo dpkg-reconfigure keyboard-configuration
```


##4.初期設定
ubuntu画面から
ログイン
インストーラの実行

```
cd ~/NVIDIA-INSTALLER
sudo ./installer.sh
sudo reboot
```

再起動すると、GUIのubuntuが使えるようになります。


##5.母体環境(Ubuntu14.04)の構築
Jetson TK1の開発キットのインストールはUbuntu14.04からしかできないようなので、Virtual BoxにUbuntu14.04をインストール

Virtual boxでUSBが使えるようにextension packの導入
https://www.virtualbox.org/wiki/Downloads

画面の解像度を大きくしたい場合は以下を参照
http://mogi2fruits.net/blog/os-software/windows/2389/


##6.母体UbuntuからTk1を認識させる
MacとTK1をUSBケーブルで接続、フォースリカバリボタンを押しながらリセットボタンを押します。
真っ暗な画面になればリカバリーモードで起動できています。
この状態で、Virtual boxの　設定→Port→USB　から
右のUSB追加アインコンをクリックして「NVIDIA Corp.〜」の文字が出て来ればMacから認識できています。
（この時、「NVIDIA Corp.〜」を一度クリックしてチェックされた状態じゃないと、host Ubuntuからは見えていないので注意）

##7.Jetpack for L4Tのダウンロード

https://developer.nvidia.com/embedded/jetpack

##8.実行権限を付与
なお、日本語のディレクトリ内では実行に失敗するようですので、
英語ディレクトリを作ってファイルを移動するか実行権限を付与します。
```
chmod +x jetpack-${VERSION}.run
```

##9.実行

ダウンロードしたJetpackを実行します。

途中でNetwork Layoutを聞かれますが、
「Device accessinternet via router/switch」の方で普通にいけました。
(PCのネットワーク環境に合わせる必要があります。)

Flashingが終わると、Jetsonが再起動されて、通常の画面が表示されます。

母体のほうでInput device informationの画面が表示されるので、
JetsonのIPを設定します。
(arp-scanとか使って接続しているIPを特定します。)
```
sudo arp-scan -I xxxx -l
```
よしなに進めていくとL4Tのセットアップが終わります。
（Jetsonの画面にGUIが表示されたら終了。）


##10.ssh用にJetsonに固定IPをセット

/etc/network/interfacesに以下を追記

```
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
gateway 192.168.xxx.xxx
dns-nameservers 192.168.xxx.xxx
```
再読み込み
```
sudo /etc/init.d/networking restart
```
これで固定IPに出来ました。


##11.gitインストール
以下から入れてください
https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

##12.Python環境構築
pyenvのインストール
```
git clone https://github.com/yyuu/pyenv ~/.pyenv
```

依存ライブラリのインストール
```
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev
sudo apt-get install -y libreadline-dev libsqlite3-dev wget curl llvm
```


.bash_profileや.zshenvなどにパスを通します
```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

ついでに、CUDAのパスも通しておきます。
（TX1とかだとcuda-7.0になるはず）
```
export PATH=/usr/local/cuda-6.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib64:$LD_LIBRARY_PATH
```


pythonのインストール
```
pyenv install 2.7.12
```

適当なディレクトリを作り、そこに移動して仕様するpythonを設定
```
pyenv local 2.7.12
```

バージョン確認で2.7.12がでてればOK
```
python -V
```

関連ライブラリのインストール
```
pip install --upgrade pip
pip install numpy
sudo apt-get install libatlas-base-dev gfortran
pip install scipy
pip install matplotlib
pip install scikit-learn
pip install pillow
```


##13.chainerインストール
```
sudo apt-get install python-dev python-virtualenv
pip install cython
sudo apt-get install libhdf5-dev
pip install chainer
```

サンプルコードをダウンロード
https://github.com/mattya/chainer-gogh

chainer-goghのディレクトリに行って、実行
```
python chainer-gogh.py -m nin -i input.png -s style.png -o output_dir -g 0
```

ninモデルは正常にうまくいくようでした、 i2vとかはなんかkilledがでるので要調査。

なお、実行時に
```
modprobe: FATAL: Module nvidia not found.
```
みたいなエラーがでるので、出したくない場合は以下を参照。
http://qiita.com/suisuina/items/e1ce1d9805f4d8772594



##補足

swap状態の確認
```
sudo cat /proc/swaps
```

swap作成
（USBなどでswapする場合は、sudo fdisk -l でUSBのパスを確認して、以下/var/swap/ の部分を置き換える）
```
sudo mkdir /var/swap/
sudo dd if=/dev/zero of=/var/swap/swap0 bs=2M count=2048
sudo chmod 600 /var/swap/swap0
```

スワップファイルをスワップに割り当て
```
sudo mkswap /var/swap/swap0
sudo swapon /var/swap/swap0
```

起動時にスワップファイルとして設定されるようにする
```
 sudo vi /etc/fstab
```
以下を追加
/var/swap/swap0 swap swap defaults 0 0

スワップ解除
```
sudo swapoff -a
```

ユーザーをrootに変更
```
sudo su -
```

シャットダウン
```
sudo shutdown -h now
```
再起動
```
sudo shutdown -r now
```

システムレイアウト
![system_layout.jpg](https://qiita-image-store.s3.amazonaws.com/0/66003/ed660d0e-393e-3449-a19b-76fad11d0d4f.jpeg)



i2vを使う際のエラーについてはメモリをswapしたところ、「MemoryError」になって実行されない模様。
多分32bitなので上限4Gでやられているのかと。。



参考
http://qiita.com/ktyubeshi/items/847b05b7879e2f45da54

http://developer.download.nvidia.com/embedded/jetson/TK1/docs/2_GetStart/Jeston_TK1_QuickStartGuide.pdf#nameddest=Introduction

http://qiita.com/0x0c@github/items/bc2683b00617981e4468

http://vboxmania.net/content/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%91%E3%83%83%E3%82%AF%E3%81%AE%E5%B0%8E%E5%85%A5

http://mogi2fruits.net/blog/os-software/windows/2389/

USBフォーマット
http://qiita.com/suisuina/items/690feac29bbfeec2da64
swap
http://qiita.com/scleen_x_x/items/f3fc492bcbf0f6c2896c