クラウドではじめる機械学習:Google Cloud Machine Learningを使ってみよう

こんにちは、GMOアドマーケティングのMHです。

実際に機械学習をプロダクトに取り込む場合には大量のデータをどうやって扱うのか、大規模な学習を行うために必要なリソースは、、など考えることが色々と出てきます。

そのため、オンプレミスで大規模な機械学習環境を構築するのは中々ハードルが高いですが、Google Cloud Machine LearningやAmazon Machine Learning、Azure Machine Learning などをクラウド環境を利用することで手軽にスケール可能な機械学習環境を構築することが可能です。

今回は、Google Cloud Machine Learningを使ってクラウド上で機械学習を行ってみたいと思います。

Google Cloud Machine Learningとは

データ量に関係なくあらゆるデータの機械学習モデルを簡単に構築できるマネージド サービスとなります。
モデル構築には、Google フォト等の多くのGoogleプロダクトを支えているTensorFlowを使用できます。
データソースとして、Google Cloud Storage、Google BigQuery などにもアクセスすることができるため、既にGoogle Cloud Platformの製品を利用している場合は手軽に大規模な学習を行うことができます。

特徴の一つに、HyperTune でハイパーパラメータを自動的に調整することができます。
モデルに有効なハイパーパラメータを手動で見つけるよりも短時間でチューニングが可能です。

詳細は公式ページを参照してください。

Google Cloud Machine Learningを動かしてみよう

公式ページにあるチュートリアルを試すとどのように開発を行っていくのかが分かります。
ただし、日本語版は更新が遅いため、コマンド等は英語版を参照したほうがよいです。

今回は、上記チュートリアルのソースコードに Keras版のソースコードがありましたので試してみました。

元のチュートリアルと同じ内容をKeras版のソースコードで実行する形となっています

概要

Keras版でも元のチュートリアルと同様に、米国国勢調査データを元に所得区分を予測します。

チュートリアルを通して、以下について学ぶことが出来ます。

  • ローカルでの実行及び、TensorBoardを使用しての検証
  • クラウド上での単一インスタンスモードでの実行
  • モデルを使用してのオンライン予測およびバッチ予測取得

モデルの実行→検証というモデル構築の手順を実際に作業するすることで、Cloud ML Engineの使い方を理解することを目的としています。
そのため、モデルの中身やTensorflowやKerasについては触れません。

また、実際にGoogle Cloud Platform(GCP)上で動作をさせるため、料金が発生しますので注意をしてください。

詳細は元のチュートリアルページの料金を参照してください。

実行環境を準備するには幾つか方法がありますが、CloudShellを利用する方法が一番手軽なため、今回は、CloudShellを利用します。
実際のプロダクトで利用する場合はTry&Errorがやりやすいようにローカルで実行することが推奨されています。

プロジェクト作成

GCPのコンソールでプロジェクトを作成しておく必要があります。
もし、プロジェクトがない場合はクイックスタートの「始める前に」を参照して作成をしてください。

プロジェクトの設定

Google Cloud Platformのコンソール(GCPコンソール)にアクセスをして、右上にある以下のアイコンをクリックしてCloudShellを起動します。

つぎにCloudShell上でプロジェクトを表示します

表示されたプロジェクトの中からプロジェクトを選択します。

チュートリアルのサンプルダウンロード

Cloud ML Engineのチュートリアル用zipファイルをgithubからダウンロードします。

ファイルを解凍します。

サンプル実行するディレクトリに移動します。

トレーナーを利用してローカルで検証を行う

データを使ってトレーニングを行うためにトレーナーアプリケーションを作成する必要があります。
トレーナーの開発や検証はクラウド環境ではなくローカルで行うことで効率的な開発と検証が行うことが出来ます。
ここではトレーナーアプリケーションについては開発済み(サンプルそのまま利用)としています。

トレーニングデータ取得と依存関係の解決

Googleがチュートリアル用に公開している米国国勢調査収入データセットを取得します。
このデータは国勢調査データに基づいて所得が$50K/年を超えるかどうかを予測する為のデータセットとなっています。
通常、「アダルト」データセットとも呼ばれており、データの詳細についてはこちらを参照してください。

データをダウンロードします

ダウンロードしたデータを見てみると以下のようになっています

