moxt

Just another Blog site

ディープラーニングフレームワーク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を作ってみたい。

deepdreamも高速で処理できます。

TL;DR

下記の2記事を読めば(ほぼ)終わり。

EC2インスタンスを立ち上げて〜Caffe(GPU)のDockerコンテナを起動

手で地道にインスタンス立ち上げて、Dockerインストールしてpullしてrunするのも良い。
ただ、インスタンスがタダで使えるならの話。
それに環境構築に再現性を持たせたほうが後々良さそう。

と、いうことでこの辺の手続きを自動化してみたい。

どのように自動化するか。
EC2にはUserDataという仕組みがある。
これはEC2起動時にシェルスクリプトが実行できる、というモノ。
軽く調べてみると色々難ありな印象を抱いたので見送る。

唐突にPackerというものを使ってみる。
マシンイメージの作成を自動化するためのフレームワークだ。
いわゆる、何を言ってるか分からねえが状態だけど、AMIとかDockerイメージの作成をPackerというラッパーを使うことで抽象化かつ『Infrastructure as Code(?)』できるって感じだろうか。

まず、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にしてる。

アクセスキーとシークレットキーの値は別ファイルから渡すようにしたいので、下記のようなjsonを作っておく。

AMI作成時にdocker pullも済ませておきたい。
packerのprovisioner内にdocker pullを呼び出すコードを書いても良い。
個人的にdocker pullはインフラというより、具体的なアプリ側の責務な気がした。
なので、ここはansibleを使ってdocker pullするようにした。

setup.ymlというファイルを用意して下記のようにしてdockerコマンドを実行する

計3ファイルを用意したらpackerでAMIをビルドする

しばらく待つ。

無事にビルドが終わったらマネージメントコンソールからなりコマンドラインからなりで作ったAMIからインスタンスを起動する。
起動できたらここのVerify CUDA is correctly installedを参考にしてnvidiaデバイスを有効化する。(provisioners内で実行しても有効化されなかった。。ここの処理も予め済ませておきたいならUserDataなどで実行するようにする感じだろうか。そもそも、このコマンドってnvidiaデバイスを有効にするためのスクリプトじゃないはず、、謎。)

docker imagesでcaffe_gpuなコンテナが存在することを確認できたらOK。

http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/

ここを参考にして、下記のようなコマンドを叩いてコンテナを起動すればGPUを使ったCaffeが使えるようになる。

体感だがCPUの10分の1くらいで学習スクリプトが終わった。
GPUスゴい。

次は実験に使うデータやスクリプトの準備などを効率よくする方法を書きたい。

 - ディープラーニング

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

0100
deepdreamしてみたい

http://amagitakayosi.hatenablog.com/entry/2015/07/03/143913 「だれか試して」と書いてあったので便乗。 …

20130608212518
MacでKerasを使えるようにする

KerasはTheanoやTensorFlowを楽に使うためのライブラリ。 1年前くらいはCaffe使ってたけど、やっぱり使いにくい。 …

no image
『Caffeで手軽に画像分類』が手軽にできない。

バズワードと化したディープラーニングをやってみたい。 そんな軽い気持ちでググると下の記事が出てくる。 …

the_scream
画風を変換するアルゴリズムの別実装neural-styleを動かしてみる

画風を変換するアルゴリズム | …

no image
PythonとOpenCVで線画を抽出してみる

chainerで線画着色をwebサービスにして公開してみた – …

tsubasa
ディープラーニングで本田翼を見分けたい。初歩編

佐村河内守のアレの焼き増し。 ショートボブ4姉妹の画像群を学習させて本田翼を本田翼と正しく分類できたらバンザイですね、ってヤツ。 …

20130608212518
とりあえずディープラーニングしてみたいならErsatzという選択肢があるよ

Contents1 はじめに2 …