g3インスタンスで、CUDA-8.0とChainerインストール済みのAMIを作成してみる

この記事は公開されてから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相当)

cuda-download2

ダウンロードボタンが表示されたら、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-download

ダウンロードしたファイルは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として保存しておきます。コンソールから、イメージの保存を選び、適当な名前を付けて保存しておきます。

cuda-create-image

cuda-create-image2

一度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を使えば、手早く環境をセットアップできると思います。ご参考になれば幸いです。

参考