INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

AWSのGPUインスタンスにmxnetをインストールする

AWSGPUインスタンスにmxnetをインストールしようとしたら色々はまったのでメモしとく。基本的に以下のリンク先の通り。


EC2インスタンスの作成

今回作成したインスタンスの設定は以下の通り。MarketplaceにあるnvidiaのAMIイメージはOSがAmazon Linuxなので使用しない。(前述の Installation GuideにUbuntu/Debian, MacOS, Windowsしかないので。。。)

またmxnetのインストールには約1GBのディスク容量が必要でデフォルトの8GBでは心許ないのでストレージを追加しておく。


項目 設定
リージョン オレゴン
Amazon マシンイメージ Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-d732f0b7
インスタンスタイプ g2.2xlarge
ストレージの追加 EBS Cold HDD (sc1) 500GB


EBSのマウント

追加したストレージがマウントされていないので

Amazon EBS ボリュームを使用できるようにする - Amazon Elastic Compute Cloud

を参考にマウントしておく。

# 使用可能なディスクデバイスの確認
$ lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvda    202:0    0     8G  0 disk 
└─xvda1 202:1    0     8G  0 part /
xvdb    202:16   0   500G  0 disk 

# ファイルシステムを作成する必要があるかどうかを確認
$ sudo file -s /dev/xvdb 
/dev/xvdb: data

# ボリュームに ext4 ファイルシステムを作成
$ sudo mkfs -t ext4 /dev/xvdb

# ボリュームのマウントポイントディレクトリを作成
$ sudo mkdir /data
$ sudo chmod 777 /data/

# ボリュームをマウント
$ sudo mount /dev/xvdb /data

# 再起動時に自動でマウントするように/etc/fstabに追記
$ sudo vi /etc/fstab
/dev/xvdb   /data   ext4    defaults,nofail 0  2

# 正しく動作するかを確認
$ sudo mount -a


パッケージの追加とカーネルのアップデート

Installation Guide — mxnet 0.7.0 documentationには触れられていないがcurlがないとmxnetのコンパイル時にエラーになるのでlibcurl4-openssl-devを追加しておく。またMNISTのサンプルをpythonで実行するのにpython-numpyとunzipも必要となるので併せて追加しておく。

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install -y build-essential git libatlas-base-dev libopencv-dev libcurl4-openssl-dev

# PythonでMNISTのsampleを実行するのであれば必要
$ sudo apt-get install -y python-numpy unzip

# AWSのLinuxカーネルをアップデート
$ sudo apt-get install linux-image-extra-virtual


nouveauの無効化

このあとインストールするnvidiaのドライバがデフォルトのグラフィックスドライバnouveauと競合するため無効化して再起動する。

$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf

$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-3.13.0-95-generic

$ sudo reboot
$ sudo apt-get install -y linux-source linux-headers-`uname -r`


CUDAのインストール

CUDAをダウンロードしてインストールする。

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.5-18_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install -y cuda
$ sudo reboot


インストールが正常にできていたらnvidia-smiコマンドでGPUの使用状況が確認できる。

$ nvidia-smi
Thu Sep  8 12:12:53 2016       
+------------------------------------------------------+                       
| NVIDIA-SMI 352.99     Driver Version: 352.99         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GRID K520           Off  | 0000:00:03.0     Off |                  N/A |
| N/A   32C    P0    36W / 125W |     11MiB /  4095MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


cuDNNのインストール

cuDNNがあると速度が全然違うとのことなのでインストールする。cuDNNは NVIDIA cuDNN | NVIDIA DeveloperからダウンロードしてEC2にアップロードしておく。

$ tar -xvzf cudnn-7.5-linux-x64-v5.1.tgz 
$ cd cuda
$ sudo cp lib64/* /usr/local/cuda/lib64/
$ sudo cp include/cudnn.h /usr/local/cuda/include/


IEEE1394の無効化

libdc1394 error: Failed to initialize libdc1394なるエラーが発生するので無効にしておく。

$ sudo ln /dev/null /dev/raw1394


MXNetのインストール

mxnetをgit cloneする。

$ cd /data
$ git clone --recursive https://github.com/dmlc/mxnet
$ cd mxnet/


GPUを有効にするためにmakeの設定ファイルを編集する。

$ cp make/config.mk .
$ echo "USE_CUDA=1" >>config.mk
$ echo "USE_CUDA_PATH=/usr/local/cuda" >>config.mk
$ echo "USE_CUDNN=1" >>config.mk
$ echo "USE_BLAS=atlas" >> config.mk
$ echo "USE_DIST_KVSTORE=1" >>config.mk
$ echo "USE_S3=1" >>config.mk
$ make -j$(nproc)


makeが正常に終了したら共有ライブラリにパスに追加する。

$ echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
$ source ~/.bashrc


動作確認

PythonでMNISTの手書き文字の学習サンプルを実行する。

# g2.8xlargeでGPUが4基ある場合は--gpus 0,1,2,3とする
$ python example/image-classification/train_mnist.py --network lenet --gpus 0
2016-09-08 12:24:59,261 Node[0] start with arguments Namespace(batch_size=128, data_dir='mnist/', gpus='0', kv_store='local', load_epoch=None, lr=0.1, lr_factor=1, lr_factor_epoch=1, model_prefix=None, network='lenet', num_epochs=10, num_examples=60000, save_model_prefix=None)
--2016-09-08 12:24:59--  http://data.dmlc.ml/mxnet/data/mnist.zip
Resolving data.dmlc.ml (data.dmlc.ml)... 128.2.209.42
(中略)
2016-09-08 12:27:04,599 Node[0] Epoch[9] Time cost=3.862
2016-09-08 12:27:04,864 Node[0] Epoch[9] Validation-accuracy=0.991687
2016-09-08 12:27:04,864 Node[0] Epoch[9] Validation-top_k_accuracy_5=1.000000
2016-09-08 12:27:04,865 Node[0] Epoch[9] Validation-top_k_accuracy_10=1.000000
2016-09-08 12:27:04,865 Node[0] Epoch[9] Validation-top_k_accuracy_20=1.000000



mxnet本体がインストールできたので次はRから使えるようにする。