2018年8月29日水曜日

Google ML Engine を使って tensorflow を動かしてみる

概要

Google ML Engine はクラウド上で学習しモデルを生成し、そのモデルを Tensorflow で実行まで行うことができるプラットフォームです
今回はサンプルの学習データを元にモデルを生成し実際に判定させるところまでやってみました
なお作業はすべて Google Cloud Shell 上で行います
作業中は Google Cloud Shell とのセッションが切断されないように注意してください
作業には料金が発生するの留意の上作業してください

環境

  • Google ML Engine
  • Google Cloud Dataflow
  • Google Cloud Storage
  • Google Cloud Shell (2018/08/28 時点)
  • Python 2.7.13
  • pip 18.0

準備

まずは ML-Engine を使う前の準備をいろいろとします

API 有効化

ML-Engine の API 有効化

ml_engine1.png

Cloud Dataflow の API 有効化
(少し操作が違うのでご注意ください)
ml_engine4.png

学習用のサンプルデータを取得

  • wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
  • unzip master.zip
  • cd cloudml-samples-master/flowers

Python を使うので必要なライブラリをインストールしましょう
なぜか足りないライブラリがあるので手動でインストールします
tensorflow は最新版を使うので upgrade しておきます

  • sudo pip install -r requirements.txt
  • sudo pip install apache_beam[gcp]
  • sudo pip install pillow
  • sudo pip install --upgrade tensorflow

tensorflow の動作確認

  • python

で対話形式で以下を入力してみましょう
エラーなく動作すれば tensorflow のインストールが完了しています

Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> exit()

サービスアカウントの作成

ML Engine の API をコールするので認証用のサービスアカウントを作成します
ml_engine2.png

ダウンロードできた JSON ファイルをクラウドコンソールに配置しましょう
一番簡単なのはファイルの中身をコピペする方法かなと思います
認証用の JSON を環境変数を設定しましょう
[username] の部分は各自変更してください

  • export GOOGLE_APPLICATION_CREDENTIALS="/home/[username]/auth.json"

念の為動作確認でモデルの一覧を表示しましょう
まだ 1 つも作成されてないですが正常に動作することを確認しましょう

  • gcloud ml-engine models list

Cloud Storage にバケットを作成する

学習データや結果は Cloud Storage に配置されるので専用のバケットを作成しましょう

  • PROJECT_ID=$(gcloud config list project --format "value(core.project)")
  • BUCKET_NAME=${PROJECT_ID}-mlengine
  • REGION=us-central1
  • gsutil mb -l $REGION gs://$BUCKET_NAME

これで Cloud Storage のコンソールから確認するとバケットが作成されています
ml_engine3.png

必要な変数の宣言

すべて読み込み専用で宣言します
[your-bucket-name] の部分は先程作成したバケット名に変更してください

  • declare -r BUCKET_NAME="gs://[your-bucket-name]"
  • declare -r REGION="us-central1"
  • declare -r PROJECT_ID=$(gcloud config list project --format "value(core.project)")
  • declare -r JOB_NAME="flowers_${USER}_$(date +%Y%m%d_%H%M%S)"
  • declare -r GCS_PATH="${BUCKET_NAME}/${USER}/${JOB_NAME}"
  • declare -r DICT_FILE=gs://cloud-ml-data/img/flower_photos/dict.txt
  • declare -r MODEL_NAME=flowers
  • declare -r VERSION_NAME=v1

Cloud Dataflow での前処理

ここからは学習に必要な各種データを Cloud Dataflow と python を使って行います

評価データの前処理

まずはテスト用のデータの作成を行います

  • cd cloudml-samples-master/flowers
  • python trainer/preprocess.py --input_dict "$DICT_FILE" --input_path "gs://cloud-ml-data/img/flower_photos/eval_set.csv" --output_path "${GCS_PATH}/preproc/eval" --cloud

結構時間がかかります
Cloud Dataflow のコンソールを見るとジョブが走っているのが確認できると思います
ml_engine5.png

ml_engine6.png

実行中のジョブを確認するには gcloud コマンドでも可能です

*gcloud beta dataflow logs list 2018-08-27_17_50_22-5918041335734527976 --importance=detailed

評価データの作成は 12分7秒 で終了しました
ml_engine7.png

トレーニングデータの前処理

次に学習に必要な訓練データの作成を行います
こちらの方がデータが多いので少し時間がかかります

  • python trainer/preprocess.py --input_dict "$DICT_FILE" --input_path "gs://cloud-ml-data/img/flower_photos/train_set.csv" --output_path "${GCS_PATH}/preproc/train" --cloud

