Google Cloud Machine Learning : 入門編 (3) – 予測
Google Cloud ML 入門編 (1) では Google Cloud ML パブリック Beta のクライアント環境のセットアップと MNIST のシングル・ワーカー・ジョブの投入までを試しました。
入門編 (2) では Cloud ML の TensorFlow 分散訓練の方法から始めてハイパーパラメータ調整を行ないました。
本記事 – 入門編 (3) では以下のドキュメントに従って :
予測 (prediction) を主題として Cloud ML 上で TensorFlow モデルをサービス提供する方法を扱います。Training クイックスタートでトレーニングしたものと同様なモデルに対してオンラインとバッチ予測リクエストの両方を送ることができます。
* あくまでベータですので仕様が変更される可能性はありますのでご注意ください。
Prediction クイックスタート
クラウド上で予測のためにモデルをアップデートする
クラウド上で予測を有効にするためには、Training クイックスタートで使用した TensorFlow MNIST サンプル・コードに小さな変更を行なう必要があります。
これらの変更については Exporting and Deploying Your Model for Prediction how-to に記述されていますが、このクイックスタートのためには既に変更を加えています; 単に作業ディレクトリを ~/google-cloud-ml/samples/mnist/deployable/ に移してください :
cd ~/google-cloud-ml/samples/mnist/deployable/
クラウドでアップデートしたモデルをトレーニングする
最初に、モデルがローカルでトレーニングできることを一応確認しておきます :
# Clear the output from any previous local run. rm -f data/{checkpoint,events,export}* # Train locally. python -m trainer.task
トレーニングの最後に、export された最終的なモデルは data/export と data/export.meta ファイル群に置かれます :
$ ls -1 data/ checkpoint checkpoint-1999 checkpoint-1999.meta checkpoint-999 checkpoint-999.meta eval_sample.tensor.json events.out.tfevents.1477226741.cs-6860-devshell-vm-e1e01071-54f6-495c-bcec-d79c9d38047f-114 export export.meta predict_sample.tensor.json
次に、トレーニング・ジョブのための名前を選択します、e.g. “mnist_deployable_yourusername”.
英字で始まり、英数字とアンダースコアを含みます。
JOB_NAME=<your job name>
そしてトレーニング・スクリプトをクラウドに submit します :
$ PROJECT_ID=`gcloud config list project --format "value(core.project)"` $ echo $PROJECT_ID classcat-tensorflow $ TRAIN_BUCKET=gs://${PROJECT_ID}-ml $ echo $TRAIN_BUCKET gs://classcat-tensorflow-ml $ TRAIN_PATH=${TRAIN_BUCKET}/${JOB_NAME} $ echo $TRAIN_PATH gs://classcat-tensorflow-ml/mnist_deployable_classcat # Clear the output from any previous cloud run. $ gsutil rm -rf ${TRAIN_PATH} $gcloud beta ml jobs submit training ${JOB_NAME} \ --package-path=trainer \ --module-name=trainer.task \ --staging-bucket="${TRAIN_BUCKET}" \ --region=us-central1 \ -- \ --train_dir="${TRAIN_PATH}/train" \ --model_dir="${TRAIN_PATH}/model"
実行直後です :
createTime: '2016-10-23T12:57:33Z' jobId: mnist_deployable_classcat state: QUEUED trainingInput: args: - --train_dir=gs://classcat-tensorflow-ml/mnist_deployable_classcat/train - --model_dir=gs://classcat-tensorflow-ml/mnist_deployable_classcat/model packageUris: - gs://classcat-tensorflow-ml/cloudmldist/1477227451/trainer-0.0.0.tar.gz pythonModule: trainer.task region: us-central1 masao_cc@classcat-tensorflow:~/google-cloud-ml/samples/mnist/deployable$ gcloud beta ml jobs describe --project ${PROJECT_ID} ${JOB_NAME} createTime: '2016-10-23T12:57:33Z' jobId: mnist_deployable_classcat state: PREPARING trainingInput: args: - --train_dir=gs://classcat-tensorflow-ml/mnist_deployable_classcat/train - --model_dir=gs://classcat-tensorflow-ml/mnist_deployable_classcat/model packageUris: - gs://classcat-tensorflow-ml/cloudmldist/1477227451/trainer-0.0.0.tar.gz pythonModule: trainer.task region: us-central1
最後に、ジョブの進行をチェックして終了を待ちます :
gcloud beta ml jobs describe --project ${PROJECT_ID} ${JOB_NAME}
クラウドにモデルを配備する
最初に、モデルの名前を選択します、e.g. “mnist_yourusername”。
英字で始まり、英数字とアンダースコアを含みます。
MODEL_NAME=<your model name>
そして予測のための Cloud ML モデルとバージョンを作成します :
gcloud beta ml models create ${MODEL_NAME} gcloud beta ml models versions create \ --origin=${TRAIN_PATH}/model/ \ --model=${MODEL_NAME} \ v1 gcloud beta ml models versions set-default --model=${MODEL_NAME} v1
alternative として、GCP コンソールでもモデルとバージョンを作成できます :
- “モデルを作成” をクリックします(または既に一つ以上のモデルがある場合には “+ モデルを作成”)。
- モデル名を入力します、 e.g. mnist_yourusername。
- “作成” をクリックします。
- 新しいモデルの名前をクリックします。
- “バージョンを作成する” または “+ バージョンを作成する” をクリックします。
- 次の情報を入力します :
- 名前 : v1
- ソース : ${TRAIN_PATH}/model/ の値 (ブラウズで選択できます)。
- “作成” をクリックします。
- モデルバージョン “v1” の隣の「デフォルトに設定」をクリックします(但し、1個だけの時は自動的にデフォルトに設定される感じです)。
クラウドで新しいインスタンスを予測する
これでモデルに予測リクエストを送ることができます。各インスタンスは JSON オブジェクトで、その属性は事前に宣言してあるテンソル・エイリアスです (“image”, “key”)。”image” 属性は float のリストとしての手書き数字画像データ(i.e. モデルに予測させたいもの)を含み、一方で “key” (i.e. JSON ファイルの画像のインデックス)は単一の integer です :
head -n2 data/predict_sample.tensor.json
以下と同様の出力が見れるはずです :
{"image": [0.0,..., 0.0, 0.0], "key": 0} {"image": [0.0,..., 0.0, 0.0], "key": 1}
オンライン予測サービスを使用する
【注意】Cloud ML オンライン予測サービスは現時点で(製品の他の機能は Beta ですが)Alpha フィーチャーです。オンライン予測は特に制限なく利用可能ですが、Cloud ML の他の機能よりもステーブルではなく信頼性が低いかもしれません。
次のスクリプトはファイルからインスタンスを読んでそれらを Cloud ML オンライン予測サービスに送ります :
gcloud beta ml predict --model=${MODEL_NAME} \ --instances=data/predict_sample.tensor.json
以下は出力結果です :
predictions: - key: 0 prediction: 3 scores: - 0.0203564 - 0.000128082 - 0.00255795 - 0.619445 - 3.96154e-05 - 0.335909 - 0.000672323 - 0.00473043 - 0.0136186 - 0.00254196 - key: 1 prediction: 0 scores: - 0.997337 - 7.48403e-09 - 3.81023e-05 - 8.05008e-05 - 3.44861e-07 - 0.00245502 - 2.90748e-05 - 1.94155e-05 - 3.20863e-05 - 8.17647e-06 - key: 2 prediction: 4 scores: - 0.00338854 - 0.00223743 - 0.0289303 - 0.0399133 - 0.672126 - 0.0051319 - 0.0154283 - 0.0249293 - 0.0218912 - 0.186024 - key: 3 prediction: 1 scores: - 3.44334e-06 - 0.962688 - 0.00933552 - 0.00441769 - 0.000420508 - 0.000595645 - 0.000220079 - 0.000721661 - 0.0209434 - 0.000654054 - key: 4 prediction: 9 scores: - 1.9798e-05 - 0.000375617 - 6.38733e-05 - 0.000149535 - 0.100276 - 0.000647383 - 0.000101338 - 0.0209089 - 0.00366108 - 0.873796 - key: 5 prediction: 2 scores: - 0.0048439 - 0.000105955 - 0.810874 - 0.00665644 - 0.000815119 - 0.00121918 - 0.00100165 - 0.0151151 - 0.0751259 - 0.0842431 - key: 6 prediction: 1 scores: - 5.99334e-08 - 0.987748 - 0.00203607 - 0.00626478 - 5.05617e-05 - 0.000297003 - 6.14583e-05 - 0.000487078 - 0.0024817 - 0.00057279 - key: 7 prediction: 3 scores: - 0.000191433 - 1.08367e-06 - 0.00137237 - 0.984816 - 1.26182e-05 - 0.00102288 - 6.42889e-07 - 5.89483e-05 - 0.0122277 - 0.000295992 - key: 8 prediction: 1 scores: - 5.161e-06 - 0.971483 - 0.00174534 - 0.00532335 - 0.000445978 - 0.00363754 - 0.000348157 - 0.00521967 - 0.00764051 - 0.00415152 - key: 9 prediction: 4 scores: - 0.000359493 - 0.000114784 - 0.000876791 - 0.000155708 - 0.95885 - 0.00325834 - 0.0195464 - 0.00022779 - 0.00797938 - 0.00863121
バッチ予測サービスを使用する
Cloud ML バッチ予測サービスも使用できます。
最初に、バッチ予測ジョブのための名前を選択します、”predict_mnist_yourusername”。
英文字から始まり英数字とアンダースコアを含みます。
JOB_NAME=<your job name>
次に、バッチ予測ジョブを submit します :
gsutil cp data/predict_sample.tensor.json ${TRAIN_PATH}/data/ gcloud beta ml jobs submit prediction ${JOB_NAME} \ --model=${MODEL_NAME} \ --data-format=TEXT \ --input-paths=${TRAIN_PATH}/data/predict_sample.tensor.json \ --output-path=${TRAIN_PATH}/output \ --region=us-central1
実行直後 :
createTime: '2016-10-23T13:20:35Z' jobId: predict_mnist_classcat predictionInput: dataFormat: TEXT inputPaths: - gs://classcat-tensorflow-ml/mnist_deployable_classcat/data/predict_sample.tensor.json modelName: projects/classcat-tensorflow/models/mnist_classcat outputPath: gs://classcat-tensorflow-ml/mnist_deployable_classcat/output region: us-central1 predictionOutput: outputPath: gs://classcat-tensorflow-ml/mnist_deployable_classcat/output state: QUEUED
実行中 :
$ gcloud beta ml jobs describe --project ${PROJECT_ID} ${JOB_NAME} createTime: '2016-10-23T13:20:35Z' jobId: predict_mnist_classcat predictionInput: dataFormat: TEXT inputPaths: - gs://classcat-tensorflow-ml/mnist_deployable_classcat/data/predict_sample.tensor.json modelName: projects/classcat-tensorflow/models/mnist_classcat outputPath: gs://classcat-tensorflow-ml/mnist_deployable_classcat/output region: us-central1 predictionOutput: outputPath: gs://classcat-tensorflow-ml/mnist_deployable_classcat/output startTime: '2016-10-23T13:20:35Z' state: RUNNING
終了を待ちます :
gcloud beta ml jobs describe --project ${PROJECT_ID} ${JOB_NAME}
最終的に、出力を読みます :
gsutil cat ${TRAIN_PATH}/output/prediction.results-00000-of-00001
以下は実際に確認できた出力です :
$ gsutil cat ${TRAIN_PATH}/output/prediction.results-00 000-of-00001 {u'prediction': 3, u'key': 0, u'scores': [0.020356435328722, 0.00012808165047317743, 0.002557950560003519, 0.6194452047348022, 3.9615388232050464e-05, 0.3359093964099884, 0.0006723233964294195, 0.004730433691293001, 0.013618593104183674, 0.002541961381 211877]} {u'prediction': 0, u'key': 1, u'scores': [0.9973371624946594, 7.484025843496056e-09, 3.8102345570223406e-05, 8.05008239694871e -05, 3.4486083677620627e-07, 0.0024550205562263727, 2.9074832127662376e-05, 1.9415505448705517e-05, 3.208634370821528e-05, 8.1 76466508302838e-06]} {u'prediction': 4, u'key': 2, u'scores': [0.003388544311746955, 0.0022374324034899473, 0.028930312022566795, 0.039913255721330 64, 0.6721255779266357, 0.005131898447871208, 0.015428278595209122, 0.024929305538535118, 0.02189120277762413, 0.1860242187976 8372]} {u'prediction': 1, u'key': 3, u'scores': [3.443341711317771e-06, 0.9626880884170532, 0.009335516951978207, 0.00441769091412425 , 0.0004205082659609616, 0.0005956447566859424, 0.00022007898951414973, 0.0007216611411422491, 0.020943380892276764, 0.0006540 539907291532]} {u'prediction': 9, u'key': 4, u'scores': [1.979799708351493e-05, 0.0003756166552193463, 6.387331086443737e-05, 0.0001495352771 5988457, 0.10027632117271423, 0.0006473834509961307, 0.00010133774776477367, 0.020908894017338753, 0.003661080962046981, 0.873 7961053848267]} {u'prediction': 2, u'key': 5, u'scores': [0.004843897186219692, 0.00010595522326184437, 0.8108737468719482, 0.0066564441658556 46, 0.000815118954051286, 0.0012191830901429057, 0.0010016539599746466, 0.01511511579155922, 0.07512589544057846, 0.0842430591 583252]} {u'prediction': 1, u'key': 6, u'scores': [5.993342000465418e-08, 0.9877484440803528, 0.0020360725466161966, 0.0062647750601172 45, 5.056171357864514e-05, 0.0002970028144773096, 6.145832594484091e-05, 0.0004870775737799704, 0.002481696894392371, 0.000572 7899260818958]} {u'prediction': 3, u'key': 7, u'scores': [0.00019143284589517862, 1.0836668025149265e-06, 0.0013723709853366017, 0.98481637239 45618, 1.2618214896065183e-05, 0.0010228765895590186, 6.428894607779512e-07, 5.8948346122633666e-05, 0.012227668426930904, 0.0 002959921257570386]} {u'prediction': 1, u'key': 8, u'scores': [5.1609990805445705e-06, 0.9714827537536621, 0.0017453399486839771, 0.005323346704244 614, 0.00044597769738174975, 0.0036375385243445635, 0.0003481570165604353, 0.005219669546931982, 0.007640512194484472, 0.00415 1524044573307]} {u'prediction': 4, u'key': 9, u'scores': [0.000359493336873129, 0.00011478372471174225, 0.0008767909603193402, 0.0001557076757 3080957, 0.9588501453399658, 0.00325834471732378, 0.0195463877171278, 0.00022778974380344152, 0.00797937996685505, 0.008631209 842860699]}
前述のオンライン予測サービスと比較すると、このサービスは :
- インスタンスの小さい数に対してはより遅いです(しかし大量のインスタンスに対してはより適しています)。
- 入力とは異なる順序で出力が返されるかもしれません。
以上