g3インスタンスで、CUDA-8.0とChainerインストール済みのAMIを作成してみる
はじめに
グラフィックス向けGPUを搭載したg3インスタンスが、東京の他いくつかのリージョンで使えるようになったと発表されました。どんなものなのかさっそく試してみたついでに、NVIDIAドライバやCUDA-8.0をインストール済みのAMIを作成してみました。
GPUインスタンスの種類
新しく利用可能になったg3インスタンスは、NVIDIA Tesla M60 GPUを搭載した、グラフィックスアプリケーション向けとのことです。
現行では、g3の他に、g2, p2と合計3種類のGPUインスタンスが利用可能です。各インスタンスの概要をまとめてみます。
インスタンスタイプ | GPU | アーキテクチャ | CUDAコア | Graphicsクロック | GPUメモリ |
p2 | NVIDIA K80 | Kepler | 4992 | 875MHz | 24GB |
g2 | NVIDIA GRID K520 | Kepler | 3072 | 797MHz | 8GB |
g3 ←<NEW!> | NVIDIA Tesla M60 | Maxwell | 4096 | 1177MHz | 16GB |
Amazon LinuxにCUDAをインストールする
ベースとするAMIは標準的な、Amazon Linux(Amazon Linux AMI 2017.03.1 - ami-4fffc834)を選びました。インスタンスタイプは、g3で最小のg3.4xlargeです。その他のオプションの指定は、CUDAのツールキット群をインストールするにはディスク容量がデフォルトの8Gでは心もとないので20Gを指定しました。その他はデフォルトのままです。なおスポットインスタンスで試しました(お安く使えます)。
CUDAのインストールの仕方ですがAWSの公式ドキュメントに説明が用意されていますので、これを参考に進めます。
インスタンスが起動したら、まずはyumのアップデートし、更新したカーネルで動作するよう一度、再起動します。
local$ ssh -i {your-key}.pem ec2-user@ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com remote$ sudo yum update remote$ sudo reboot
接続が切れるので、しばらく待ってから再接続。ドライバのインストールに必要なカーネルヘッダファイル、そしてgccをインストールします。
local$ ssh -i {your-key}.pem ec2-user@ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com remote$ sudo yum install -y gcc kernel-devel-`uname -r`
NVIDIAのドライバですが、g3インスタンス向けのNVIDIAドライバファイルがS3で提供されています。aws s3コマンドで直接インスタンスにコピーしようとしたところ、権限が足りませんでした。そのため、クレデンシャルの設定がされているローカルにダウンロードしてから、scpでインスタンスにアップロードしました。
local$ mkdir tmp; cd tmp local$ aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/ . download: s3://ec2-linux-nvidia-drivers/LicenseAgreement/NvidiaGridAWSUserLicenseAgreement.DOCX to LicenseAgreement/NvidiaGridAWSUserLicenseAgreement.DOCX download: s3://ec2-linux-nvidia-drivers/NVIDIA-Linux-x86_64-367.106-grid.run to ./NVIDIA-Linux-x86_64-367.106-grid.run local$ scp -i {your-key}.pem NVIDIA-Linux-x86_64-367.106-grid.run ec2-user@ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:
コピーができたら、インスタンス上でドライバをインストールします。プロンプト無しで動作するよう-s
オプションを付けます。
remote$ chmod +x NVIDIA-Linux-x86_64-367.106-grid.run remote$ sudo ./NVIDIA-Linux-x86_64-367.106-grid.run -s
インストールに成功したら、nvidia-smi
コマンドを使ってGPUを確認します。
remote$ nvidia-smi -q ==============NVSMI LOG============== Timestamp : Mon Aug 28 02:23:19 2017 Driver Version : 367.106 Attached GPUs : 1 GPU 0000:00:1E.0 Product Name : Tesla M60 Product Brand : Tesla Display Mode : Enabled Display Active : Disabled Persistence Mode : Disabled Accounting Mode : Disabled Accounting Mode Buffer Size : 1920 Driver Model Current : N/A Pending : N/A Serial Number : 0324716143697 GPU UUID : GPU-ff66acff-ed6f-8719-953b-f60414b5d66a Minor Number : 0 VBIOS Version : 84.04.A6.00.01 MultiGPU Board : No Board ID : 0x1e GPU Part Number : 900-2G402-0000-000 Inforom Version Image Version : G402.0040.00.04 OEM Object : 1.1 ECC Object : 3.0 Power Management Object : N/A GPU Operation Mode Current : N/A Pending : N/A GPU Virtualization Mode Virtualization mode : Pass-Through PCI Bus : 0x00 Device : 0x1E Domain : 0x0000 Device Id : 0x13F210DE Bus Id : 0000:00:1E.0 Sub System Id : 0x113A10DE GPU Link Info PCIe Generation Max : 3 Current : 3 Link Width Max : 16x Current : 16x Bridge Chip Type : N/A Firmware : N/A Replays since reset : 0 Tx Throughput : 0 KB/s Rx Throughput : 0 KB/s Fan Speed : N/A Performance State : P0 Clocks Throttle Reasons Idle : Not Active Applications Clocks Setting : Active SW Power Cap : Not Active HW Slowdown : Not Active Sync Boost : Not Active Unknown : Not Active FB Memory Usage Total : 7613 MiB Used : 0 MiB Free : 7613 MiB BAR1 Memory Usage Total : 256 MiB Used : 2 MiB Free : 254 MiB Compute Mode : Default Utilization Gpu : 58 % Memory : 4 % Encoder : 0 % Decoder : 0 % Ecc Mode Current : Enabled Pending : Enabled ECC Errors Volatile Single Bit Device Memory : 0 Register File : N/A L1 Cache : N/A L2 Cache : N/A Texture Memory : N/A Texture Shared : N/A Total : 0 Double Bit Device Memory : 0 Register File : N/A L1 Cache : N/A L2 Cache : N/A Texture Memory : N/A Texture Shared : N/A Total : 0 Aggregate Single Bit Device Memory : 0 Register File : N/A L1 Cache : N/A L2 Cache : N/A Texture Memory : N/A Texture Shared : N/A Total : 0 Double Bit Device Memory : 0 Register File : N/A L1 Cache : N/A L2 Cache : N/A Texture Memory : N/A Texture Shared : N/A Total : 0 Retired Pages Single Bit ECC : 0 Double Bit ECC : 0 Pending : No Temperature GPU Current Temp : 25 C GPU Shutdown Temp : 91 C GPU Slowdown Temp : 88 C Power Readings Power Management : Supported Power Draw : 37.58 W Power Limit : 150.00 W Default Power Limit : 150.00 W Enforced Power Limit : 150.00 W Min Power Limit : 112.50 W Max Power Limit : 162.00 W Clocks Graphics : 708 MHz SM : 708 MHz Memory : 2505 MHz Video : 652 MHz Applications Clocks Graphics : 557 MHz Memory : 2505 MHz Default Applications Clocks Graphics : 557 MHz Memory : 2505 MHz Max Clocks Graphics : 1177 MHz SM : 1177 MHz Memory : 2505 MHz Video : 1083 MHz Clock Policy Auto Boost : On Auto Boost Default : On Processes : None
うまく動作しているようです。Tesla M60
のGPUを認識していることが確認できました。クロックやメモリや使用率など各種情報が表示されています。
ところで、公式の手順では、先にインストールされているNVIDIAのドライバを削除したり、neuvoueをディセーブルする手順が説明されていますが、Amazon Linux AMI 2017.03.1では特に必要が無いようです。他のLinuxでは必要になる場合があるかもしれません。
CUDA 8.0をインストールする
さきほどS3からのダウンロードで得られたのは、ドライバだけですので、CUDAは別途ダウンロードする必要があります。
NVIDIAのサイトにアクセスします。CUDAのバージョンは8.0です。選択肢は、Linux、x86_64、CentOS, CentOSバージョン=7, runfileを選びます。(Amazon Linux = CentOS7相当)
ダウンロードボタンが表示されたら、URLをコピーします。 パッチダウンロードボタンも表示されましたが、今回は省略します。
wgetを使って、インスタンス上で直接ダウンロードし、アーカイブを解凍します。
remote$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run remote$ chmod +x cuda_8.0.61_375.26_linux-run remote$ sudo ./cuda_8.0.61_375.26_linux-run -extract=/home/ec2-user/
NVIDIAからダウンロードしたパッケージには、ドライバも含まれていますが、こちらは使用しませんでした。さきほどS3からダウンロードしたものとバージョンに若干の差異があるようですが、特に問題は発生していません。
解凍してできたCUDAのインストーラを実行します。-nopromptを付けて一気に済ませます。
remote$ sudo ./cuda-linux64-rel-8.0.61-21551265.run -noprompt Verifying archive integrity... All good. Uncompressing NVIDIA CUDA.......... ... Logging to /tmp/cuda-installer-18852 Creating symbolic link /usr/local/cuda -> /usr/local/cuda-8.0 ======================================== Please make sure that - PATH includes /usr/local/cuda-8.0/bin - LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root Please read the release notes in /usr/local/cuda-8.0/doc/ To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin Installation Complete
PATH、LD_LIBRARY_PATHを設定する必要があるとのことですので、.bashrc
に設定します。ついでにCUDA_HOMEも設定します。
remote$ vi ~/.bashrc export CUDA_HOME=/usr/local/cuda-8.0 export LD_LIBRARY_PATH=$CUDA_HOME/lib64 export PATH=$PATH:$CUDA_HOME/bin remote$ source ~/.bashrc
cuDNNをインストールする
実行性能向上のため、NVIDIAからcuDNNライブラリが提供されています。以下の手順はオプションです。インストールしなくてもchainer/cupyは動作しますが、ウォーニングが出ることがあります。
cuDNNの最新版はv7ですが、Chainerが対応しているのはv6ですので、ダウンロードするときには注意が必要です。NVIDIAからダウンロードするためには登録が必要です。サイトにログインし、使用許諾にチェックを入れて、ブラウザでローカルにダウンロードしておきます。
ダウンロードしたファイルはcudnn-8.0-linux-x64-v6.0.tgz
でした。これをscp
でインスタンスにコピーします。
local$ scp -i {your-key}.pem cudnn-8.0-linux-x64-v6.0.tgz ec2-user@ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com:
コピーできたらリモート側でファイルを展開、コピーして完了です。
remote$ tar xfz cudnn-8.0-linux-x64-v6.0.tgz remote$ cd cuda remote$ sudo cp include/cudnn.h /usr/local/cuda-8.0/include/ remote$ sudo cp -a lib64/* /usr/local/cuda-8.0/lib64/
Chainerをインストールする
さて、実際に何かCUDAを試してみるにあたって、Chainerをインストールしてみることにしました。Webにはインストール手順の解説が多数ありますが、バージョンによって差異があるよう。公式のインストール手順によると、chainerとcupyをそれぞれインストールする必要があります。(以前はchainerにcupyが含まれていたと思います)
対象とするPythonのバージョンですが、3.5だと成功しませんでしたので、2.7で試しています。
オプションのpillowとh5dfをインストールするため、yumで必要なライブラリをインストールしてから、pipでインストールします。結構時間がかかります(numpyなどもインストールされるためです)。
remote$ sudo yum install zlib-devel libjpeg-devel remote$ sudo yum-config-manager --enable epel remote$ sudo yum install -y hdf5-devel remote$ sudo pip install pillow h5py
あとは、pipでchainerとcupyをインストールします。sudo無しに--userを付けてユーザ向けに入れました。
remote$ pip install --user chainer remote$ pip install --user cupy
pythonを起動して、cupyをimportしてみます。
remote$ python Python 2.7.12 (default, Sep 1 2016, 22:14:00) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cupy >>>
cupyは正常動作しているようです。
MNISTを試す
お約束のMNISTで試してみます。chainerのパッケージをgithubからダウンロードして、展開、GPUを使用するようサンプルに-g 0オプションを付けて実行してみます。
remote$ wget https://github.com/chainer/chainer/archive/v2.0.2.tar.gz remote$ tar xfz v2.0.2.tar.gz remote$ python chainer-2.0.2/examples/mnist/train_mnist.py -g 0 GPU: 0 # unit: 1000 # Minibatch-size: 100 # epoch: 20 /home/ec2-user/.local/lib/python2.7/site-packages/chainer/cuda.py:84: UserWarning: cuDNN is not enabled. Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz... Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz... Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz... Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz... /home/ec2-user/.local/lib/python2.7/site-packages/chainer/training/extensions/plot_report.py:25: UserWarning: matplotlib is not installed on your environment, so nothing will be plotted at this time. Please install matplotlib to plot figures. $ pip install matplotlib warnings.warn('matplotlib is not installed on your environment, ' epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.18895 0.0957937 0.943934 0.9711 18.0318 2 0.0722202 0.083583 0.977832 0.9742 20.6238 3 0.047806 0.0813454 0.984716 0.9751 23.2115 4 0.0361577 0.081315 0.988032 0.9773 25.7858 5 0.029899 0.080389 0.990415 0.978 28.3973 6 0.0217295 0.0828067 0.992381 0.9797 31.0097 7 0.0193728 0.0850496 0.993632 0.9783 33.6303 8 0.0187891 0.106093 0.994049 0.9766 36.2297 9 0.0170786 0.0844816 0.994165 0.9796 38.842 10 0.0138245 0.0959701 0.995665 0.9782 41.4626 11 0.0144706 0.0795918 0.995148 0.9805 44.074 12 0.0132607 0.0898976 0.995782 0.9804 46.6871 13 0.0136914 0.0911043 0.995849 0.9798 49.3038 14 0.0136999 0.103685 0.995982 0.9803 51.9258 15 0.00500163 0.100976 0.99845 0.982 54.5438 16 0.0143962 0.100274 0.995349 0.9812 57.1563 17 0.00868205 0.124455 0.997382 0.9808 59.7831 18 0.00888414 0.0993893 0.997349 0.9821 62.405 19 0.0109826 0.122802 0.996799 0.9804 65.0089 20 0.0078432 0.115166 0.997783 0.9819 67.6136
うまく動作しました。
matplotlibをインストールする
上の実行結果でmatplotlib
が無いとウォーニングが出ていますので、必要なライブラリと合わせてインストールしておきます。この手順はオプションです。
remote$ sudo yum install -y libpng-devel freetype-devel remote$ sudo pip install matplotlib
AMIを保存する
動作する環境ができたら、これをAMIとして保存しておきます。コンソールから、イメージの保存を選び、適当な名前を付けて保存しておきます。
一度AMIを作成しておけば、次回はすぐにCUDAやChainerを利用することができます。
ただし、実際に作成したAMIを使って、サンプルを動かしてみると、最初はGPUの動作開始まで十数秒の時間がかかるようです。動き出すまであせらず待ってください。
ところで、今回g3インスタンスで作成したAMIをg2インスタンスやp2インスタンスでも試してみたのですが、動作するようです。軽く使ってみた限りでは特段の不具合はありませんでした。参考までに記しておきます。
クロックの設定をする
AWSの資料には、最大のパフォーマンスを発揮するために、自動ブースト機能を無効にして、最大クロックで動作するよう設定が示されています。
remote$ sudo nvidia-smi -pm 1 remote$ sudo nvidia-smi --auto-boost-default=0 remote$ sudo nvidia-smi -ac 2505,1177
実際に、MNISTサンプルの実行に要する時間を比べてみましたが、あまり設定の効果は見られませんでした。この手順はスキップしても、CUDAは動作するようです。
上記はg3の場合です。インスタンスタイプによって設定が異なります。g2の場合は設定無用。p2の場合は下記となります。
remote$ sudo nvidia-smi -pm 1 remote$ sudo nvidia-smi --auto-boost-default=0 remote$ sudo nvidia-smi -ac 2505,875
まとめ
東京リージョンで利用可能になったg3インスタンスにドライバとCUDAをインストールする手順を試してみました。その環境にChainerをインストールして動作することが確認できました。保存したAMIが、ちゃんと利用できることを確認できました。このAMIを使えば、手早く環境をセットアップできると思います。ご参考になれば幸いです。
参考
- Announcement: Amazon EC2 G3 Instances Now Available in Asia Pacific (Japan), Asia Pacific (Sydney), Asia Pacific (Singapore), and EU (Frankfurt) Regions https://forums.aws.amazon.com/ann.jspa?annID=4914
- Linux 高速コンピューティングインスタンス http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#install-nvidia-driver
- NVIDIA CUDA Download https://developer.nvidia.com/cuda-downloads
- NVIDIA cuDNN Download (登録が必要です) https://developer.nvidia.com/cudnn
- Chainer https://github.com/chainer/chainer
- Qiita: Amazon EC2のGPUインスタンスにChainer v1.6を1行で入れる http://qiita.com/unnonouno/items/78ca98cf4911b5135c6f