ディープラーニングフレームワークCaffeをGPUなEC2上でサクッと動かせるようにしたい
2015/07/11
MacのGPUだとCUDAが動かないらしく、Caffe+GPUが実践できない。
CPUだと学習に時間がかかるためGPUをつんだコンピュータで高速に学習させたい。
と、いうことでGPUを積んだEC2を使った高速学習環境を作ってみる。
EC2を使ってCaffe(on the Docker)をいじる場合下記のような流れになる。
- EC2(GPU搭載)インスタンスを立ち上げる
- Docker環境を構築する
- Caffe(GPU)のDockerコンテナを起動
- 実験環境(スクリプトやデータセット)を構築
- 学習させたり、分類させたりする
とりあえず、データセットやスクリプトを配置する前の大元の基盤となるcaffeのDockerコンテナを積んだAMIを作ってみたい。
TL;DR
下記の2記事を読めば(ほぼ)終わり。
- http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-running-ubuntu-14-dot-04/
- http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/
EC2インスタンスを立ち上げて〜Caffe(GPU)のDockerコンテナを起動
手で地道にインスタンス立ち上げて、Dockerインストールしてpullしてrunするのも良い。
ただ、インスタンスがタダで使えるならの話。
それに環境構築に再現性を持たせたほうが後々良さそう。
と、いうことでこの辺の手続きを自動化してみたい。
どのように自動化するか。
EC2にはUserDataという仕組みがある。
これはEC2起動時にシェルスクリプトが実行できる、というモノ。
軽く調べてみると色々難ありな印象を抱いたので見送る。
唐突にPackerというものを使ってみる。
マシンイメージの作成を自動化するためのフレームワークだ。
いわゆる、何を言ってるか分からねえが状態だけど、AMIとかDockerイメージの作成をPackerというラッパーを使うことで抽象化かつ『Infrastructure as Code(?)』できるって感じだろうか。
まず、Packerをインストール。
1 2 |
brew tap homebrew/binary brew install packer |
300MBくらいのファイルサイズなのでちょっと待つ。
https://www.packer.io/intro/getting-started/setup.html
getting startedの出来が良すぎるので、ヘタに日本語ブログ読んで混乱する前にここを読む。
つまり、この記事もクソブロガー問題なので読まないほうが良い。
packerには大きく3つの機能がある。
- builders
- provisioners
- post-processor(これは今回使わない)
この3つのフレームに乗ってマシンイメージをコード化してゆく。
EC2でGPUを使いたいので、builders内でAMIのマシンスペック的な指定を記述する。
CUDAのインストールとか面倒なので、その辺の前処理が済んでいるAMIをベースにして環境を作ってゆく。
下記がCUDA環境構築済みAMI
http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-running-ubuntu-14-dot-04/
公開されているAMIはUS-EastとUS-West用。
US-EASTのami-2cbf3e44をベースとして使う。
caffe_gpu_aws.jsonみたいな感じで適当な名前のjsonを作り、ここにbuilders,provisionersの処理を書いてゆく。
g2.2xlargeインスタンスは普通にオンデマンドで起動すると$0.650 /1 時間(だいたい1時間100円くらい?)課金される。
packer buildするたびに100円とられるのもアレなのでスポットインスタンスを使うようにしている。
2015年4月26日時点で$0.064/1時間くらいで落札できるが、余裕をみて最大入札価格を$0.07にしてる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
{ "variables":{ "aws_access_key": "", "aws_secret_key": "" }, "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "source_ami": "ami-2cbf3e44", "instance_type": "g2.2xlarge", "ssh_username": "ubuntu", "spot_price": "0.07", "ami_name": "caffe_gpu {{timestamp}}", "launch_block_device_mappings": [ { "device_name": "/dev/sdb", "volume_type":"gp2", "volume_size": 8, "delete_on_termination": true }, { "device_name": "/dev/sda1", "volume_type":"gp2", "volume_size": 20, "delete_on_termination": true } ] }], "provisioners":[{ "type":"shell", "inline": [ "sudo apt-get -y update", "sudo apt-get install -y python-pip python-dev", "sudo wget -qO- https://get.docker.com/ | sh", "sudo usermod -aG docker ubuntu", "sudo pip install ansible", "sudo pip install docker-py" ] }, { "type": "ansible-local", "playbook_file": "setup.yml" } ] } |
アクセスキーとシークレットキーの値は別ファイルから渡すようにしたいので、下記のようなjsonを作っておく。
1 2 3 4 |
{ "aws_access_key": "アクセスキー", "aws_secret_key": "シークレットキー" } |
AMI作成時にdocker pullも済ませておきたい。
packerのprovisioner内にdocker pullを呼び出すコードを書いても良い。
個人的にdocker pullはインフラというより、具体的なアプリ側の責務な気がした。
なので、ここはansibleを使ってdocker pullするようにした。
setup.ymlというファイルを用意して下記のようにしてdockerコマンドを実行する
1 2 3 4 5 6 7 8 9 |
- hosts: all user: ubuntu tasks: - name: "docker pull caffe_gpu" sudo: yes docker: name: caffe_gpu image: tleyden5iwx/caffe-gpu-master state: present |
計3ファイルを用意したらpackerでAMIをビルドする
1 |
packer build -var-file=variables.json caffe_gpu_aws.json |
しばらく待つ。
無事にビルドが終わったらマネージメントコンソールからなりコマンドラインからなりで作ったAMIからインスタンスを起動する。
起動できたらここのVerify CUDA is correctly installedを参考にしてnvidiaデバイスを有効化する。(provisioners内で実行しても有効化されなかった。。ここの処理も予め済ませておきたいならUserDataなどで実行するようにする感じだろうか。そもそも、このコマンドってnvidiaデバイスを有効にするためのスクリプトじゃないはず、、謎。)
1 |
cd /usr/local/cuda/samples/1_Utilities/deviceQuery && make && ./deviceQuery |
docker imagesでcaffe_gpuなコンテナが存在することを確認できたらOK。
http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/
ここを参考にして、下記のようなコマンドを叩いてコンテナを起動すればGPUを使ったCaffeが使えるようになる。
1 2 |
$ DOCKER_NVIDIA_DEVICES="--device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm" $ sudo docker run -ti $DOCKER_NVIDIA_DEVICES tleyden5iwx/caffe-gpu-master /bin/bash |
体感だがCPUの10分の1くらいで学習スクリプトが終わった。
GPUスゴい。
次は実験に使うデータやスクリプトの準備などを効率よくする方法を書きたい。
336px
336px
関連記事
-
-
deepdreamしてみたい
ht …
-
-
MacでKerasを使えるようにする
Ke …