これは 日本情報クリエイト Engineers Advent Calendar 2016 による13日目の記事になります。
今回は前回に引き続きTensorFlowネタですが、今話題のGCPで学習させてみることにしました。
説明
GCPの無料トライアルではなんと60日間$300分を無料で利用可能ですので今回はこの無料枠の中で触ってみることにしました。
無料トライアルについてはこちらを御覧ください。
準備
GCPを初めて使用する場合は機械学習サービスのAPIが無効になっていますので、まずは機械学習のAPIを有効にしましょう。
APIを有効にするには
[メニュー] -> [API Manager] から API Managerのダッシュボードに移動し、『
Google Cloud Machine Learning』を選択し、有効にして下さい。
Google Cloud Shell
GCPではGCPの各種SDKが付与され、各種APIにアクセス可能な環境を無料で利用することができます。
GCPの機械学習サービスでは学習をさせるためにAPIをコマンドラインから呼び出す必要があるため、この無料で利用可能なshellは非常に役立ちます。
しばらく利用しないとshellのインスタンスは消失してしまいますが、$HOMEディレクトリ以下のデータは永続的に保持され5GBまで利用できるので、利用開始の敷居が下がり軽く触ってみたい方も時間をかけずに開始することができてとてもいいですね。
学習・・・の前に
早速学習に入って行きたいところですが、前回紹介したソースのままではGCPで学習させることができないので学習できるように少しばかり手を加えていきます。
まず、とても重要なことはせっかくCSVとして準備した学習データですが、そのままでは使えません・・・orz
その為、学習を始める前に準備したデータセットを一度クラウドのストレージに保存し、学習開始前にこのデータセットをダウンロードするという手順をふむ必要があります。
ただ、機械学習を実行するインスタンスにもSDKがインストールされているらしく、データは以下のようなコードで取得できます。
ダウンロード先は書込み権限のある/tmp以下にするのが無難でしょう。
import subprocess
subprocess.check_call(['gsutil', 'cp', 'gs://<バケット名>/image.csv', '/tmp/image.csv'])
ちなみに前回は学習結果を保存する方法を記載してませんでしたが、以下のようなコードで保存できます。
(保存先はやっぱり書込み権限のある/tmp以下にしましょう)
saver = tf.train.Saver()
sever.save(sess, '/tmp/output/export')
また、学習した結果もやっぱりどこにも保存されないので、学習が終わったデータは同じくクラウドのストレージにアウトプットしましょう!
subprocess.check_call(['gsutil', 'cp', '-r', '/tmp/output', 'gs://<バケット名>/output'])
最後に学習を実施するコードをmain関数の中に突っ込みましょう。
最終的にはこんな感じになります。
import tensorflow as tf
import numpy as np
import httplib
import subprocess
def main(_) :
'''
学習コード
.
.
.
'''
if __name__ == '__main__' :
tf.app.run()
tf.app.run()が実行されるとmain関数が呼び出され学習が実行されるような形ですね。
main関数の引数にはコマンドライン引数(後述)が入るのでなにかスクリプト内に渡したいデータがある場合はコマンドライン引数経由でデータの受け渡しができます。
大体、出力先や学習データセットの取得元などを指定する場合が多いように思います。
学習
それでは、ようやく準備が整ったのでGCPにjobを投げてみます。
jobはコマンドラインから登録するためGoogle Cloud Shellで以下のスクリプトを実行するだけです。
簡単ですね。
JOB_NAME=$(date "+i%Y%m%d_%H%M%S")
TRAIN_BUCKET=gs://<バケット名>
TRAIN_NAME=myproject
gsutil cp image.csv ${TRAIN_BUCKET}/image.csv
gcloud beta ml jobs submit training ${JOB_NAME} \
--package-path="test" \
--module-name="test/task" \
--staging-bucket="${TRAIN_BUCKET}" \
--region=asia-east1 \
-- \
--csv_file="${TRAIN_BUCKET}/image.csv" \
--output="${TRAIN_BUCKET}/output"
これで『test/task.py』に配置されたソースがGCPに展開され実行してくれます。
『--package-path』、『--model-name』、『--staging-bucket』、『--region』は(ほぼ)必須パラメータなので適宜指定して下さい。
また、『--』以降のパラメータは実行するソース(この場合task.py)にコマンドライン引数として渡されますのでデータの受け渡しが必要な場合はこのように指定しましょう。
まとめ
GCPというよりCloud Shellは非常に便利でした。
こういう物があるとクラウドを利用する際の検証の敷居が下がるので、とてもありがたかったです。
機械学習については無料枠がないので、無料トライアルの無料分を消費する形になりますが、40時間くらいリソースを使っても1,000円程度で済むので無料トライアルでも十分検証利用は可能なようです。
ただ、分散処理をしていないためか[256 x 256]の画像データを4000枚ほど学習させたところでOOMKillerが呼び出されてタスクが中断してしまい、学習を完了させることができませんでした。
とりあえずは学習データを1000枚にしてお茶を濁しましたが大量のデータでの学習は残念ながらできていないので、この問題が解決したら次回にでも書こうかな。
(全く違うことが書かれてたら察して下さい。。。)