FloydHubを使う

FloydHubディープラーニング向けのHerokuという位置付けのPasSサービスです。 Herokuはいつもお世話になっているので(無料プランだけど…)この触れ込みを聞くと試さずにはいられません。。 ( ̄ー ̄)

ということで、使ってみました。

(注)2017/10/1からトライアルのGPU利用時間が100->2時間に変わったようです

Is my free plan changed to 2 hours free GPU according to new free plan?

CLIの使い方もそこそこ変わっているようです。(これはいい意味で)

FloydHub とは

  • 簡単にクラウド上で学習が実行できる (実際に簡単だった! ^^)
  • クレジットカードなしでも登録できトライアルとして100時間分GPUが利用できる
  • コストはAWSの約50%で課金は秒単位でリーズナブル

Every one who signups to Floydhub will receive 100 hours of free CPU / GPU time for running your projects

とあるのでもしかしたら CPUとGPUを合わせて100時間かもしれません。 利用時間はダッシュボードで確認できます。

私が好きなChainer含めて主要なフレームワークが使用できます。 http://docs.floydhub.com/home/environments/

Chainerは↓の表の通り世界的に見るとまだまだ普及してないですがそのChainerもサポートされているのは嬉しいです。 TensorFlow以外は基本的に最新版のみのようです。

使えるFramework Github star
TensorFlow 60651
Caffe 18509
Keras 16571
MXNet 10051
Torch 6995
Theano 6453
PyTorch 5459
chainer 2594
Kur 537

使い方

公式ページのGet started 通りやればできます。

ジョブの実行

$ floyd init YourProjectNameでプロジェクトを作成したら $ floyd run "python train.py"のように floyd runに続けて実行するスクリプトを渡します。 必ずしもpythonを使う必要はなく $ floyd run "ls -la ." といったこともできます。

ジョブをrunするたびにディレクトリ全体がアップロードされるので不要なファイルが プロジェクトディレクトリの中にないか気をつける必要があります。 アップロードしたくないファイルは .floydignoreに記述できます。

なので、学習に使う巨大なデータはdataコマンドを使って使い回し可能なデータセットとしてアップロードしておく必要があります。

シェルスクリプトには実行属性がつかないので $ floyd run "./yourtest.sh" はNGです。 $ floyd run "sh ./yourtest.sh"とします。

GPUインスタンス

floyd run に --gpuオプションをつけて実行するとGPUインスタンス、何もつけないとCPUインスタンスです。

TensorFlowは基本的に自動的にGPUを使ってくれますが chainerだと通常、プログラム側の引数にも --gpu で渡してやる必要があります。

$ floyd run --gpu --env chainer "python train.py --gpu 0"

な感じです。TensorFlowがデフォルトとなっていてそれ以外は--envオプションでフレームワークを指定しないとエラーになります。

ログ

プログラムの出力ログは $ floyd logs [-t] <RUN_ID> で参照できます。 ダッシュボードからだと見つかりにくいのでコマンドラインで確認するのが良さそうです。

ダッシュボード上でログを参照する方法

f:id:sanshonoki:20170616214717j:plain f:id:sanshonoki:20170616214738j:plain

Experimentsの各ジョブを開いたときのVIEW LOGボタンではプログラムの出力ログは見れません。。

出力ファイル

プログラム上で /output ディレクトリにファイル出力すると $ floyd output <RUN_ID> で出力ファイルを参照できます。 $ floyd output <DATA_ID> は NG です。

DATA_ID は $ floyd info <RUN_ID> で調べます。

データセット

巨大なデータはデータセットとして一度アップロードすると学習プロジェクトの実行時に再アップロードなしに何度でも参照できます。

手順は

  1. データを置いてあるディレクトリに移動
  2. データプロジェクト作成 $ floyd data init YourDataName
  3. アップロードする $ floyd data upload

あとは $ floyd run --data <DATA_ID> "python train.py"のように --dataオプションで DATA_ID を渡すとプログラムの中で /inputディレクトリとして参照できます。

データセットをブラウザで確認するのは $ floyd data output <DATA_ID>、データセットを削除するのは $ floyd data delete [-y] <DATA_ID> です。

すべてのデータセットの一覧は $ floyd data status で可能です。

また、floyd run した各ジョブの出力結果も DATA_ID を持っており --data <DATA_ID> で 出力ディレクトリを /input ディレクトリとして使えます。

