この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
グラフィックス向け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