Python
AWS
CUDA
DeepLearning
Ubuntu14.04

AWS(Ubuntu14.04)をDeepLearning用にセットアップする(CUDA, cuDNNをインストール)

More than 1 year has passed since last update.

1. AWSでDeepLearning用マシンを用意する

DeepLearningには、GPUを搭載したLinuxマシンが欠かせません。

しかし自分でGPUマシンを揃えるのは手間もお金もかかるので、
AWS(Amazon Web Service)で、お手軽に高性能なLinuxマシンを用意しましょう。

1.1. インスタンスの要件

インスタンス(AWS上のコンピュータ)には、以下の条件のものを採用します。

  • AMI(OS): Ubuntu14.04 64-bit
    • 通常のUbuntu
  • インスタンスタイプ: g2.2xlarge
    • GPU対応
  • ストレージ: 100GB
    • デフォルトの8GBでは不足

AMIではUbuntuの他にAmazon Linuxなどが選択できますが、
パッケージ関連でトラブルが多発するため、普通のUbuntuを使うのがおすすめです。

1.2. セキュリティグループの設定

デフォルトではSSH接続しか許可していないので、
AWS上でサーバを立ててもアクセスできません。pingも飛びません。

セキュリティグループからTCPプロトコルの8888ポートをアクセスできるように設定します。

1.3. Elastic IP の設定

AWSでは再起動のためにインスタンスの停止を行う必要がありますが、
インスタンスを停止するたびにパブリックIPが変わってしまいます。

そこでパブリックIPを固定するために、Elastic IPを登録して、インスタンスへと割り当てます。

1.4. インスタンスにSSH接続

SSHクライアントソフトTera Termをダウンロードしましょう。

インスタンスのパブリックIPに接続して、
ユーザー名「ubuntu」でインスタンス作成時にダウンロードできるキーを指定すると、
インスタンスのコンソールに入れます。

ここでUbuntuとしての操作を行います。

2. GPUを使えるようにする

ここまでで、AWS上にインスタンスを設置できました。

しかしインスタンスg2.2xlargeはGPUを搭載していますが、
デフォルトではGPUが使えるようにはなっていません。

そこで、以下のものをインストールして、GPUでDeepLearningができるようにします。

  • NVIDIAのグラフィックドライバ
  • CUDA-toolkit
  • cuDNN

2.1. ドライバのインストール

2.1.1. パッケージのアップデート

まずはパッケージ管理システムをアップデートします。
aptitudeではなくapt-getを使用しても構いません。

bash
$ sudo aptitude update
$ sudo aptitude -y full-upgrade
$ sudo aptitude install -y build-essential cmake

2.1.2. nouveauを停止

次に、グラフィックドライバを更新したいのですが、
まずはデフォルトのグラフィックドライバ(nouveau)を停止します。

以下の設定ファイルを作成したあと、

/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
/etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0

bashから停止用のコマンドを叩きます。

bash
$ sudo update-initramfs -u

ここでインスタンスを再起動します。
AWSだとrebootコマンドで再起動できないので、
AWSコンソールからインスタンスを一度停止し、再開させます。

2.1.3. グラフィックドライバのインストール

NVIDIAの公式ページからドライバをダウンロードします。

  • 製品のタイプ: GRID
  • 製品シリーズ: GRID Series
  • 製品ファミリー: GRID K520
  • オペレーティングシステム: Linux 64-bit
  • 言語: Japanese

インスタンスに直接ダウンロード先からwgetしてもいいですし、tera termなどを介してダウンロードしたドライバを送信しても構いません。

ドライバのインストールは下記のコマンドで実行します。

bash
$ sudo aptitude install -y linux-image-extra-virtual linux-source linux-headers-`uname -r`
$ wget 『ドライバ』.run
$ sudo sh 『ドライバ』.run -a --disable-nouveau

ここで再びインスタンスを再起動すると、ドライバのインストールが完了します。

2.2. CUDA-toolkitのインストール

CUDAの公式ページからcuda用のリポジトリをダウンロードします。

  • Operating System: Linux
  • Architecture: x86_64
  • Distribution: Ubuntu
  • Version: 14.04
  • Installer Type: deb(network)

