EC2のGPUインスタンスにChainerを5行で入れて4行で動かす

PFI/PFN社でオープンソース公開したディープラーニングフレームワークChainer、すで使って頂いている方、ありがとうございます。

f:id:shoheihido:20150809150103p:plain

さてそんなChainerですが、MacBookでも簡単に使い始めることはできますが、真価を発揮させるにはGPU環境が欲しいところです。また一方、GPUを積んだデスクトップPCでも(特にPyCUDAの)インストールでつまづく方がいるのも事実です。


開発側の人間としては、できれば手軽に試してもらえる環境を提供したい。そこでは、やはりAWSのEC2でGPUインスタンス使うのが一番いいと思います*1

Chainer on EC2は何名かブログ等で記事を公開されていますが、今のところ最も簡単な方法はRyosuke TajimaさんのAWSでサクッとChainerを使ってみるです。

が、やはりここでもPyCUDAをソースからのビルドしてもらうことになっています。原因は、sudo実行において多くの環境では$PATHが上書きされるため、CUDAのインストールディレクトリにPATHが通らずPyCUDAのビルドが失敗することにあります。

これは、最近公式ドキュメントのTipsにも加えられたように、ユーザーのホームディレクトリ以下にインストールするオプションをpipにつけるか、$PATHをsudo環境に明示的に渡すことで回避できます。

そこでこの記事では、最短でEC2にChainer環境を用意する様子をお見せしたいと思います。

まず、Tajimaさんと同様にこちらの記事を参考に、NVIDIAが公開しているCUDA環境入りGPUインスタンスAmazon Linuxベース)をAWS Marketplaceから探して立ち上げます。

f:id:shoheihido:20150809142133p:plain

インスタンスが起動したらec2-userとしてログインして、まずCUDAインストールディレクトリに関する設定を.bash_profileに追記して反映します(ここまでで3行)。

$ echo 'export PATH=/opt/nvidia/cuda/bin:$PATH' >> .bash_profile
$ echo 'export LD_LIBRARY_PATH=/opt/nvidia/cuda/lib64:$LD_LIBRARY_PATH' >> .bash_profile
$ source .bash_profile

f:id:shoheihido:20150809143350p:plain
次にchainerを--userオプション付きでインストールします(4行目)。numpyのインストールに少し時間がかかるので数分待ちます。

$ pip install --user chainer

f:id:shoheihido:20150809143429p:plain
(中略)
f:id:shoheihido:20150809143447p:plain

これで、chainer本体とnumpy、sixなどはインストールできました。CPUモードであればもう実行できますが、それは置いといて、いよいよ難関のGPU対応に移ります。
上記のように、--user付きで試してみます(5行目)。

$ pip install --user --upgrade chainer-cuda-deps

f:id:shoheihido:20150809144031p:plain
(中略:nvcc no in pathというエラーは出ていません)
f:id:shoheihido:20150809144055p:plain
(中略:ここでも少し時間がかかります)
f:id:shoheihido:20150809144119p:plain
おお!(わざとらしい)PyCUDA含めてインストールに成功したようです。

では本当に動くのかどうか、MNISTサンプルを実行してみましょう(3行消費)。Githubから最新リリースのSource code (tar.gz)をダウンロードします。以下では執筆時点(2015/08/09)の最新版・Chainer v1.1.2を利用していますが、バージョン番号は読み替えてください。

$ wget https://github.com/pfnet/chainer/archive/v1.1.2.tar.gz
$ tar zxvf v1.1.2.tar.gz
$ cd chainer-1.1.2/examples/mnist/

f:id:shoheihido:20150809144506p:plain
(中略)
f:id:shoheihido:20150809144702p:plain
ではGPU実行オプションを付けて動かします(ラスト1行)。

$ python train_mnist.py --gpu 0

f:id:shoheihido:20150809144854p:plain
(中略:MNISTデータセットの変換に少し時間がかかります)
f:id:shoheihido:20150809145512p:plain
無事にMNISTサンプルの実行が完了し、精度も出ているようです(約98.5%)

まとめると、EC2のNVIDIA製AMIをGPUインスタンスで使えば、以下の5行+4行を実行することで、ChainerのGPU利用が可能な環境がどなたでも手に入ります。時間にすると、インスタンス立ち上げから10-15分程度でここまでたどり着けると思います。

$ echo 'export PATH=/opt/nvidia/cuda/bin:$PATH' >> .bash_profile
$ echo 'export LD_LIBRARY_PATH=/opt/nvidia/cuda/lib64:$LD_LIBRARY_PATH' >> .bash_profile
$ source .bash_profile
$ pip install --user chainer
$ pip install --user --upgrade chainer-cuda-deps
---
$ wget https://github.com/pfnet/chainer/archive/v1.1.2.tar.gz
$ tar zxvf v1.1.2.tar.gz
$ cd chainer-1.1.2/examples/mnist/
$ python train_mnist.py --gpu 0

これを皮切りにして、ぜひご自分の研究や仕事や趣味でChainerをご活用下さい。

それでは、Have a happy Chainer life!

※ 念のため、上記NVIDIA製AMIは無料ですが、EC2インスタンスの利用には別途料金がかかります。自己責任でお願いします。

*1:「公式のAMI公開すればいいのでは」という声もありそうですが、2週間ごとにバージョンアップする現状ではメンテが難しいという事情もあります