こんにちは、海行です。

今回はJetson TK1のセットアップをして、GPUのCUDAのパワーを活かしてchainer-goghを走らせてみます。
(こいついつもセットアップしてんな)

CeM-zUlUEAEurzj

経緯


この前の記事でラズパイゼロにchainerを入れて走らせてみましたが、ラズパイの1GHzシングルコアのCPUでは色々とキビしい物がありました。

あのあと、ラズパイゼロでchainer-goghを走らせてみましたが、まず普通に走らせたらメモリ不足で落ちました。
そこで出力サイズを128ピクセル四方で指定して、動作が軽いninモデルを用いることで何とか実行させることができました。
しかし、丸一日かけても1000イテレーションしか進みません。
5000イテレーションで終了ですから、一枚の画像を処理するのに5日もかかってしまいます。

ちなみにLinux Mintを入れたVAIO typePでも走らせてみました。
こちらはリサイズ無しでchainer-goghが実行できましたが、丸一日かけて400イテレーションほどしか進みません。
一枚の処理に2週間弱かかってしまいますね。

勿論メインのデスクトップPCのGTX660を使えばGPUを使って一枚6分で処理できるわけですが、電力消費が大きくなってしまいますし、デスクトップPCを起動しっぱなしにするのは何となくイヤです。

ラズパイがここまで処理に時間がかかってしまうのは、NVIDIAのGPUを積んでないのでChainerのCUDAを使ったGPU実行ができないからです。
そうとわかれば、ラズパイ的な開発ボードにNVIDIAのGPUが積まれたシロモノであるJetson TK1に着目することになります。

参考リンク:
Tegra K1搭載の開発キット「Jetson TK1」を動かしてみた
NVIDIA Tegra K1搭載開発キット「Jetson TK1」ハンズオンセッションに参加してみた

そういう事をツイートしてたら、ザバさんからJetson TK1を貸していただけました!
ザバさんありがとうございます!

というわけなので取りあえずセットアップです。

セットアップ


先行事例の記事が上がっていますので、ありがたくそちらを参考にしつつ、NVIDIAの説明書に従って作業していきます。

参考リンク:
Jetson TK1事始め
Jetson TK1 をセットアップしてみた

とりあえずTK1を起動します。
すぐにsshに繋がるらしいですが、IPアドレスもホスト名も最初はわからないので、やはり例によって液晶ディスプレイ、USBハブ、USBキーボード、USBマウスを接続します。LANケーブルも刺しておきました。

付属のACアダプタを繋ぐと起動します。
早速GPUファンがうなってます。

内部ストレージのUbuntuがブートしてCUIが立ち上がります。
Linux Driver Binaryという物をインストールします。

しばらくするとインストールが終わって再起動されます。

再起動後はGUIの普通のUbuntuが普通に立ち上がります。
もうSSHでリモートログインする事もできます。
まあこれだけですでにGPUだけ異様にすごいUbuntuマシンになってますが、色々更新したりCUDAの開発環境を入れたいので、JetPack TK1という物を導入します。TK1と別のPC上でJetPackのインストーラを立ち上げてそこからUSBで繋いだTK1に書き込む形になるのですが、このJetPackがなんとUbuntu14.0.4しか対応してないという話なのです。

私のメインPCはWindows10なので、しょうがないのでVirtualBoxを使ってUbuntu14.0.4を仮想マシンとしてWindows上で実行しました。

参考リンク:
Windows の VirtualBox に Ubuntu 13.04をインストールしてみた
VirtualBoxをWindowsにインストール
VirtualBox を全画面(フルスクリーン)で表示する方法

注意点としては、JetPackの実行時に色々ダウンロードされるので仮想マシンのHDDサイズが少ないと失敗する可能性があるので、HDD容量は余裕をもって確保する必要があります。
20GBもあれば十分だと思いますが、私は50GBにしました。

また、USB接続を仮想マシンに認識させるためにUSBフィルターが必要なので、VirtualBoxにエクステンションパックも導入する必要があります。

参考リンク:
エクステンションパックの導入

さて、仮想マシンや実機などでUbuntuを起動したら、JetPack TK1をダウンロードして実行します。
TK1とPCを付属のUSBケーブルで接続します。
(この時ちょっとハマッたんですが、パスに日本語が含まれてるフォルダ上で実行すると失敗するのでjetpack~.runをhomeフォルダなどに移動してから実行してください)