年齢や職業や最終学歴、結婚有無、給料外所得などのデータと共に年間の所得が$50Kを超えるかどうかを表しています。
データの詳細の意味についてはこちらに記載があります。

続いて、以下の環境変数を設定します。

  • TRAIN_DATA:トレーニング用データへのパスを示す
  • EVAL_DATA :検証用データへのパスを示す
  • MODEL_DIR :モデル出力用ディレクトリ

チュートリアルに必要な依存関係はrequirements.txtに記載されてますので、必要なライブラリをインストールします。

ローカルでのトレーナーの実行

それではトレーナーを実行させて学習をさせてみましょう
local train」コマンドを使用することでローカルでトレーニングが出来ます。

実行後に$MODEL_DIRに結果が出力されます。
再実行する場合は$MODEL_DIRを削除してから実行しないとエラーとなるので気をつけてください。

結果を確認するためにはTensorBoardを使用します。

TensorBoardを使用した結果の検証

TensorBoardはTensorFlowの結果を可視化するツールです。
弊社ブログでも紹介していますので興味がある方は参照をしてみてください。

それではTensorBoardを起動してみましょう

CloudShellでは以下をクリックすることでTensorBoardを表示できます。

TensorBordを通して検証をすることが出来ます。

クラウドでのトレーナー実行

ローカルで動作することが確認できましたので、クラウド上でトレーナーを動かしてみたいと思います。

Cloud Strageの準備

Cloud ML Engineはモデルのトレーニングやバッチ予測にてデータを読み書きするため、Cloud Strageにアクセスする必要があります。
このチュートリアルを動作させる際に使用するCloud Strageのバケットを作成します。
ここでは「プロジェクト名-mlengine」という名前のバケットを作成します。

続いてリージョンを選択します。
リージョンはCloud ML Engineのジョブを実行するのと同じリージョンを指定する必要があります。
また、指定するリージョンにはマルチリージョン(asia等)ではなく、ロケーション(asia-east1等)を指定する必要があります。

指定した環境変数を利用して新しいバケットを作成します

作成したバケットに学習用のデータをコピーします。

ローカルに設定してあったデータを示す環境変数をコピーしたCloud Strageを参照するように変更します。

クラウド上でのトレーナー実行

単一インスタンスでトレーナーを実行してみましょう。
初回はjobの開始に数分かかりますが、次回以降は直ぐに実行することが出来るため、検証、修正、再実行のサイクルが行いやすいようになっています。

最初のトレーニング実行時の名前を設定します。
反復して実行した際に分かりやすいように番号を付与しています。

トレーニング結果を格納するCloud Storage上のディレクトリを設定します。

それでは、クラウド上で動作させてみましょう。
実行するには「jobs submit training」コマンドを使います。

動作しているジョブはコマンドラインかGCPコンソールから確認できます
コマンドで確認する場合は「jobs describe」コマンドを使用します。

GCPコンソールの場合は以下から参照ができます。

GCPコンソールでは以下のように動作しているJobが一覧で表示されます。

出力結果の確認

出力がCloud Strageに生成されているか確認してみましょう

ローカルで実行したときと同じようなファイルが出力されていると思います。

Stackdriverログの確認

Cloud ML Engineが実行したトレーニングジョブの標準出力及び、標準エラー出力、ログはStackdriver Logging に保存されており、実行中、実行後問わずに参照が可能です。

参照するにはGCPコンソールのジョブ一覧から「ログを表示」を選択すれば参照が可能です。

ログを表示させるとローカルで実行したときと同じようなログが出力されていることがわかります。
accという文字を探すことでモデルの精度を確認することが出来ます。

TensorBoardを使用したモデルの確認

Cloud Strage上にある出力ファイルに対してもTensorBoardを利用することが出来ます。

GPUを利用したより高速な学習

今回は試しませんが、トレーニングジョブをGPUを備えたサーバにて実行することが出来ます。
GPUを利用することで複雑な学習モデルでも高速にトレーニングを行うことが出来ます。
jobs submit training」コマンドのオプションに設定ファイルを指定することでGPUを利用する事ができます。

詳細はこちらを参照してください。

モデルをデプロイする

検証が完了したら、モデルをデプロイします。
モデルをデプロイすることで、モデルを保持していなくても、予測を行うことが出来るようになります。

