最近、機械学習・深層学習というワードをよく耳にするようになりましたね。機械学習は知っているけど、実際に使ったことは無いという方もいるのでは無いでしょうか。昨年、Googleから機械学習のためのクラウド サービスが発表されました。それが、Google Cloud Machine Learningです。
Google Cloud Machine Learning は、サイズを問わず、あらゆるデータの機械学習モデルを簡単に構築できるマネージド プラットフォーム(Google Cloud Platformで提供)です。Google Cloud Machine Learning(以下Cloud ML)の裏では、Googleが開発した機械学習ライブラリであるTensorFlowが使われています。しかし、TensorFlowや機械学習の知識が無くても、Cloud MLは簡単に試すことができます。
今回は、機械学習のチュートリアルでよく使われるMNISTを使った画像分析をCloud MLで実行したいと思います。MNISTは、手書き数字の画像データと、正解のラベルが入ったデータセットです。このデータセットを使って機械学習モデルをトレーニングさせます。すると機械学習モデルは、手書き数字画像がどの数字を表すかを予測できるようになります。トレーニング用のスクリプトやデータセットはすでに用意されているので、コマンドを実行していくだけで完了です。ぜひお試しください。
※Cloud MLは現状ベータ版ですので、仕様が変更される可能性がありますのでご注意ください。
MNISTは、上の画像のような手書き数字の画像で構成され、それぞれに正解ラベルが割り当てられています。(MNIST For ML Beginnersより引用)
目次
Google Cloud Machine Learning とは
Cloud MLとは、Googleが自社で使っているクラウド機械学習機能を一般ユーザーが利用できるようにしたサービスです。(2017年2月現在、ベータ版として提供されています。)
モデルの構築には、Google フォトから Google Cloud Speech まで多くの Google プロダクトを支えている強力な TensorFlow フレームワークを使用しています。Google のグローバルな負荷分散サービスと統合しているため、機械学習アプリケーションを自動的にスケーリングでき、全世界のユーザーに提供できます。
Cloud Machine Learning の料金
Cloud MLでは、モデルのトレーニングや予測の実行に対して料金が発生します。ただし、クラウド内の機械学習リソースの管理は無料で行うことができます。各アクションの料金詳細を後に記述します。
アクション | 米国 | ヨーロッパ/アジア |
---|---|---|
モデル トレーニング | ML トレーニング ユニットごとに1時間あたり $0.49 | ML トレーニング ユニットごとに1時間あたり $0.54 |
バッチ予測 | 予測1,000回あたり $0.10、プラス1時間あたり $0.40 | 予測1,000回あたり $0.11、プラス1時間あたり $0.44 |
※ここに記載されている費用の他に、Cloud ML のライフサイクルの間、モデルやリソースを Google Cloud Storage バケットに保存する必要があります。たとえば、モデルをトレーニングする際のトレーナー パッケージの投稿や、バージョンをデプロイする準備が完了したときのモデルファイルの保存などが該当します。また、トレーニングやバッチ予測の出力も Cloud Storage バケットに保存されます。いずれのケースでも、Cloud ML に関して長期的な保存は不要です。オペレーションが完了したら、すぐにファイルを削除できますのでよほど大規模に利用しない限りは費用面で大きな負担にはならないでしょう。
Cloud ML の トレーニング料金
MLトレーニングユニット
ユーザーは、ジョブをトレーニングする際に使用する処理クラスタのタイプを調整できます。簡単な方法として、「スケール階層」という事前に定義された構成の中から 1 つを選択することもできます。各スケール階層は、料金の基準となる ML トレーニング ユニット数が異なります。
スケール階層 | ML トレーニング ユニット |
---|---|
BASIC | 1 |
STANDARD_1 | 10 |
PREMIUM_1 | 75 |
CUSTOM | 構成によって変わります。 |
トレーニング料金は、以下の様に計算されます。
(MLトレーニングユニット数) × (1ユニット毎の料金) × (ジョブ実行時間[分]) ÷ 60
以下に例を示します。
米国に住むデータ科学者が、STANDARD_1 スケール階層を選択して、トレーニング ジョブを実行したとします。このジョブに 15 分かかりました。
10(MLトレーニングユニット) × $0.49 × 15(分) ÷ 60 = 1.23
このジョブの料金は、総額 $1.23 となります。
Cloud ML の 予測料金
バッチ予測
バッチ予測では、予測回数(※1)と処理時間(※2)に対して料金が発生します。
リージョン | 標準価格 | 大量利用割引価格(※3) |
---|---|---|
米国 | 予測 1,000 回あたり $0.10 プラス 1 ノード時間あたり $0.40 |
予測 1,000 回あたり $0.05 プラス 1 ノード時間あたり $0.40 |
ヨーロッパ/アジア | 予測 1,000 回あたり $0.11 プラス 1 ノード時間あたり $0.44 |
予測 1,000 回あたり $0.05 プラス 1 ノード時間あたり $0.44 |
※1 予測回数は 1 か月ごとに累積され、料金はセントの単位に四捨五入されます。
※2 処理を実行すると、トレーニング ジョブごとに分単位で課金されます。最低料金として 10 分間分の料金が必ず発生します。
※3 大量利用割引価格は、その月のリクエストが 1 億回に達した後から適用されます。
オンライン予測
Cloud ML の他の機能はベータ版ですが、オンライン予測サービスはアルファ版機能として提供されます。オンライン予測がアルファ版の間は、この機能に限り無料でご利用いただけます。(2017年2月現在)
実際にCloud MLを動かしてみる
では、実際にCloud MLを動かしてみましょう。Cloud MLの操作は主にシェル上で行います。ローカル環境でも実行できますが、ローカル環境にソフトウェアをインストールする必要があります。クラウド環境で実行できるCloud Shellをお勧めします。今回はCloud Shellを使ってCloud MLを動かして行きましょう。実行の手順は以下の通りです。
- Cloud MLの実行に必要な環境を揃える
- トレーニングを行う
- モデルを作成する
- 手書き数字を予測させる
Cloud MLの実行に必要な環境を揃える
最初に行うのは、プロジェクトの設定と必要なファイルのインストールです。
必要なAPIを有効にする
メニューバーから「API Manager」を選択し、以下のAPIを有効にします。
(既に有効になっていれば、変える必要はありません)
- Cloud Machine Learning API
- Compute Engine API
- Cloud Logging API
- Cloud Storage API
- Cloud Storage JSON API
- BigQuery API
環境設定をする
プロジェクトの設定が終わったら、Cloud Shell上で環境設定を行います。
Cloud Shellを開くには、コンソール画面右上のアイコンをクリックします。
# Cloud MLの実行に必要なツールをインストールします。
curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/tools/setup_cloud_shell.sh | bash
# パスに新たにインストールされたツールを追加します。
export PATH=${HOME}/.local/bin:${PATH}
使用環境を確認する
インストールが完了したら以下のコマンドを実行し、適切な環境が設定されているかを確認します。
curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/tools/check_environment.py | python
Cloud ML プロジェクトを初期化する
Cloud MLがGoogle Cloudプロジェクト内のリソースにアクセスすることを許可します。
gcloud beta ml init-project
Cloud Storage上にバケットを追加する
Cloud MLは、モデルのトレーニングやバッチ予測の間にデータを読み書きするため、Cloud Storage のロケーションにアクセスする必要があります。Cloud StorageにCloud ML用のバケットを追加しましょう。名前は何でもいいですが、今回はプロジェクト名に「-ml」を付加したバケット名を設定します。
# プロジェクト名を取得します。
PROJECT_ID=$(gcloud config list project --format "value(core.project)")
# バケット名を作成します。(「プロジェクト名」 + 「-ml」)
BUCKET_NAME=${PROJECT_ID}-ml
# 新しいバケットを作成します。
gsutil mb -l [リージョン名] gs://$BUCKET_NAME
以上が完了したら、Cloud MLの準備は完了です。
トレーニングする
Cloud MLの準備が完了したら、機械学習モデルを作成するためのトレーニングを行います。トレーニングの実行手順は以下の通りです。
- ローカルでトレーニングできるかを確認する
- クラウド上にトレーニング スクリプトを送信する
ローカルでトレーニングする
クラウド上でのトレーニングの前に、ローカルでトレーニングができるかを確認しておきます。通常はデータセットの小さなサンプルを用意してトレーニングします。しかし、今回は70,000枚ほどの小さなデータセットを使います。なので、そのままのデータセットを使ってトレーニングします。
※この作業は必須ではありませんので、スキップしても構いません。
# 作業ディレクトリを変更します。
cd ~/google-cloud-ml/samples/mnist/deployable/
# 過去のトレーニングで出力したファイルを削除します。
rm -f data/{checkpoint,events,export}*
# ローカルでのトレーニングを行います。
gcloud beta ml local train \
--package-path=trainer \
--module-name=trainer.task