JetPackに実行権限を付与します。
UbuntuではCtrl+Alt+Tでターミナルが起動します。

ファイルブラウザからダブルクリックして実行するとインストールが開始されます。

インストール途中で、TK1をリカバリモードにしてくださいという指示が出ます。
TK1には3つのボタンが付いてますが、フォースリカバリボタンを押しながらリセットボタンを押す(リセットボタンを押してから2秒くらいでフォースリカバリボタンは離してOK)とTK1がリカバリモードで起動します。
TK1の画面は真っ黒なままになりますが、これがリカバリモードです。

ホスト側のUbuntuでリカバリモードのTK1が認識されてるかどうかlsusbコマンドで確認してください。
「NVIDIA Corp.」という名前のUSBデバイスがあればOKです。
VirtualBoxを使ってる場合はこのUSBデバイスのUSBフィルターを追加しておいてください。

あとは最後まで順調にインストールが進みました。

TK1側でインストールされたサンプルを実行してみます。

エラーが出ないでデバイス情報が表示されればインストール成功です。

他にも色々なサンプルが入ってるので、試してみてください。
SmokeParticlesというサンプルを実行するとこんな感じです。
CeSGmfvUYAEHknu

GPUならではの表現って感じですね。

Chainer-goghの実行


セットアップも終わったので当初の目的だったCUDAによるchainer-goghの実行をやってみます。

この時点でCUDAやcudnnはインストールされてるので、

これでchainerのインストール完了です。

chainer-goghをクローンしてきてninモデルで実行してみます。

im_04950

35分ほどで実行完了しました!
これはいいですね!GTX660の6分に比べれば遅いですが、VAIO typePの2週間と比べれば圧倒的速度です。
これが電力消費5W以下で出来てしまうならエネルギー効率も悪くないのではないでしょうか。

しかし、ninモデルの実行には成功しましたが、vggやi2vモデルで実行すると、途中で「killed」と表示されて失敗してしまいます。
killedという事はメモリ不足でプロセスキルされたという事です。
確認してみるとTK1はデフォルトではスワップが無いので、スワップファイルを作って仮想メモリを確保してみます。

参考リンク:
Ubuntu でスワップファイルを追加する方法

とりあえず2GBのスワップを作ってみました。
これによりi2vモデルでの実行は可能となりましたが、vggモデルでは今度は「Memory error」が表示されて失敗です。

スワップが2GBでは足りなかったのかな?と思い4GBにしてみました。(内蔵ストレージは16GBなのであまりスワップを大きくするとディスクサイズが足りなくなります)
しかし結局「Memory error」です。動きを追ってみると物理メモリの2GBを使い潰した時点でエラーが発生してるみたいです。
物理メモリとスワップにまたがってメモリ確保できないのでしょうか?
あるいはVRAMのメモリ不足?

chainer-goghの実装を把握してるわけではないのでこれ以上考えても仕方ないです。
今回は深追いしないでおきます。

Jetson TK1の性能が素晴らしいという結論は変わりません。

まとめと展望


Jetson TK1は実用的速度と低消費電力(測ってないですがカタログスペックを鵜呑みにするなら)で動作する素晴らしいディープラーニング用マシンである事が検証できました。
ザバさんは使い倒してくれて構わないとおっしゃってくださったので遠慮なく色々やっていきたいと思います。

ひとまずは自動的にchainer-goghで画像を量産してアップロードしまくる仕組みを作って、勝手に色々描いてくれるマシンにしてみたいですね。

Jetson TK1の後継機であるJetson TX1ももうすぐ発売されます。

参考リンク:
カードサイズで1テラFLOPSな高速ボードコンピュータJetson TX1の日本発売が決定、開発キットは税込約9万8000円

消費電力は2倍、GPU性能は3倍以上になるらしいですが、価格も3倍以上という…
遊びで買える価格じゃないですね…本格的な使い道が思いついたら導入も検討してみたいです。

私はとにかく電気代の安さに着目したわけですが、こういう小さいコンピュータがこういった性能を発揮していく事で世の中をどのように変える事ができるのかという事についても色々想像してみたいですね。