AWSのGPUインスタンスにmxnetをインストールする
AWSのGPUインスタンスにmxnetをインストールしようとしたら色々はまったのでメモしとく。基本的に以下のリンク先の通り。
- Installation Guide — mxnet 0.7.0 documentation
- Setup Amazon AWS GPU instance with MXnet | Number 2147483647
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から使えるようにする。