ダウンロードしたリポジトリを有効にすると、aptitude(apt-get)からcudaがインストールできるようになります。

bash
$ wget 『リポジトリ』.deb
$ sudo dpkg -i 『リポジトリ』
$ sudo aptitude update
$ sudo aptitude install -y cuda
$ sudo reboot

2.3. cuDNNのインストール

2.3.1. cuDNNのダウンロード

NVIDIAのページからcuDNNをダウンロードします。
このダウンロードにはアカウント登録が必要なので、適当なアカウントを作成してください。

また、cuDNNのアーカイブファイルはwgetで直接取ってこれないので、
tera termなどを介してインスタンスに送る必要があります。

bash
$ tar -xvf 『cnDNN』.tgz
$ cd cuda
$ sudo cp include/cudnn.h /usr/local/『cuda-X.X』/include/
$ sudo cp lib64/libcudnn* /usr/local/『cuda-X.X』/lib64
$ sudo ldconfig /usr/local/cuda/lib64

ldconfigに失敗する場合は、競合するファイルを削除します。

2.3.2. 環境変数の設定

ホームに戻り、.bashrcを書き換えます。

bash
$ cd ~
$ vim .bashrc
~/.bashrc
export PATH=/usr/local/『cuda-X.X』/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/『cuda-X.X』/lib64:$LD_LIBRARY_PATH

最後に.bashrcの内容を有効にします。

bash
$ source .bashrc

2.3.3. インストール成否の確認

以下のコマンドを打ってCUDAの情報が表示されていれば、
GPU用の設定が完了できています。

bash
$ nvcc -V

3. Python関連をインストール

DeepLearningの実装には、Pythonを使います。
Pythonの数理計算用モジュールや、開発環境(jupyter notebook)を一括で入れるために、
Anacondaというディストロをインストールします。

その他に、DeepLearningライブラリのTheanoや、
画像処理用ライブラリのopenCVを使えるようにします。

3.1. Anacondaをインストール

bash
$ wget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda3-2.4.1-Linux-x86_64.sh
$ bash Anaconda3-2.4.1-Linux-x86_64.sh
$ source .bashrc

shが通らなかったのでbashコマンドを使いました。

3.2. Theanoをインストール

bash
$ sudo aptitude install git
$ pip install git+git://github.com/Theano/Theano.git --upgrade --no-deps

pipでgitを介さず直接Theanoを引っ張ってきた場合は、一部の古いモジュールでエラーを吐くことがあります。

3.3. openCVをインストール

Anacondaを使えば、openCVも1行でインストールできます。

bash
$ conda install -c https://conda.binstar.org/menpo opencv3

4. GPUの動作確認

これまでのセットアップの成否を確認するには、

gpu_check.py
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

上のPythonスクリプト(gpu_check.py)を下記のコマンドで実行してみましょう。

bash
$ THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python gpu_check.py

この実行結果が

bash
Using gpu device 0: GeForce GTX 580
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.638810873032 seconds
Result is [ 1.23178029  1.61879349  1.52278066 ...,  2.20771813  2.29967761
  1.62323296]
Used the gpu

となっていれば、TheanoがGPUで動いていることが確認できます。

5. セットアップ完了

以上で、AWSをDeepLearning用に設定することができました。

最後に、開発環境を立ち上げて、いざ人工知能を実装しましょう。

bash
$ jupyter notebook --no-browser --ip="*"

参考文献

AWSへのグラフィックドライバドライバ・CUDAのインストール:
http://qiita.com/shinya_ohtani/items/f374ed0dd51737087369

cuDNNのインストール:
http://www.computervisionbytecnalia.com/es/2016/06/deep-learning-development-setup-for-ubuntu-16-04-xenial/

cuDNNの環境変数設定:
http://qiita.com/bohemian916/items/a48e6496b04bbbf09fb3

Anacondaのインストール:
http://morimori2008.web.fc2.com/contents/PCprograming/python/pythonAnaconda.html

Theanoのインストール:
https://github.com/fchollet/keras/issues/1888

openCVのインストール:
http://hikuichi.hatenablog.com/entry/2015/12/22/124044

TheanoをGPU動作させる:
http://deeplearning.net/software/theano/tutorial/using_gpu.html