概要
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 有効化
Cloud Dataflow の API 有効化
(少し操作が違うのでご注意ください)
学習用のサンプルデータを取得
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 をコールするので認証用のサービスアカウントを作成します
ダウンロードできた 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 のコンソールから確認するとバケットが作成されています
必要な変数の宣言
すべて読み込み専用で宣言します
[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 のコンソールを見るとジョブが走っているのが確認できると思います
実行中のジョブを確認するには gcloud コマンドでも可能です
*gcloud beta dataflow logs list 2018-08-27_17_50_22-5918041335734527976 --importance=detailed
評価データの作成は 12分7秒 で終了しました
トレーニングデータの前処理
次に学習に必要な訓練データの作成を行います
こちらの方がデータが多いので少し時間がかかります
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秒 かかりました
Cloud Storage 上に評価データとトレーニングデータが作成できました
これを使ってモデルの生成と評価を行います
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 のダッシュボードを開くとモデルを生成するジョブがあることを確認できると思います
実行中のログの確認はコマンド 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 を確認することができます
完了すると以下のようにモデルが生成されます
モデルの生成には 12分23秒 かかりました
モデルのデプロイ
生成したモデルはそのままでは使えません
モデルとしてデプロイした上でバージョンを付与することで利用できます
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 のモデル一覧に表示されます
モデルの評価
ではテストしてみます
今回は画像の分類なので画像を使ってテストします
まずは対象の画像をダウンロードします
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 件のコメント:
コメントを投稿