読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

Ubuntu 14.04.3 LTS に Chainer をインストールする

Deep learning のフレームワークである Chainer を試用してみたところ、サンプルの MNIST の学習に時間がかかりすぎて、これは CPU に計算させる代物ではないことを悟りました。そこで、GPU を使って計算するための環境を整えることにしました。

環境

Chainer のバージョン

本記事の執筆時のバージョンは v1.4.0 です。(※2015/11/28追記)

Ubuntu 14.04.3 LTS のインストール

UNetbootin で USB に Ubuntu の iso ファイルを書き、USB ブートした上でインストールしました。SSDパーティション構成は以下のようにしました。

パーティション マウントポイント サイズ タイプ
/dev/sda1 /boot/efi 128MB efi
/dev/sda2 / 残りすべて ext4
/dev/sda3 - 2GB swap

BIOS のブートオプションでこの SSD を指定すると、/boot/efi から GRUB が起動されます。

システムの更新

カーネル含めて一度すべて最新の状態にします。

$ sudo apt-get update
$ sudo apt-get dist-upgrade

更新後は問題なく再起動できることを確認します。

Nouveau ドライバの無効化

NVIDIAGPU を積んだグラフィックカードの場合、デフォルトで Nouveau というドライバが使われていると思います。

$ lsmod | grep -i nouveau

以降の手順でインストールされる NVIDIA 製のドライバと競合するらしいので、いったん無効化しておきます。 /etc/modprobe.d/blacklist-nouveau.conf というファイルを新規に作成し、以下の設定を記述します。

blacklist nouveau
options nouveau modeset=0

カーネルモジュールを blacklist に登録した際は以下を実行しておくらしいです。

$ sudo update-initramfs -u

ここで再起動し、ディスプレイ解像度が落ちることで Nouveau が無効化されたことを確認します。

CUDA のインストール

CUDA 7.5 Downloads のサイトから deb ファイルをダウンロードして、以下の手順でインストールします。CUDA と一緒に NVIDIA のドライバもインストールされます。

$ sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

CUDA のインストールが完了したら、以下の設定を .bashrc 等に追加しておきます。CUDA 用のコンパイラ(nvcc)や CUDA ライブラリが使えるようになります。

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

この時点で再起動すると、CUDA と共に NVIDIA のドライバがインストールされるため、ディスプレイの解像度が元に戻ります。

$ lsmod | grep nvidia
nvidia_uvm             77824  0
nvidia               8605696  35 nvidia_uvm
drm                   344064  3 nvidia

NVIDIA のドライバを確認できました。以上で CUDA のインストールは完了です。

サンプルプログラムの動作確認

CUDA が正しくインストールされたことを確認するために、サンプルプログラムを動かしてみます。下記のように適当なディレクトリにコピーして make します。

$ cp -r /usr/local/cuda/samples ~
$ cd ~/samples
$ make

deviceQuery というサンプルを実行した結果です。

$ bin/x86_64/linux/release/deviceQuery
/home/tanaka/samples/bin/x86_64/linux/release/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 960"
  CUDA Driver Version / Runtime Version          7.5 / 7.5
  CUDA Capability Major/Minor version number:    5.2
  Total amount of global memory:                 4094 MBytes (4292719616 bytes)
  ( 8) Multiprocessors, (128) CUDA Cores/MP:     1024 CUDA Cores
  GPU Max Clock rate:                            1278 MHz (1.28 GHz)
  Memory Clock rate:                             3505 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 1048576 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.5, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 960
Result = PASS

python-dev, pip のインストール

まず、Python のパッケージから必要とされることが多い python-dev をインストールします。後述の NumPy のインストールにも必要です。

$ sudo apt-get install python-dev

続いて、他のパッケージと同様に Chainer は pip からインストール可能なので、pip をインストールします。

$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py

apt-get でも python-pip なるパッケージとしてインストール可能ですが、最新版にするため get-pip.py からインストールしました。Python 3.4, 2.7.9 以降では ensurepip という仕組みで最初から pip が使えるようになっているようです。面倒なので Ubuntu も早く ensurepip にして欲しいな。

NumPy, SciPy のインストール

SciPy で必要になるため、あらかじめ BLAS/LAPACK ライブラリと gfortran を入れておきます。

$ sudo apt-get install libblas-dev liblapack-dev gfortran

そして、pip を使って NumPy, SciPy をインストールします。ここで明示的に pip install しなくても、後述の「Chainer のインストール」の過程で自動的にインストールされます。(※2015/11/28追記)

$ pip install --user numpy scipy

なお、以下のように、apt-get でインストールするのも手っ取り早いとは思いますが、最新版とは限りません。

$ sudo apt-get install python-numpy python-scipy

Chainer のインストール

上記の NumPy や SciPy と同様に、pip で chainer-cuda-deps と chainer というパッケージをインストールします。chainer-cuda-deps は GPU 実行する場合に必要になるようです。

pip で chainer パッケージをインストールします。なお、本記事執筆時の Chainer v1.4.0 では chainer-cuda-deps は不要です。v1.3.0 から不要になったようです。(※2015/11/28修正。情報をご提供くださった奥田さん、ありがとうございます!)

$ # pip install --user chainer-cuda-deps # これは不要
$ pip install --user chainer

以上で、インストール作業は完了です。

では、早速 Chainer の動作確認として、MNIST の手書き文字認識の学習データを用いた学習のサンプルを実行してみます。

$ sudo apt-get install git
$ git clone https://github.com/pfnet/chainer.git
$ cd chainer/examples/mnist
$ python train_mnist.py -g 0
...
('epoch', 20)
train mean loss=0.0444635186407, accuracy=0.986683343351
test  mean loss=0.0679141613924, accuracy=0.983100009561

計算中に nvidia-smi を実行するとこんな感じ。GPU が使われていることが確認できます。

$ nvidia-smi
Mon Oct 12 23:36:04 2015
+------------------------------------------------------+
| NVIDIA-SMI 352.39     Driver Version: 352.39         |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 960     Off  | 0000:01:00.0      On |                  N/A |
|  0%   40C    P2    54W / 130W |    167MiB /  4093MiB |     48%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      1212    G   /usr/bin/X                                      39MiB |
|    0      5940    C   python                                         113MiB |
+-----------------------------------------------------------------------------+

GPU(GTX 960 4GB) 版で epoch 20 まで達するに要した時間は約 1 分 30 秒くらいでした。-g のオプションを省略すると CPU で計算するようになるのですが、単純計算で 60 倍ほど時間がかかるようでしたので、Deep learning で何かやろうと思ったら GPU は必須だと実感しました。