Python
AWS
DeepLearning
Chainer

AWSのGPUインスタンス作成してStyleNetを学習させる

More than 3 years have passed since last update.


AWSのLinux GPUインスタンス

AWSのGPUインスタンスはHVMベース。

HVMとはハードウェア仮想マシン(Hardware Virtual Machine)の略。つまりAWSのGPUインスタンスは物理GPUが接続されているのではなく仮想GPUが接続されている。(と思ってるけど、間違ってたらご指摘ください。)


g2.2xlargeインスタンスの作成

お金の安い米国東部(バージニア北部)でインスタンスを作成します。

1時間あたり$0.65。(2015/9/23現在)

その辺のマイクロインスタンスよりも高いので使い終わったら削除するのをお忘れなく!!

だいたいこんな手順でインスタンスを作成。


AWS Marketplaceでnvidiaと検索

スクリーンショット 2015-09-23 23.07.44.png


Linuxを使うので、Amazon Linux AMI with NVIDIA GRID GPU Driverを選択

スクリーンショット 2015-09-23 23.07.58.png


GPUインスタンスはg2.2xlargeを選択

スクリーンショット 2015-09-23 23.08.17.png


細かい設定を色々(ここは基本既定)

スクリーンショット 2015-09-23 23.08.28.png

スクリーンショット 2015-09-23 23.08.40.png

スクリーンショット 2015-09-23 23.09.15.png

スクリーンショット 2015-09-23 23.09.25.png


最終確認して作成

スクリーンショット 2015-09-23 23.09.48.png

作成後以下のコマンドでGPUが接続されて、ドライバがインストールされてるか確認できる。

nvidia-smi -q | head

(全部表示させてもいいけど、最初の10行表示でドライバのバージョンや接続数がわかる。)


chainer用pythonパッケージインストール

作成したAMIは最初からpythonとpipが入ってるので、chainerに必要なパッケージをインストール。

(あたまにsudo必要だったら適宜入れてね。)

pip install numpy

pip install chainer

chainerからCUDAを使用するためのPATHの設定は今回作成したAMIだと以下のとおり。

export PATH=/opt/nvidia/cuda/bin:$PATH

export LD_LIBRARY_PATH=/opt/nvidia/cuda/lib64:$LD_LIBRARY_PATH


chainerから確認

以下のコマンドでエラーがでなければ大丈夫じゃないすかね。

import chainer

from chainer import cuda

cuda.check_cuda_available()
cuda.get_device(0).use()


StyleNetを実行

この記事に載ってる話題のStyleNetをGPUインスタンスで実行。

Gitをインストールしてstyle-goghをダウンロード。NINのcaffemodelもダウンロード。

caffemodelのファイル名を***.caffemodelに変更。

sudo yum install git

git clone https://github.com/mattya/chainer-gogh
wget https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel?dl=1
mv nin_imagenet.caffemodel?dl=1 nin_imagenet.caffemodel

そして下記コマンド実行すれば動くと思います。

計算時間を表示したかったので、1世代ごとにコンソール出力して計算時間を表示するよう修正しました。

コンソール出力の最後の数値がスクリプト実行してからの経過時間。

(他の4つの数値は順に、世代数、アウトプットとした層の番号、コンテンツ画像とのずれ、スタイル画像とのずれ)

詳しくは解説記事とコードを読んでみてください。


CPU版

load model... nin_imagenet.caffemodel

('image resized to: ', (1, 3, 435, 435))
('image resized to: ', (1, 3, 435, 428))
0 0 0.0 131.536987305 100.341277122
0 1 0.0 16.9276828766 101.161045074
0 2 5.29387950897 0.132858499885 101.5359869
0 3 0.530761241913 0.00741795729846 102.120722055
1 0 0.0 123.52784729 178.474854946
1 1 0.0 15.2022619247 179.293597937
1 2 5.03846788406 0.123586334288 179.670742035
1 3 0.470058709383 0.00525630777702 180.251745939
2 0 0.0 110.198478699 255.28085494
2 1 0.0 12.6540279388 256.074426889
2 2 4.90201044083 0.113212890923 256.448594093
2 3 0.431303560734 0.00383871118538 257.029608965
3 0 0.0 92.4355773926 332.629327059
3 1 0.0 10.1973600388 333.420332909
3 2 4.86908721924 0.108661472797 333.790095091
3 3 0.409945964813 0.00298984581605 334.37262392
4 0 0.0 72.380569458 410.049565077
4 1 0.0 9.32985496521 410.848016024
4 2 4.92668151855 0.117410235107 411.218291044
4 3 0.398817956448 0.00246199313551 411.802879095
5 0 0.0 53.6025543213 486.892725945
5 1 0.0 11.4278764725 487.710140944
5 2 5.04112100601 0.141176745296 488.083660126
5 3 0.39475902915 0.00214517721906 488.664105892

だいたい1世代回すのに約80秒かかってる。


GPU版

load model... nin_imagenet.caffemodel

('image resized to: ', (1, 3, 435, 435))
('image resized to: ', (1, 3, 435, 428))
0 0 0.0 131.557006836 22.7398509979
0 1 0.0 16.9326477051 22.7434000969
0 2 5.2936425209 0.13280403614 22.7467870712
0 3 0.529067575932 0.00738066714257 22.7503979206
1 0 0.0 123.602386475 41.3092479706
1 1 0.0 15.211555481 41.3119618893
1 2 5.04172039032 0.123632088304 41.3146359921
1 3 0.469296246767 0.00526729598641 41.3175621033
2 0 0.0 110.336387634 41.394990921
2 1 0.0 12.6709651947 41.3977220058
2 2 4.90853118896 0.113566093147 41.4003748894
2 3 0.43169811368 0.00389048201032 41.4033150673
3 0 0.0 92.6167144775 41.4806849957
3 1 0.0 10.2161283493 41.4833440781
3 2 4.87660598755 0.109313540161 41.4860169888
3 3 0.41028663516 0.00304215308279 41.4892690182
4 0 0.0 72.5410461426 41.566724062
4 1 0.0 9.3198633194 41.5694000721
4 2 4.93378400803 0.118150554597 41.5720379353
4 3 0.399007946253 0.0025086470414 41.5749340057
5 0 0.0 53.6465911865 41.6522700787
5 1 0.0 11.3575658798 41.6549448967
5 2 5.0474896431 0.141661688685 41.6576039791
5 3 0.394712120295 0.00219127023593 41.6604459286

1世代回すのに約0.1秒。GPU爆速


最後に

今回はAWSインスタンスを作成する手順とCPUとGPUの速度比較の確認がしたかったので、StyleNetは10回ぐらいしか学習させませんでしたが、5000回学習させると考えると、

CPU・・・ 80* 5000 = 40,000[s] ≒ 約4.6日

GPU・・・ 0.1* 5000 = 500[s]

とこんなに時間が変わります。

普通に考えて、GPU使わないとか世間においてかれますね。

GPGPUもっと勉強しようと思います。


参考

http://qiita.com/pyr_revs/items/e1545e6f464b712517ed

http://yamakatu.github.io/blog/2014/07/05/gpgpu/

http://www.gdep.jp/page/view/248