処理が始まると先ほどと同様 Cloud Dataflow 上にジョブが作成されます
完了するまで待ちましょう
15分52秒 かかりました
ml_engine8.png

Cloud Storage 上に評価データとトレーニングデータが作成できました
これを使ってモデルの生成と評価を行います
ml_engine9.png

ML Engine での作業

ここからモデルの生成と評価を ML Engine を使って行います

モデルの生成

gcloud ml-engine jobs submit training "$JOB_NAME" \
    --stream-logs \
    --module-name trainer.task \
    --package-path trainer \
    --staging-bucket "$BUCKET_NAME" \
    --region "$REGION" \
    --runtime-version=1.4\
    -- \
    --output_path "${GCS_PATH}/training" \
    --eval_data_paths "${GCS_PATH}/preproc/eval*" \
    --train_data_paths "${GCS_PATH}/preproc/train*"

先程生成した評価データと訓練データを使います
ML Engine のダッシュボードを開くとモデルを生成するジョブがあることを確認できると思います
ml_engine10.png

実行中のログの確認はコマンド or TensorBoard を使います

  • gcloud ml-engine jobs stream-logs "$JOB_NAME"

or

  • OUTPUT_PATH="${GCS_PATH}/training"
  • tensorboard --logdir=$OUTPUT_PATH --port=8080

Google Cloud Shell の上部にある「ウェブでプレビュー」を選択し 8080 ポートを入力すれば TensorBoard を確認することができます
ml_engine12.png

完了すると以下のようにモデルが生成されます
モデルの生成には 12分23秒 かかりました
ml_engine11.png

モデルのデプロイ

生成したモデルはそのままでは使えません
モデルとしてデプロイした上でバージョンを付与することで利用できます

  • gcloud ml-engine models create "$MODEL_NAME" --regions "$REGION"
  • gcloud ml-engine versions create "$VERSION_NAME" --model "$MODEL_NAME" --origin "${GCS_PATH}/training/model" --runtime-version=1.4

少し時間がかかるので待ちましょう
モデルのデプロイが完了すると ML Engine のモデル一覧に表示されます
ml_engine13.png

モデルの評価

ではテストしてみます
今回は画像の分類なので画像を使ってテストします
まずは対象の画像をダウンロードします

  • gsutil cp gs://cloud-ml-data/img/flower_photos/daisy/100080576_f52e8ee070_n.jpg daisy.jpg

これを ML Engine にリクエストできるように JSON に落とし込みます

  • python -c 'import base64, sys, json; img = base64.b64encode(open(sys.argv[1], "rb").read()); print json.dumps({"key":"0", "image_bytes": {"b64": img}})' daisy.jpg &> request.json

ここで作成された request.json を使って ML Engine にリクエストしてみましょう

  • gcloud ml-engine predict --model ${MODEL_NAME} --json-instances request.json

結果は 99.8% の精度になりました
つまりこの画像は 99.8% の確率で学習した画像だと言えるということです

KEY  PREDICTION  SCORES
0    0           [0.9989761114120483, 0.0001314109977101907, 0.00015020737191662192, 0.0005003452533856034, 0.00022650569735560566, 1.5491037629544735e-05]

お掃除

  • Cloud Storage の対象のバケット
  • ML Engine の対象モデル
  • 対象のサービスアカウント

を削除すれば OK です
Cloud Dataflow ジョブのフロート ML Engine のジョブのフローは削除できないようです
料金もかからないのでそのままでも問題ないですがどうしても削除したい場合はプロジェクトごと削除してください

最後に

Google ML Engine を使って Tensorflow のモデルの生成と評価を行ってみました
学習の前段階では Cloud Dataflow を使って学習データと評価データの生成も行いました
ML Engine の仕組みとしては Cloud Storage にある学習データと評価データと読み込んでモデルを生成するので学習データのと評価データの作成は自身の環境で行って、そのあとで Cloud Storage にアップロードしても問題ないと思います

コーディングした部分は前処理の部分だけでした
つまり別のデータを使って同じように前処理の部分で学習データと評価データを作成できれば同じように学習させることができるということになります

ほぼ Tensorflow の仕組みを知らなくても Tensorflow で使えるモデルを生成することができるので機械学習を知らない人でも気軽に機械学習できるサービスなのかなと思いました

ちなみに今回の作業で掛かったお値段は約 $0.5 ドルでした
学習データや評価データの量がもっと多いと金額もあがってくると思います

参考サイト

0 件のコメント:

コメントを投稿