クラウド上でトレーニングする
ローカルでのトレーニングが完了したら、トレーニング ジョブの送信を行います。
# ジョブの名前を設定します。(以下はジョブ名の一例です。)
JOB_NAME=mnist_deployable_${USER}_$(date +%Y%m%d_%H%M%S)
# プロジェクト名を取得します。
PROJECT_ID=`gcloud config list project --format "value(core.project)"`
# Cloud Storageのバケットのアドレスを設定します。(「プロジェクト名」+「-ml」)
TRAIN_BUCKET=gs://${PROJECT_ID}-ml
# トレーニングデータを出力するパスを設定します。
TRAIN_PATH=${TRAIN_BUCKET}/${JOB_NAME}
# 過去のトレーニングで出力したファイルを削除します。
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= [リージョン名] \
-- \
--train_dir="${TRAIN_PATH}/train" \
--model_dir="${TRAIN_PATH}/model"
ジョブが完了すると、state: SUCCEEDED と表示され、ジョブ一覧に新しいジョブが追加されます。
Cloud Storageを見ると、作成したバケットにジョブ名と同じ名前のディレクトリが追加されています。
モデルを作成する
モデルを作成する方法は2通りあります。
Cloud Shellで作成する
# モデル名を設定します。(以下はモデル名の一例です。)
MODEL_NAME=mnist_${USER}_$(date +%Y%m%d_%H%M%S)
# Cloud MLモデルを作成します。
gcloud beta ml models create ${MODEL_NAME}
# 予測用バージョンを作成します。(最初に作成されたバージョンがデフォルトバージョンになります)
gcloud beta ml models versions create \
--origin=${TRAIN_PATH}/model/ \
--model=${MODEL_NAME} \
v1
GCPコンソールで作成する
GCPのコンソール上でモデルとバージョンを作成することも可能です。
- メニューから、[機械学習] > [モデル]を選択します。
- [モデルを作成]をクリックします。
- モデル名を入力します。
- [作成] をクリックします。
- モデル一覧画面に戻り、新しいモデルの名前をクリックします。
- [+ バージョンを作成] をクリックし、名前とソースを入力します。(ソースには${TRAIN_PATH}/model/を入力)
- [作成] をクリックし、モデル一覧画面に戻ります。
手書き数字を予測させる
手書き数字の識別パターンを学習したモデルが作成されました。これで、手書きの数字画像がどの数字を表しているのかをモデルに予測させる準備ができました。予測には作成したモデルと、予測させる画像データを使います。予測用のデータはJSONファイルとして用意されています。中身を少し見てみましょう。
head -n1 data/predict_sample.tensor.json