まずはモデル名を定義します。
モデル名は英字、数字、アンダースコアのみ使用でき、先頭は英字にする必要があります。

デプロイ先となるモデルを「models create」コマンドにて作成します。

次にモデルとして出力するデータを選択します。

出力ディレクトリにトレーニング時に出力されたモデルのバイナリデータがあることを確認します。

上記の出力から「$OUTPUT_PATH/export」というディレクトリを探し、環境変数MODEL_BINARIESに値を設定します。

最後に出力情報から「versions create」コマンドでバージョンv1のモデルを作成します。

models list」コマンドにて作成したモデルのリストが参照できます。

デプロイしたモデルを利用してオンライン予測する

それではデプロイしたモデルを利用してオンライン予測をしてみましょう

ここでは学習に利用したデータから入力データを生成します。
入力データは学習を行いやすいように元のCSVのデータ構造から変更されているため、同様の変更処理行っています。

予測を行うには「predict」コマンドを使用します。
先ほど作成したモデルに対して生成したデータを渡します。

バッチ予測の実行

予測はオンライン予測以外にもバッチ実行による予測をすることが出来ます。
バッチ予測はインスタンスをたくさん利用して、一気に大量のデータを予測する場合に有効です。

バッチ予測にて使用する入力データをCloud Strageにコピーします。

上記を参照する環境変数としてTEST_JSONを定義します。

ジョブの名前と出力ディレクトリを環境変数に設定します。

それでは、予測をバッチ実行をしてみます。
バッチ予測を行うには「jobs submit prediction」コマンドを使用します。

実行するとジョブがキューイングされて、コマンドはすぐに終了します。
ジョブの状態はの「jobs describe」コマンドで確認ができます。

上記コマンドで「state: SUCCEEDED」と表示されていればジョブは完了です。

また、他のジョブと同様にGCPコンソールのジョブ一覧でも状況は確認することが出来ます。

結果は出力ディレクトリに出力されます。

オンライン予測とバッチ予測の違いとしては以下があります。

  • 少ないインスタンスを利用した場合はバッチ予測のほうがより遅くなる。(逆に、多数のインスタンを利用する場合にはバッチ予測のほうが適してます。)
  • バッチ予測では入力順での出力は保証されていない。(オンライン予想では随時、結果を取得できるためこの点は問題になりません。バッチ予測でも数値インデックスを利用することで出力順を制御することが出来るようです。)

クリーンアップ

このチュートリアルではCloud Storageを利用していますので、データを置いておくと継続して料金が発生してしまいます。

追加での料金を回避する為に、トレーニングと予測実行の結果の分析の完了後には削除を行ったほうが良いです。

チュートリアルの最新のジョブは以下のコマンドにて削除することが出来ます。

削除を行うと以下のような表示がされます。

今回のチュートリアルでは他にもジョブを走らせていますので、継続的な料金を回避するために不要となったディレクトリは全て削除するようにしましょう。

手順通りにチュートリアル用にバケットを作成した場合は「gsutil rm -r」コマンドをバケットそのものに対して実行することでバケット内の全データを削除することができます。

削除後は「gsutil ls」にて削除されていることを確認しましょう。

おわりに

Cloud ML Engineを利用して、ローカル・クラウド環境にてモデルのトレーニング→検証を行い、モデルをデプロイすることが出来るようになりました。

ローカル環境でもクラウド環境でも同じソースで動かせ、直ぐに大規模な解析にも対応できるようになるのは魅力に感じました。

元のチュートリアルと比較してもらうと分かるのですが、ほぼ公式チュートリアルと同じ内容となっています。
もう少し本格的に使い始めないと分からないですが、基本的な構成を守れば、TensorFlowでもKerasでもCloud ML Engineの使い方は基本同じということだと思います。

元のチュートリアルでは、分散モードでの実行ハイパーパラメータの自動チューニングについても触れています。
興味があれば実行してみると良いと思います。

今回は、Cloud ML Engineを利用してどのように開発を行って行くのかに焦点を当てていますので手順の中では触れていないのですが、サンプルのモデルで予測をすると結果が残念な事になっていました。
余裕がれば勉強代わりにサンプルのソースを読んでみたいと思います。