ローカルマシンで時間がかかる機械学習のトレーニングをGoogle CLOUD MACHINE LEARNING ENGINEを使って高速化する

GCPのCloud Machine Learning Engine(MLEngine)を使えば、ローカルマシンで時間のかかる学習ジョブを高速化することができます。
今回は、MLEngineを使う方法を紹介し、更にGPUを使って学習ジョブがどの程度高速化するのかを実演します。

まずは結果を見ていきましょう。
ローカルでの実行環境は、MacBookAir 1800/13.3 MQD42J/A を使用しました。
CPUスペックはCore i5 1.8GHzデュアルコアIntel Core i5(Turbo Boost使用時最大2.9GHz)となっております。

ローカルマシン,CPUのみのMLEngine,GPUを割り当てたそれぞれの学習時間と料金について、結果は以下のようになりました。

環境 学習時間 料金
ローカルMacBook 75分
CPUのみMLEngine 64分 $0.54
GPU付きMLEngine 12分 $0.16

では、結果について細かく見ていきます。

ローカルでの実行結果

今回サンプルとして用いるトレーニングは、TensorFlowの公式チュートリアルのDeep MNIST for Expertsを行います。
畳み込みニューラルネットワークを用いて手書き文字の認識をするお馴染みのトレーニングですね。

まずはローカルで実行した際のログを以下に示します。

コード
-- 学習開始 --
12時39分51秒
Step: 1000, Loss: 1409.114624, Accuracy: 0.961000
...
Step: 20000, Loss: 599.086487, Accuracy: 0.985100
-- 学習終了 --
13時54分55秒

だいたい75分くらいかかっていますね。
これをMLEngineを使って高速化させようというのが今回の趣旨です。

GCP上での実行の事前準備

GCP上でGPUを使用するためには、申請をしてGPUの割り当てを確保する必要があります。
ご自身のプロジェクトの IAMと管理 > 割り当て からGPUのリソースを確保する必要があります。
GPUリソースが下記画像のように 0 になっているはずです。
なお、GPUにはP100とK80の2種類ありますが、今回は比較的安価なK80を使用します。

GPUのリソースを申請する際は、チェックをつけて画面上部の「割り当てを編集」から必要事項を入力してリクエストを申請してください。
リクエストが処理されるとメールが1通送信されてくるので、リソースを確認しましょう。
この際の注意事項として、現在GPUを使用できるリージョンは限られています。
詳細は下記リンクを御覧ください。
Compute EngineのGPU

今回は asia-east1 を利用することにします。

また、MLEngineで必要になりますので、ここで指定したのと同じリージョンに、RegionalなGCSバケットを1つ作成してください。
gcloudコマンドによるジョブ実行
実際にMLEngineへ学習ジョブをリクエストするためにはgcloudコマンドを使用する必要があります。
一般的には以下のようなコマンドになります

コード
$ gcloud ml-engine jobs submit training $JOB_NAME --package-path=trainer --module-name=trainer.task --staging-bucket=$BUCKET --region=asia-east1

このコマンドを、以下のようなディレクトリの親ディレクトリで実行します。

コード
trainer
   ├── __init__.py
   └── task.py

task.py は学習のプログラムになります。__init__.pyは空で大丈夫です。

gcloudコマンドの2つの環境変数 $JOB_NAME と $BUCKETには、それぞれMLEngineコンソールで管理するジョブ名と、先程作成したバケット名を指定します。
例えば $JOB_NAME として “gpuTest”、作成したバケットが”mljob-bucket”であるなら、具体的なコマンドは以下のようになります。

コード
$ gcloud ml-engine jobs submit training gpuTest --package-path=trainer --module-name=trainer.task --staging-bucket=gs://mljob-bucket \ --region=asia-east1

このままでは通常のCPU処理になってしまうので、GPUを使用する場合は以下のようにオプションを付与してあげます。

コード
$ gcloud ml-engine jobs submit training gpuTest --package-path=trainer --module-name=trainer.task --staging-bucket=gs://mljob-bucket \ --region=asia-east1 --scale-tier=basic-gpu

成功すれば、以下のようにレスポンスが返ってきます。

コード
Job [gpuTest] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ml-engine jobs describe gpuTest

or continue streaming the logs with the command

  $ gcloud ml-engine jobs stream-logs gpuTest
jobId: gpuTest
state: QUEUED

では、MLEngineのコンソールで確認してみましょう。

正常に処理されると、MLEngineのジョブリストの中にこのようなレコードが現れます。

また、ジョブは削除できず、名前の重複もできないことを覚えておきましょう。

実行時間確認

早速実行時間を確認してみましょう。
経過時間は12分14秒となっていますが、プロビジョンも含めての時間なので、実際のプログラム実行時間はもっと短いはずです。

print()の出力はログに吐き出されますので、ログを確認します。
簡便のため、必要な文字列のみ抽出します。

コード
-- 学習開始 --
8時36分4秒
Step: 1000, Loss: 1369.017090, Accuracy: 0.960600
...
Step: 20000, Loss: 606.171814, Accuracy: 0.984600
-- 学習終了 --
8時39分27秒

3分とちょっとの時間で学習が完了していることが確認できますね、GPUすごい。
もちろん使用料金は12分の使用分だけかかってしまうのですが、GPUがCPUに比べて高速に学習ジョブを処理できるのがわかります。

料金

続いて費用を見ていきましょう。
詳細はこちらに記載されていますが、MLEngineの料金は少し複雑です。
ジョブの詳細を確認すると、このような画面が表示されます。

ここで注目するのは 消費したMLユニットです。
詳細のリンクにも記載がありますが、使用したリソースによって単位時間あたりの使用量が異なります。
基本となる、GPUを使用しないジョブの料金の計算式は以下のようになります。

料金($) = (スケール階層 × 消費したMLユニット × (1時間あたりの料金 ÷ 60)) * 学習時間(分)

スケール階層とは、学習ジョブに対して割り当てたリソースを指します。
GPUを割り当てないデフォルトのBASICは 1 になります。
今回はGPUを1つ使用した、BASIC_GPUというスケール階層を使用しましたので、スケール階層は 3 になります。
1時間あたりの料金は、アジアリージョンの場合は$0.54になります。

学習時間は12分、消費したMLユニットは0.5でしたので、改めて料金を計算すると

(3 × 0.5 × (0.54 ÷ 60)) × 12 = $0.16

になります。GPUを使用した学習がこれほどの低価格で実行できるのは非常に便利ですね。

参考までに、GPUを使わない場合の処理時間と費用を見ていきましょう。
実行結果はこのようになりました。

消費したMLユニットは0.94、経過時間は64分となっておりますので、料金は以下のように計算できます。

(1 × 0.94 (0.54 ÷ 60)) × 64 = $0.54

驚くべきことに、GPUを使ったほうが安くなることがわかりました。

まとめ

このように、MLEngineを使うことで、例え貧弱なローカルマシンしなかったとしても、簡単にGPUを仕様することができるので、高速に学習を実行することができます。
加えて、CPUのみで長時間学習をするよりは、GPUを使って高速に学習させた方が安くなることもわかりました。

もっと高い精度を目指す場合にも、積極的にGPUを利用することで、より複雑なニューラルネットワークを組みやすくなるでしょう。

弊社ではクラウドエース(Cloud Ace)というGCPの導入・運用支援サービスを提供しておりますので、ご興味のある方はこちらまでお問い合わせください。

次の記事を読み込んでいます
次の記事を読み込んでいます