image属性には、浮動値のリストとして手書き数字の画像データ(モデルに予測させるもの)が含まれています。key属性には、JSON ファイル中の画像のインデックスが含まれています。
上記のデータを画像に変換したものがこちらです。これをモデルがどう識別するかを見ていきましょう。
オンライン予測サービスの使用
以下のコマンドを実行して、Cloud ML オンライン予測サービスに予測リクエストを送ります。モデル名・JSONファイル名を指定します。
gcloud beta ml predict --model=${MODEL_NAME} \
--json-instances=data/predict_sample.tensor.json

予測完了後の画面がこちらです。上の手書き画像と比較してみましょう。
最初の予測以外全て正解しています。10個中9個正解しているので、識別精度は9割といったところでしょうか。
今回は70,000枚ほどの小さなデータセットでトレーニングしました。もっと大きなデータセットでトレーニングすれば、精度が上がるかもしれません。
最後に一言
いかがでしたでしょうか。機会学習は奥が深く、なかなか始めるのは難しいと思いますが、この記事をきっかけに機械学習に興味を持ってもらえたら幸いです。
このブログでは、機械学習に止まらずGCPに関する情報を発信してまいりますので、引き続きapps-gcpをよろしくお願いします。また、弊社クラウドエース(Cloud Ace)では、GAEの受託開発、クラウドや機械学習に関するお悩み・ご相談をお受けしておりますので、お気兼ねなくお問い合わせください。