Jupyter Notebook

$ floyd run --mode jupyter とすると Jupyter Notebookも使えます。Jupyter Notebookを立ち上げている間は何もしなくても課金対象となるのでスクリプトを実行するのに比べるとちょっと勿体無い感はありますね。。

注意点としては明示的に stop しないとずっと課金され続けてしまう点です。

使い終わったら $ floyd stop <RUN_ID> を忘れずに !! (あるいは、ダッシュボード上で停止ボタンをクリックする)

公式ページでも

Once you have experimented with your code, you need to manually stop your "job". Run the stop command for this. Remember Jupyter notebooks are charged for the entire duration they are up, not just when you execute code. So make sure the stop the notebooks when you are no longer working on them.

と注意書きがありますが目立つように書いてないです。 何か勘ぐってしまうのは私だけでしょうか。。

保存したNotebookは /output に出力されますので $ floyd output <RUN_ID>で参照できます。

古いジョブやデータセットの削除

  • ジョブの削除: $ floyd delete [-y] <RUN_ID> <RUN_ID>...
  • データの削除: $ floyd data delete [-y] <DATA_ID> <DATA_ID>...

で削除できますがジョブIDやデータIDを明示的に指定してやる必要があります。 最近になって複数個同時に削除できるようになったみたいですがIDを調べるのがかなり面倒です。

プロジェクト単位で一括で削除するコマンドは今のところないようです。

Priceページ

Floyd stores any output files generated by the project and stored under /output directory at run time. You will be charged for the size of data genarated by your project. Pricing details below.

と書いてあるようにジョブ実行時の出力ファイルも課金対象となってしまうのでプロジェクト単位での一括削除は近いうちに対応されるのではないかと思います。

ジョブやデータを一括で削除する方法

statusコマンドとシェルスクリプトを組み合わせれば一括で削除することが可能です。

  • ジョブの一括削除

    $ floyd status 2>&1 | awk '{print $1}' | tail +3 | xargs floyd delete -y

  • データの一括削除:

    $ floyd data status 2>&1 | awk '{print $1}' | tail +3 | xargs floyd data delete -y

なお、ジョブの一括削除の場合はプロジェクトディレクトリ上で実行する必要があります。

ジョブを削除してもジョブが出力したデータは残り続けるのでこれまた盲点です。

価格比較

AWSとの比較

$1 = 110円 として

インスタンス コスト(1時間) スペック GPU
AWS EC2 g2.2xlarge 98.78円 8コア、メモリ15GB GPUメモリ4GB ストレージ60GB GRID K520
FloydHub G1 47.52円 4コア、メモリ61GB GPUメモリ12GB ストレージ100GB Tesla K80

AWSのEC2 GPUインスタンスを使うのに比べて約50%の料金でスペック差も歴然です。 EC2は時間単位で課金されるので 1秒でも使うと1時間分課金されますが FloydHub は秒単位で課金されるので変なストレスもかかりません。 (´◡`)

自作PCとの比較

自分のPCに積んでいる GeForce GTX 950 と 個人ユースでは高性能にあたる GeForce GTX 1080 の2パターンで試算してみました。

参考記事

電気代 = 28円 / 1kWh として

GPUボード
(推奨システム電力)
コスト(1時間) スペック ボード価格
GeForce GTX 950
(350W)
約9.8円 GPUメモリ2 GB 約1.5 - 2万円
GeForce GTX 1080
(500W)
約14円 GPUメモリ8GB 約7万円

「趣味用に安く深層学習PCを作った」の初期コストは約12万円なので 3580時間以上で 自作PCの総コスト(イニシャル+電気代)< FloydHubのコスト となります。約10-15円/時間と比べるとFloydHubの 47.52円/時間 はそれでもやっぱりまだ高いよなぁ..という印象を持ちますが初期コスト、構築の手間とメンテナンスのことも考えると、十分アリなんじゃないかなと思います。

まとめ

FloydHub、本当に簡単にディープラーニングGPU学習を始められます。 仕事で使うとあっという間に100時間分の無料枠は使いきると思いますがこれからディープラーニング始める人は挫折するかしないかの分かれ目までは無料枠内でいけると思うのでぜひ使ったほうがいいと思います。 (*´д`)o