本文書ではAWSのGPU計算サーバ(GPUインスタンス)上でTheanoを使用する方法を説明します. Theano入門 で紹介したプログラムをCPUとGPUで実行し, その計算速度を比較します.
Contents
本文書では, GPU上での数値計算をGPU計算と呼ぶこととします. GPU計算の科学技術計算への応用は一般的になりつつあります. しかし, 個人で利用するためにはまだ敷居が高いように思われます. その理由の一つがハードウェアの問題です. 個人で使用するマシンは通常GPUを一つしか持たないため, GPUを計算のために占有させると, 画面表示に問題が起こる場合があります. そこで, 本文書ではクラウドサービスの一つであるAmazon Web Service (AWS)を利用してGPU計算を行う具体的な手順を説明します.
AWSは様々なサービスを提供します. その中の一つであるElastic Compute Cloud (EC2)はデータストレージサーバ, ウェブサーバといった各種の専用サーバを提供します. EC2が提供するサーバの一つに, 最新のGPUを載せたものがあります. これはゲームやグラフィック処理などGPU本来の目的に使用されるのですが, GPU計算サーバとして使用する事もできます.
本文書の説明で用いるGPU計算サーバのCPUとGPUは以下の通りです:
単純な演算性能では10倍以上の差があります.
EC2上のGPU計算サーバを使ってTheanoを実行するために覚える必要があるのは, AWSそのものの利用方法だけです. これはAWSとTheanoの以下のような特徴のためです
AWS上でのGPUの利用を検討されている方にとって, 本文書がその足掛かりになれば幸いです.
AWS (EC2)ではサーバの使用時間によって課金されます. 金額はサーバの種類によって異なります (参考: 料金表). 本文書の例で用いるサーバの使用料金は1時間あたり1ドル未満でした. 本文書で紹介する手順をスムーズに進めれば, 1時間以内で作業が終わります. もし本文書の作業手順を実際に試される場合, 事前に説明を通読することをお勧めします.
以下で作業手順の概要を説明します. 同時にAWSで用いられるいくつかの用語(太字)を説明します.
GPU計算サーバを起動してから停止するまで(上記の手順5.から9.まで)の間は利用時間に応じて料金が発生するのでご注意ください.
ここでは各作業を具体的に説明します.
クレジットカードと電話を準備して, ここの説明 の通りに作業を行います. 「AWSサポートプランの選択」ではどのプランを選択しても構いません. ここではBasicを選択します.
この先, 手順5.から8.まではGPU計算サーバに接続されたターミナル上で作業を行います.
[ec2-user@ip-172-31-5-86 ~]$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Wed_Jul_17_18:36:13_PDT_2013
Cuda compilation tools, release 5.5, V5.5.0
[ec2-user@ip-172-31-5-86 ~]$ which nvcc
/opt/nvidia/cuda/bin/nvcc
echo "export PATH=/opt/nvidia/cuda/bin:\$PATH" >> .bashrc
echo "export LD_LIBRARY_PATH=/opt/nvidia/cuda/lib64:\$LD_LIBRARY_PATH" >> .bashrc
[ec2-user@ip-172-31-5-86 ~]$ wget http://09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com/Anaconda-2.0.1-Linux-x86_64.sh
--2014-07-10 13:18:09-- http://09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com/Anaconda-2.0.1-Linux-x86_64.sh
09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com (09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com) をDNSに問いあわせています... 23.61.249.40, 23.61.249.64, 2600:140e:1::17c9:660a, ...
09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com (09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com)|23.61.249.40|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 343791922 (328M) [application/x-sh]
`Anaconda-2.0.1-Linux-x86_64.sh' に保存中
100%[=============================================================================>] 343,791,922 9.02MB/s 時間 43s
2014-07-10 13:18:53 (7.61 MB/s) - `Anaconda-2.0.1-Linux-x86_64.sh' へ保存完了 [343791922/343791922]
AnacondaにはTheanoと関連するモジュールが含まれています.
[ec2-user@ip-172-31-5-86 ~]$ bash Anaconda-2.0.1-Linux-x86_64.sh
インストーラ実行中にパスを.bashrcファイルに追加するかどうか聞かれるので, Yesを選択します.
[ec2-user@ip-172-31-5-86 ~]$ source .bashrc
sudo yum install git
続いてPythonのpipコマンドを用いてGithubに置いてあるTheanoをインストールします:
pip install --upgrade git+git://github.com/Theano/Theano.git
[ec2-user@ip-172-31-5-86 ~]$ echo '[global]
floatX = float32
device = gpu0
[nvcc]
fastmath = True' > .theanorc
このファイルの設定は, Pythonの処理系がTheanoのモジュールを読み込んだときに反映されます.
[ec2-user@ip-172-31-5-86 ~]$ wget http://deeplearning.net/data/mnist/mnist.pkl.gz
taku-y$ scp -i /Users/taku-y/aws/my-key-tokyo.pem bbrbm.py gbrbm.py test_rbms.py ec2-user@54.92.45.32:~/
“wget”コマンドを使って, 直接ホームページからプログラムをダウンロードしても構いません.
>>> import test_rbms
>>> test_rbms.train_bbrbm(0, 100, n_components=512)
RBMの学習が開始され, 終了後ファイルが保存されます. このファイルには, 学習されたRBMのモデルパラメータだけでなく, 実行時間も記録されています.
taku-y$ scp -i /Users/taku-y/aws/my-key-tokyo.pem ec2-user@54.92.45.32:~/*.pklz ./
GPUを使って計算したことを示すため, コピーしたファイル名(手順7.4)の末尾を.pklz.gpuと変更します.
プログラム plot_result.py を用いて経過時間を表示します. プログラムと同じディレクトリにCPU/GPUによる計算結果が保存されており, それらのファイル名の末尾がそれぞれ”.pklz.cpu”と”.pklz.gpu”であるとします. plot_result.plot_time_bbrbm()を実行すると, 次のような図が表示されます:
上の図が横軸を実計算時間, 縦軸を復元誤差とした学習曲線です. 横軸のスケール以外は同一のグラフとなります. 総計算時間を比較したのが下の図です. GPUによって, CPUと比べて計算速度が約14倍高速である事が分かります.
本文書ではAWSのGPU計算サーバを用いてGPU計算を実行する具体的な手順を説明しました. 例として, Theanoを用いてRBMの学習を実行しました. GPUにより, 現時点の標準的なCPUと比べて14倍の計算速度が得られました. GPU計算サーバの利用を意図して作成されたAMIを用いる事で, GPUのドライバやCUDAコンパイラのインストールといった作業を行う必要がありませんでした. また, Theanoを用いる事で, GPUのためにソースコードを書き換える必要がありませんでした.
私は今回初めてAWSを利用しました. AWS上でGPU計算を行うため, ネット上の様々な記事を参考にさせて頂きました. 最初は何から手をつければ良いか分からなかったのですが, こうしてまとめてみると, 作業量そのものは少ないことが分かります. 実際の作業を行う前は, インスタンスとAMIの概念と具体的な計算サーバへの接続方法に関する情報が見つけにくかったのですが, 本文書により, これらの問題が少しでも緩和されれば幸いです.
本格的にGPU計算を行う場合は自分で専用ハードウェアを購入するのが良いと思います. しかし, システムの消費電力や最新ドライバへの対応などの維持費を考えると, AWSを利用するという選択肢もあると思います. 個人的には, AWS以外にもこのような計算に特化したクラウドサービスが表れ, 競争を通して品質やユーザの利便性が向上することを期待します.