LoginSignup
8
5

More than 5 years have passed since last update.

Check! Azure VM の GPU インスタンスで Chainer を動かしてみる (Ubuntu)

Last updated at Posted at 2018-02-11

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに

もっと GPU のことを知ろうと思って、Azure Linux VM で Chainer を動かす環境を作ってみました!

実施環境

  • Azure Virtual Machine
    • NC6 インスタンス
      • Tesla K80
  • Ubuntu 16.04
  • CUDA
  • Python 3
  • Chainer

Azure VM の GPU インスタンスについて

今回は、 Azure VM の NC6 インスタンスを利用します。

Azure VM のうち、GPUが最適化されたNシリーズは、それぞれの用途に合わせ、NC、ND、NVシリーズが提供されています。

シリーズ 搭載GPU ドライバ 主な特徴
NC Tesla K80 CUDA CUDA を利用した高速な計算に適している。
NCv2 Tesla P100 CUDA NCシリーズの2倍以上の計算性能を有する。
ND Tesla P40 CUDA ディープラーニングのワークロードを想定した構成。
NV Tesla M60 GRID リモートでのグラフィック描画処理、ストリーミングなどに適している。

環境構築

さくっと Ubuntu 16.04 の VM を起動して、下記の手順で環境を構築しました。関連資料は後述しています。

# GPU のチェック
$ lspci | grep -i NVIDIA
2ffb:00:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)

# 初期化
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git build-essential

# CUDAドライバ、 CUDA toolkit のインストール
CUDA_REPO_PKG=cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
wget -O /tmp/${CUDA_REPO_PKG} http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/${CUDA_REPO_PKG}
sudo dpkg -i /tmp/${CUDA_REPO_PKG}
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
rm -f /tmp/${CUDA_REPO_PKG}
sudo apt-get update
sudo apt-get install cuda-drivers
sudo apt-get install cuda
sudo reboot

# CUDAドライバの確認
$ nvidia-smi
Wed Feb  7 12:09:27 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.12                 Driver Version: 390.12                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00002FFB:00:00.0 Off |                    0 |
| N/A   39C    P0    73W / 149W |      0MiB / 11441MiB |     99%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

# GPU の persistence mode を有効化
$ $ sudo nvidia-smi -pm 1
Enabled persistence mode for GPU 00002FFB:00:00.0.
All done.

# cuDNN のインストール
# 下記を参照して debファイルをダウンロードし、インストールする
sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.1_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.1_amd64.deb

# NCCL のインストール
# 下記を参照して debファイルをダウンロードし、インストールする
sudo dpkg -i nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt-get install libnccl2=2.1.4-1+cuda9.1 libnccl-dev=2.1.4-1+cuda9.1

# Python 3 環境を整備
sudo apt-get install python3-venv libpython3.5-dev
python3 -m venv ~/chainerenv
source ~/chainerenv/bin/activate
(chainerenv) pip install -U pip setuptools

# CuPy および Chainer をインストール
(chainerenv) pip install cupy
(chainerenv) pip install chainer

動作確認

Chainer ドキュメントでも示されている MNIST のサンプルで動作確認をしてみます。

# Chainer のリポジトリをクローンする
(chainerenv) git clone https://github.com/chainer/chainer.git

# Chainer のリリースバージョンを確認する
(chainerenv) pip show chainer
Name: chainer
Version: 3.3.0
...<略>...

# Chainer のリリースバージョンに合わせる(※1)
(chainerenv) git checkout v3.3.0

# GPU 0番を指定して実行する(※2 --noplot で描画を無効にする)
(chainerenv) cd chainer/examples/mnist/
(chainerenv) python train_mnist.py --gpu=0 --noplot

上記の演算結果は以下のようになりました。ちゃんと動きましたー!

GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.190745    0.0844128             0.9413         0.9736                    3.84636
2           0.0740447   0.0751793             0.976783       0.9776                    6.94456
3           0.047704    0.0771665             0.984898       0.9766                    9.99173
4           0.0343457   0.0671767             0.988882       0.9809                    13.0028
5           0.0286408   0.0626079             0.990581       0.9815                    16.1552
6           0.0234828   0.0909236             0.992348       0.9765                    19.1792
7           0.0210257   0.062924              0.993132       0.9838                    22.133
8           0.0160507   0.116491              0.994482       0.9731                    25.0751
9           0.0191589   0.0819106             0.993716       0.9802                    28.0509
10          0.0140842   0.0906959             0.995482       0.9809                    31.0017
11          0.0152206   0.0936491             0.994832       0.9801                    33.9752
12          0.00902538  0.0895441             0.997132       0.9816                    36.953
13          0.0142587   0.0820686             0.995833       0.985                     39.9059
14          0.00841077  0.0988157             0.997166       0.9819                    42.882
15          0.0121234   0.1204                0.996332       0.9792                    45.8412
16          0.0135489   0.133547              0.996166       0.9764                    48.8171
17          0.0100978   0.100952              0.997133       0.9818                    51.8358
18          0.00653642  0.104121              0.998133       0.9816                    54.7911
19          0.0109874   0.119144              0.996782       0.9803                    57.7446
20          0.0121006   0.0777734             0.996632       0.9844                    60.7114

examples に関する備考

じつは、ここで使う train_mnist.py は、現時点(2018年2月)の master ブランチだとエラーが出るので、こちらの記事を参考に回避しました。大変助かりました!(具体的な解説は後述)

※1 リリースバージョンのタグに切り替える

Chainer は、 pip で配布されているリリースバージョンは 3.3.0 ですが、 master ブランチは v4.0.0b3 のリリースタグに含まれます。このバージョン間で train_mnist.py に差異があり、 master ブランチをそのまま使うと以下のエラーが出てしまいます。ですので、ここでは v3.3.0 のタグに切り替えて使用しました。

AttributeError: module 'chainer.training.updaters' has no attribute 'StandardUpdater'

もしくは、下記のように該当箇所を書き換えても動作します。

# 該当箇所のみ v3.3.0 の構造に書き換える
sed -i -E 's/^(.+?)training.updaters.StandardUpdater(.+?)$/\1training.StandardUpdater\2/g' examples/mnist/train_mnist.py

※2 --noplot オプションについて

matplotlib がない場合、このオプションを指定しないと以下のような warning が表示されます。 matplotlib をインストールしてもGUI環境がない場合は表示できないため、この --noplot オプションを指定するとよさそうです。

matplotlibがない場合のwarning
/home/user/chainerenv/lib/python3.5/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, '

余談

matplotlib をインストールする場合、 python3-tk も必要です。ただし、GUI環境がない場合はどちらにしろ以下のエラーになります。

matplotlibにはpython3-tkが必要
pip install matplotlib
...<略>...
ImportError: No module named '_tkinter', please install the python3-tk package
ディスプレイ環境がないとmatplotlibは使えない
# python3-tk をインストールする
sudo apt-get install python3-tk

# matplotlib をインストールする
pip install matplotlib

# train_mnist.py を実行してみるが、 ディスプレイ環境がないためエラー
python train_mnist.py --gpu=0

...<略>...
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Epilogue - おわりに

深層学習についてももっと理解を深めたく、これをベースに勉強を進めていけたらいいなと思います!

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5