Alibaba Cloud GPUインスタンスのコスト検証

中国のアリババが展開するクラウドサービス、Alibaba Cloudの記事の第三弾です。
前回の記事は[こちら](https://qiita.com/biosugar0/items/54a18c92482940fb6331)
ついにGPUインスタンスが日本のリージョンで使えるようになりましたね！(https://jp.alibabacloud.com/notice/gpu-notice-20180606)
ということで、今回はGPUインスタンスを使ってディープラーニングのスクリプトを実行してみて、
どれくらいのコストがかかるのかを実験してみたいと思います。

## 実験

### テスト用のスクリプト

ディープラーニング用のフレームワークパッケージであるkerasのリポジトリに置いてあるスクリプトを少し改変したものを使います。
https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py
このスクリプトは、Variational Autoencoder という教師なし生成モデルの一つのアルゴリズムを実装したものです。入力データは[MNIST](https://s3.amazonaws.com/img-datasets/mnist.npz)という定番の手書き数字画像データです。

生成した画像を実行時に表示するようになっているので、その処理を消してテストに使います(CUIだけで完結させたい)。具体的には`plt.show()`を消しました。

また、matplotlibのインポート部分を以下のように変更してます。

```
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
```

### ローカル環境でのテスト

普段使っているMacBook Airで実行してみます。

#### スペック
```
Model Name: MacBook Air
Model Identifier: MacBookAir7,2
Processor Name: Intel Core i7
Processor Speed: 2.2 GHz
Number of Processors: 1
Total Number of Cores: 2
Memory: 8 GB
```

#### 実行時間

```
gtime -f %E python3 test_vae.py
```
```
13:35.09
```
約13分35秒でトレーニングが終わりました。

これをGPUインスタンスで実行するとどうなるでしょうか？実験してみましょう！

### Alibaba CloudのGPUインスタンスでの実験

#### 1.GPUインスタンスの作成

GPUインスタンスは、以下の設定で作成します。

* 価格モデル：従量課金
* リージョン：アジア東北1(東京)
* インスタンスタイプ：ecs.gn5-c4g1.xlarge (4Core、30GB RAM)
* イメージ：Ubuntu 16.04 64bit
* ストレージ：Ultraクラウドディスク40GB
* CPU：Intel Xeon E5-2682 V4(2.5GHz)
* GPU：NVIDIA P100
* CUDA：バージョン9.1.85/Driver バージョン390.46

CUDAのインストールも「GPUドライバーの自動インストール」にチェックを入れて選択すると、自動でしてくれるみたいです！便利だ。
これはCUDAのインストールスクリプトがインスタンス作成時に実行されるようです。

>ちなみにCUDA（クーダ）とはCompute Unified Device Archtectureの略で、NVIDIA社が提供するGPUコンピューティング向けの統合開発環境です。tensorflowなどのディープラーニングフレームワークをGPU環境で使用するときに必要になります。

ここで注意。このあとのスクリプト実行でtensorflowを使用するのですが、これが最新版のCUDA9.1だと動きません。9.0だと現在のtensorflow-gpuの最新版(1.8.0)で動きます。
![gpuinstance.png](https://qiita-image-store.s3.amazonaws.com/0/151746/a98e0759-6ebe-b723-fff4-0b788c749093.png)

インスタンスを作成したら、IDをメモしておきます。
今回は`i-6we5mrwci0d3tzuqu5q4`。

#### 2.cuDNN のインストール

CUDAのディープニューラルネットワーク用ライブラリであるcuDNNをインストールします。

https://developer.nvidia.com/rdp/cudnn-download　から、

* cuDNN v7.1.4 Runtime Library for Ubuntu16.04 (Deb)
* cuDNN v7.1.4 Developer Library for Ubuntu16.04 (Deb)
* cuDNN v7.1.4 Code Samples and User Guide for Ubuntu16.04 (Deb)

をダウンロード(アカウント登録が必要)し、以下のコマンドでインストールします。

```
sudo dpkg -i libcudnn7_7.1.4.18-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.1.4.18-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.1.4.18-1+cuda9.0_amd64.deb
```

#### 3.スクリプトの依存パッケージのインストール

テスト用スクリプトの実行に必要なパッケージを以下のコマンドでインストールします。

```
apt update
apt upgrade
apt install python3-pip graphviz
pip3 install tensorflow-gpu keras matplotlib pydot
```

#### 3.テスト用スクリプトの実行

さあ、準備は整いました。実行してみましょう！

```
time python3 test_vae.py
```
```
real	2m20.489s
user	3m6.260s
sys	0m34.004s
```

約2分20秒で終わりました！めっちゃ速い！
そもそもGPU使ったの初めてなんですが、これはGPU使いたくなりますね。
実験が終わったので、インスタンスをリリースします。

#### 4.値段の確認

しばらく今回の実験が利用状況に反映されるのを待って、
Alibaba Cloudコンソールの右上にある「料金•支払い管理」→料金詳細に移動します。
詳細を見て、今回実験に使ったインスタンスのIDの値段を見てみましょう。
IDはこれでしたね。`i-6we5mrwci0d3tzuqu5q4`

![gpufee.png](https://qiita-image-store.s3.amazonaws.com/0/151746/995a8628-fef1-5b59-3b46-0d64ab168556.png)

約186円という結果でした!
一時間未満の利用の場合、料金が１時間単位のため、現在は185.7円が固定でかかるようです。
あとの料金はだいぶ安いですね。
システムディスクも１時間単位なので、それ未満の利用だと40Gだと固定で0.48円かかるようです。
見たところGPUやCPUの使用率は料金に関係ないようなので、フル活用するほどお得ということになるようです。

## まとめ

Alibaba CloudのGPUインスタンスをディープラーニングスクリプトの実行に使ってみて、どのくらいの値段がかかるのかを見てみました。想像より値段がかからず驚きました。
普段の研究を考えるとディープラーニングのトレーニングはwebアプリのように日常的に動作し続けるものではないので、一度トレーニングしてインスタンスをリリースできるクラウドは相性がいいと感じました。
オンプレミスでGPU積んだサーバ買うと高いですしね。この実験が誰かの参考になったら幸いです。