はじめに

Cloud Machine Learning Engine を使用するには、機械学習と TensorFlow の詳しい知識が必要です。

概要

このドキュメントでは、Cloud Machine Learning Engine でのトレーニングと予測の入門的なエンドツーエンドのチュートリアルを提供します。国勢調査データセットを使用するサンプルのチュートリアルを進めていき、次の作業を行います。

  • TensorFlow トレーニング アプリケーションを作成し、それをローカルで検証します。
  • クラウドの単一ワーカー インスタンスでトレーニング ジョブを実行します。
  • クラウド内の分散トレーニング ジョブとしてトレーニング ジョブを実行します。
  • ハイパーパラメータ チューニングを使用して、ハイパーパラメータを最適化します。
  • 予測をサポートするモデルをデプロイします。
  • オンライン予測をリクエストし、レスポンスを確認します。
  • バッチ予測をリクエストします。

作業内容

このサンプルでは、米国国勢調査所得データセットに基づいて所得区分を予測するためにワイド&ディープモデルを構築します。2 つの所得区分(ラベルとも呼ばれる)は次のとおりです。

  • >50K: 50,000 ドル超
  • <=50K: 50,000 ドル以下

ワイド&ディープモデルでは、ディープ ニューラル ネット(DNN)を使用して、複雑な特徴や、それらの特徴間の相互作用に関して概要レベルの抽象化を学習します。次にワイド&ディープモデルは、DNN からの出力を、より簡単な特徴に対して実行される線形回帰と結合します。これにより、多くの構造化されたデータ問題に有効な、バランスの取れたパワーとスピードを実現できます。

ワイド&ディープモデルについて詳しくは、Google Research Blog の記事、ワイド&ディープ ラーニング: TensorFlow との結合による改善をご覧ください。

このサンプルでは、TensorFlow の既製の DNNCombinedLinearClassifier クラスを使用してモデルを定義します。国勢調査データセットに特有のデータ変換を定義してから、これらの変換された(可能性のある)特徴をモデルの DNN または線形部分に割り当てます。

料金

このチュートリアルでは、次のような Google Cloud Platform の課金対象コンポーネントを使用します。

  • Cloud Machine Learning Engine
    • トレーニング
    • 予測
  • Cloud Storage
    • トレーニング用の入力データ格納
    • トレーニング アプリケーション パッケージのステージング
    • トレーニングによる出力の保存
    • バッチ予測で使用する入力データの保存

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

クラウド環境の設定とテスト

次の操作を行って GCP アカウントを設定し、Cloud ML Engine API を有効にします。さらに、Cloud SDK をインストールして有効にします。

GCP プロジェクトの設定

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Cloud Machine Learning Engine と Compute Engine API(複数)を有効にする。

    Enable the APIs

  5. 認証情報の設定:
    1. GCP Console で [サービス アカウント キーの作成] ページに移動します。

      [サービス アカウント キーの作成] ページに移動
    2. [サービス アカウント] プルダウン リストから [新しいサービス アカウント] を選択します。
    3. [サービス アカウント名] フィールドに名前を入力します。
    4. [役割] プルダウン リストで、[プロジェクト] > [オーナー] を選択します。

      : [役割] フィールドの設定により、リソースにアクセスするサービス アカウントが承認されます。このフィールドの設定は、後で GCP Console を使用して表示したり変更したりできます。本番環境アプリケーションを開発している場合は、[プロジェクト] > [オーナー] よりも詳細な権限を指定します。詳しくはサービス アカウントへの役割の付与をご覧ください。
    5. [作成] をクリックします。キーが含まれている JSON ファイルがパソコンにダウンロードされます。
  6. 環境変数 GOOGLE_APPLICATION_CREDENTIALS をサービス アカウント キーが含まれる JSON ファイルのファイルパスに設定します。

  7. Cloud SDK をインストールし、初期化します

環境の設定

以下のいずれかのオプションを選択して、macOS のローカル環境または Cloud Shell のリモート環境を設定します。

macOS の場合、以下の [MACOS] タブで環境を設定することをおすすめします。[CLOSE SHELL] タブに表示される Cloud Shell は、macOS、Linux、Windows で使用できます。Cloud Shell は、Cloud Machine Learning Engine の機能を試すような場合には便利ですが、継続的な開発作業には適していません。

macOS

  1. Python のインストールを確認する
    Python がインストールされていることを確認します。まだの場合はインストールします。

    python -V
  2. pip のインストールを確認する
    pip は現在のバージョンの Python に含まれる Python のパッケージ マネージャーです。pip --version を実行して、pip がインストール済みかどうかを確認します。インストールされていない場合は、pip のインストール方法をご覧ください

    次のコマンドを使用すると pip をアップグレードできます。

    pip install -U pip

    詳細については、pip のドキュメントをご覧ください。

  3. virtualenv をインストールする
    virtualenv は、隔離された Python 環境を作成するためのツールです。virtualenv --version を実行して、virtualenv がインストール済みかどうかを確認します。インストールされていない場合は、virtualenv をインストールします

    pip install --user --upgrade virtualenv

    このガイド用の独立した開発環境を作成するために、virtualenv で新しい仮想環境を作成します。たとえば、次のコマンドを実行すると、cmle-env という名前の環境が有効になります。

    virtualenv cmle-env
    source cmle-env/bin/activate
  4. このチュートリアルでは、仮想環境内で残りのコマンドを実行します。

    詳細については、virtualenv の使用法をご覧ください。virtualenv を終了するには deactivate を実行します。

Cloud Shell

  1. Google Cloud Platform Console を開きます。

    Google Cloud Platform Console

  2. コンソール ウィンドウの上部にある [Google Cloud Shell を有効にする] ボタンをクリックします。

    Google Cloud Shell の有効化

    コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。シェル セッションが初期化されるまで、数秒かかる場合があります。

    Cloud Shell セッション

    Cloud Shell セッションが使用できる状態になります。

  3. 選択したプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project [selected-project-id]

    [selected-project-id] はプロジェクト ID です。ID を囲んでいる角かっこは不要です。

Google Cloud SDK のコンポーネントを確認する

Google Cloud SDK のコンポーネントがインストールされていることを確認する手順は次のとおりです。

  1. モデルの一覧を作成します。

    gcloud ml-engine models list
  2. モデルが作成されていない場合は、空のリストが返されます。

    Listed 0 items.

    モデルの作成を開始した後は、このコマンドを使用するとそのモデルがリストに表示されます。

  3. 以前に gcloud をインストールしている場合は、gcloud を更新します。

    gcloud components update

TensorFlow をインストールする

TensorFlow をインストールするには、次のコマンドを実行します。

pip install --user --upgrade tensorflow

TensorFlow のインストール方法の詳細については、TensorFlow のドキュメントをご覧ください。

TensorFlow のインストールのトラブルシューティングについては、TensorFlow のインストールに関する一般的な問題をご覧ください。

単純な TensorFlow Python プログラムを実行する

簡単な Python プログラムを実行して、TensorFlow のインストールをテストします。Cloud Shell を使用している場合は、TensorFlow がすでにインストールされています。

  1. Python の対話型シェルを起動します。

    python
    
  2. TensorFlow をインポートします。

    >>> import tensorflow as tf

  3. 文字列を格納する定数を作成します。

    >>> hello = tf.constant('Hello, TensorFlow!')

  4. TensorFlow セッションを作成します。

    >>> sess = tf.Session()

    特定の命令を使用するための TensorFlow ライブラリがコンパイルされていないという警告は無視してかまいません。

  5. hello の値を表示します。

    >>> print(sess.run(hello))

    成功した場合は、次のように出力されます。

    Hello, TensorFlow!

  6. Python の対話型シェルを停止します。

    >>> exit()

Python バージョンのサポート

Cloud ML Engine は、デフォルトで Python 2.7 を実行します。このチュートリアルのサンプルは Python 2.7 を使用します。

Cloud ML Engine ランタイム バージョン 1.4 以上を使用している場合は、トレーニングで Python 3.5 を使用できます。Python 2 または Python 3 でトレーニングを行ったかどうかにかかわらず、オンライン予測とバッチ予測はトレーニングされたモデルで動作します。

Python 3.5 を使用したトレーニング ジョブの送信をご覧ください。

このチュートリアルのコードをダウンロードする

  1. サンプルを GitHub レポジトリからダウンロードします。

macOS

  1. Cloud ML Engine のサンプル zip ファイルをダウンロードして抽出します。

    zip ファイルをダウンロード

  2. ターミナル ウィンドウを開き、抽出された cloudml-samples-master ディレクトリを含むディレクトリに移動します。

  3. cloudml-samples-master > census > estimator ディレクトリに移動します。このチュートリアルのコマンドは、estimator ディレクトリから実行する必要があります。

    cd cloudml-samples-master/census/estimator
    

Cloud Shell

  1. 次のコマンドを入力して、Cloud ML Engine のサンプル zip ファイルをダウンロードします。

    wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
    
  2. ファイルを解凍して cloudml-samples-master ディレクトリを抽出します。

    unzip master.zip
    
  3. cloudml-samples-master > census > estimator ディレクトリに移動します。このチュートリアルのコマンドは、estimator ディレクトリから実行する必要があります。

    cd cloudml-samples-master/census/estimator
    

トレーニング アプリケーションをローカルで開発して検証する

トレーニング アプリケーションをクラウドで実行する前に、ローカルで実行します。ローカル環境は、効率的な開発と検証のワークフローを提供するため、迅速な反復処理が可能です。また、アプリケーションをローカルでデバッグする際にクラウド リソースの課金が発生することもありません。

トレーニング データの入手

関連データファイルの adult.dataadult.test は、一般公開された Cloud Storage バケットでホストされています。このサンプルで使用する Cloud Storage 上のバージョンはオリジナルのソースデータではなく、データが若干クリーニングされています。データの詳細についてはこちらをご覧ください。

データファイルは Cloud Storage から直接読み取ることができ、ローカル環境にコピーすることもできます。このサンプルでは、データをダウンロードしてローカルでトレーニングを行い、次に自分の Cloud Storage バケットにアップロードしてクラウドでトレーニングを行います。

  1. データをローカルのファイル ディレクトリにダウンロードし、ダウンロードしたデータファイルを指す変数を設定します。

    mkdir data
    gsutil -m cp gs://cloud-samples-data/ml-engine/census/data/* data/
    
  2. TRAIN_DATA および EVAL_DATA 変数をローカル ファイルパスに設定します。たとえば、次のコマンドは変数をローカルパスに設定します。

    TRAIN_DATA=$(pwd)/data/adult.data.csv
    EVAL_DATA=$(pwd)/data/adult.test.csv
    

データは、次の adult.data ファイルのプレビューに示すようにカンマ区切りの値形式で格納されます。

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K
...

依存関係のインストール

macOS

TensorFlow をローカルにインストールする場合、仮想環境の使用をおすすめします。次の項目をご覧ください。

Docker に精通している場合は、TensorFlow コンテナ内でこのチュートリアルを完了できます。詳細については、Docker で TensorFlow をインストールするをご覧ください。

このサンプルの中にある requirements.txt ファイルを使用すると、このプロジェクトに必要な依存関係をインストールできます。仮想環境内で次のコマンドを入力します。

  pip install --user -r ../requirements.txt

このコマンドを実行すると、チュートリアルで使用される TensorFlow 1.8 がインストールされます。

Cloud Shell

TensorFlow は Cloud Shell にインストールされていますが、サンプルの requirements.txt ファイルを実行して、サンプルで必要な TensorFlow と同じバージョンを使用していることを確認する必要があります。

  pip install --user -r ../requirements.txt

このコマンドを実行すると、チュートリアルで使用される TensorFlow 1.8 がインストールされます。

ローカル トレーニング ジョブを実行する

ローカル トレーニング ジョブは Python で記述されたトレーニング プログラムを読み込み、Cloud ML Engine でのライブのクラウド トレーニング ジョブとほぼ同じ環境でトレーニング プロセスを開始します。

  1. 出力ディレクトリを指定し、MODEL_DIR 変数を設定します。次のコマンドは、MODEL_DIRoutput の値を設定します。

    MODEL_DIR=output
    
  2. 出力ディレクトリに以前のトレーニングの実行からのデータが残っている場合は、ディレクトリの内容を削除することをおすすめします。次のコマンドは、output ディレクトリ内のすべてのデータを削除します。

    rm -rf $MODEL_DIR/*
    
  3. トレーニングをローカルで実行するには、次のコマンドを実行します。

    gcloud ml-engine local train \
        --module-name trainer.task \
        --package-path trainer/ \
        --job-dir $MODEL_DIR \
        -- \
        --train-files $TRAIN_DATA \
        --eval-files $EVAL_DATA \
        --train-steps 1000 \
        --eval-steps 100
    

デフォルトで、詳細ログはオフになっています。有効にするには、--verbosity タグを DEBUG に設定します。後のコマンド例で有効にする方法を示しています。

TensorBoard を使用した要約ログの検査

評価結果を表示するには、TensorBoard と呼ばれる可視化ツールを使用することができます。TensorBoard を使用すると、TensorFlow グラフを可視化したり、グラフの実行に関する定量メトリックをプロットしたり、グラフを通過するイメージなどの追加データを表示することができます。Tensorboard は、TensorFlow インストールの一部として利用できます。

以下の手順に従って、TensorBoard を起動し、トレーニング中、実行中および実行後に生成された概要ログをポイントします。

macOS

  1. TensorBoard を起動します。

    tensorboard --logdir=$MODEL_DIR
    
  2. TensorBoard が起動したら、ブラウザで http://localhost:6006 にアクセスします。

Cloud Shell

  1. TensorBoard を起動します。

    tensorboard --logdir=$MODEL_DIR --port=8080
    
  2. コマンドラインの上部にある [ウェブでプレビュー] メニューで、ポート 8080 でのプレビューを選択します。

[精度] をクリックすると、ジョブの進行状況に合わせて精度の変化のグラフィカル表現が表示されます。

Tensorboard 精度グラフ

TensorBoard は、コマンドラインで ctrl+c キーを押して、いつでもシャットダウンできます。

分散モードでローカル トレーニング ジョブを実行する

--distributed フラグを使用してローカル トレーニング ジョブを実行することによって、モデルが Cloud ML Engine の分散実行環境で動作するかどうかをテストできます。

  1. 出力ディレクトリを指定し、再度 MODEL_DIR 変数を設定します。次のコマンドは、MODEL_DIRoutput-dist の値を設定します。

    MODEL_DIR=output-dist
    
  2. output ディレクトリに以前のトレーニングの実行からのデータが残っている場合は、そのディレクトリの内容を削除してください。

    rm -rf $MODEL_DIR/*
    
  3. local train オプションを使用して --distributed コマンドを実行します。ユーザー引数とコマンドライン引数を区切る -- の上にフラグを配置してください。

    gcloud ml-engine local train \
        --module-name trainer.task \
        --package-path trainer/ \
        --job-dir $MODEL_DIR \
        --distributed \
        -- \
        --train-files $TRAIN_DATA \
        --eval-files $EVAL_DATA \
        --train-steps 1000 \
        --eval-steps 100
    

出力の検査

出力ファイルは --job-dir で指定したディレクトリに書き込まれます。この例では output-dist に設定されています。

ls -R output-dist/

次のような出力が表示されるはずです。

checkpoint
eval
events.out.tfevents.1488577094.<host-name>
export
graph.pbtxt
model.ckpt-1000.data-00000-of-00001
model.ckpt-1000.index
model.ckpt-1000.meta
model.ckpt-2.data-00000-of-00001
model.ckpt-2.index
model.ckpt-2.meta

output-dist//eval:
events.out.tfevents.<timestamp>.<host-name>
events.out.tfevents.<timestamp><host-name>
events.out.tfevents.<timestamp>.<host-name>

output-dist//export:
census

output-dist//export/census:
<timestamp>

output-dist//export/census/<timestamp>:
saved_model.pb
variables
...

ログの検査

単一インスタンスのトレーニング ジョブと同じように、TensorBoard を使用して要約ログを調べます。ただし、--logdir の値を分散モードで使用した出力ディレクトリ名と一致するように変更する必要があります。

macOS

  1. TensorBoard を起動します。

    tensorboard --logdir=$MODEL_DIR
    
  2. TensorBoard が起動したら、ブラウザで http://localhost:6006 にアクセスします。

Cloud Shell

  1. TensorBoard を起動します。

    tensorboard --logdir=$MODEL_DIR --port=8080
    
  2. コマンドラインの上部にある [ウェブでプレビュー] メニューで、ポート 8080 でのプレビューを選択します。

Cloud Storage バケットを設定する

このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、Cloud ML Engine の実行に使用するプロジェクトに属していないバケットの場合は、明示的に Cloud ML Engine サービス アカウントにアクセス権を付与する必要があります。

  1. 新しいバケットに名前を指定します。名前は Cloud Storage のすべてのバケット全体で重複しないようにする必要があります。

    BUCKET_NAME="your_bucket_name"

    たとえば、プロジェクト名に -mlengine を追加して使用します。

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-mlengine
  2. 作成したバケット名を確認します。

    echo $BUCKET_NAME
  3. バケットのリージョンを選択し、`REGION` 環境変数を設定します。

    警告: バケットには、マルチリージョンのロケーション(us など)ではなく、1 つのリージョン(us-central1 など)を指定する必要があります。Cloud ML Engine サービスの利用可能なリージョンをご覧ください。たとえば、次のコードは REGION を作成して us-central1 に設定します。

    REGION=us-central1
  4. 新しいバケットを作成します。

    gsutil mb -l $REGION gs://$BUCKET_NAME

    注: 使用するリージョンは、Cloud ML Engine ジョブを実行するリージョンと同一にしてください。この例では us-central1 を使用しています。「使ってみる」の説明でこのリージョンが使用されているためです。

データファイルを Cloud Storage バケットにアップロードします。

  1. gsutil を使用して、2 つのファイルを Cloud Storage バケットにコピーします。

    gsutil cp -r data gs://$BUCKET_NAME/data
    
  2. これらのファイルを指すように TRAIN_DATA 変数と EVAL_DATA 変数を設定します。

    TRAIN_DATA=gs://$BUCKET_NAME/data/adult.data.csv
    EVAL_DATA=gs://$BUCKET_NAME/data/adult.test.csv
    
  3. 再度 gsutil を使用して JSON テストファイル test.json を Cloud Storage バケットにコピーします。

    gsutil cp ../test.json gs://$BUCKET_NAME/data/test.json
    
  4. このファイルを指すように TEST_JSON 変数を設定します。

    TEST_JSON=gs://$BUCKET_NAME/data/test.json
    

クラウド内で単一インスタンスのトレーニング ジョブを実行する

単一インスタンスと分散モードの両方で動作する検証済みトレーニング ジョブを使用することで、クラウド内でトレーニング ジョブを実行する準備が整いました。まず、単一インスタンスのトレーニング ジョブをリクエストします。

単一インスタンスのトレーニング ジョブを実行するには、デフォルトの BASIC スケール階層を使用します。最初のジョブ リクエストは開始に数分かかる場合がありますが、後続のジョブはより迅速に実行されます。これにより、トレーニング ジョブを開発する際にジョブを迅速に反復して検証できます。

  1. 後続のトレーニングの実行と区別するために、最初のトレーニングの実行名を選択します。たとえば、反復を表す番号を追加できます。

    JOB_NAME=census_single_1
    
  2. トレーニングおよび予測ジョブをリクエストする際、含める OUTPUT_PATH 変数を設定し、Cloud ML Engine によって生成される出力用のディレクトリを指定します。OUTPUT_PATH は、モデルのチェックポイント、概要、およびエクスポート用の Cloud Storage の場所を完全修飾パスで表します。前の手順で定義した BUCKET_NAME 変数を使用できます。

    ジョブ名を出力ディレクトリとして使用することをおすすめします。たとえば、以下の OUTPUT_PATH は、census-single-1 という名前のディレクトリを指しています。

    OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
    
  3. 以下のコマンドを実行して、単一のプロセスを使用するクラウドでトレーニング ジョブを送信します。ここでは、--verbosity タグを DEBUG に設定して、ロギング出力全体を検査し、精度、損失、およびその他の指標を取得できるようにします。出力には、このサンプルの目的では無視できる、他の多くの警告メッセージも含まれています。

    gcloud ml-engine jobs submit training $JOB_NAME \
        --job-dir $OUTPUT_PATH \
        --runtime-version 1.8 \
        --module-name trainer.task \
        --package-path trainer/ \
        --region $REGION \
        -- \
        --train-files $TRAIN_DATA \
        --eval-files $EVAL_DATA \
        --train-steps 1000 \
        --eval-steps 100 \
        --verbosity DEBUG
    

コマンドラインの出力を確認するか、Google Cloud Platform Console の [ML Engine] > [ジョブ] からトレーニング ジョブの進捗状況をモニタリングできます。

出力の検査

クラウドのトレーニングでは、出力は Cloud Storage に生成されます。このサンプルでは、出力は OUTPUT_PATH に保存されます。それらを一覧表示するには、次のコマンドを実行します。

gsutil ls -r $OUTPUT_PATH

ローカルのトレーニングからの出力(上記)に類似した出力が表示されます。

Stackdriver ログの検査

ログは、クラウド上のトレーニング コードの動作を理解するために便利な方法です。Cloud ML Engine がトレーニング ジョブを実行すると、すべての stdout および stderr ストリームとロギング ステートメントを取得します。このようなログは、Stackdriver Logging に保存されます。これらは実行中でも、実行後でも表示させることができます。

ジョブのログを検索する最も簡単な方法は、GCP Console で [ML Engine] > [ジョブ] を選択し、[ログの表示] をクリックすることです。

[すべてのログ] を選択したままにすると、すべてのワーカーのすべてのジョブが表示されます。また、特定のタスクを選択することもできます。master-replica-0 は、マスターの観点からのジョブ実行の概要を示します。

詳細ロギングを選択したため、ロギング出力全体を検査できます。ログの中から accuracy という用語を探します。

ML Engine ジョブの Stackdriver Logging コンソールのスクリーン ショット

ターミナルでこれらのログを表示するには、コマンドラインから次のコマンドを実行します。

gcloud ml-engine jobs stream-logs $JOB_NAME

gcloud ml-engine jobs stream-logs のすべてのオプションを参照してください。

TensorBoard を使用した要約ログの検査

TensorBoard を起動し、トレーニングの間に生成された要約ログを参照することにより、実行中でも、実行後でもトレーニング ジョブの動作を検査することができます。

トレーニング プログラムは Cloud Storage の場所に要約を直接書き込むため、TensorBoard はイベント ファイルを手動でコピーすることなく自動的に読み取ることができます。

macOS

  1. TensorBoard を起動します。

    tensorboard --logdir=$OUTPUT_PATH
    
  2. TensorBoard が起動したら、ブラウザで http://localhost:6006 にアクセスします。

Cloud Shell

  1. TensorBoard を起動します。

    tensorboard --logdir=$OUTPUT_PATH --port=8080
    
  2. コマンドラインの上部にある [ウェブでプレビュー] メニューで、ポート 8080 でのプレビューを選択します。

[精度] をクリックすると、ジョブの進行状況に合わせて精度の変化のグラフィカル表現が表示されます。

TensorBoard は、コマンドラインで ctrl+c キーを押して、いつでもシャットダウンできます。

クラウドで分散トレーニングを実行する

トレーニング ジョブを実行する際に Google のスケーラブルなインフラストラクチャを活用するには、トレーニング ジョブを分散モードで実行するように構成します。

このモデルを Cloud ML Engine の分散プロセスとして実行するのに、コードを変更する必要はありません。

分散ジョブを実行するには、--scale-tier を BASIC より上の階層に設定します。スケール階層について詳しくは、スケール階層のドキュメントをご覧ください。

  1. 分散トレーニング ジョブに、他のトレーニング ジョブと区別できるような名前を選択します。たとえば、dist を使用して分散を表し、番号を付加して反復を表すことができます。

    JOB_NAME=census_dist_1
    
  2. OUTPUT_PATH を指定すると、ジョブ間でチェックポイントを誤って再利用しないようにジョブ名を含めることができます。最後に定義してから新しくコマンドライン セッションを開始した場合は、BUCKET_NAME を再定義する必要があります。たとえば、以下の OUTPUT_PATH は、census-dist-1 という名前のディレクトリを指しています。

    OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
    
  3. 以下のコマンドを実行し、複数のワーカーを使用するクラウドでトレーニング ジョブを送信します。ジョブの開始には数分かかる場合があります。

    ユーザー引数とコマンドライン引数を区切る -- の上に --scale-tier を配置します。たとえば、以下のコマンドは、STANDARD_1 というスケール階層を使用します。

    gcloud ml-engine jobs submit training $JOB_NAME \
        --job-dir $OUTPUT_PATH \
        --runtime-version 1.8 \
        --module-name trainer.task \
        --package-path trainer/ \
        --region $REGION \
        --scale-tier STANDARD_1 \
        -- \
        --train-files $TRAIN_DATA \
        --eval-files $EVAL_DATA \
        --train-steps 1000 \
        --verbosity DEBUG  \
        --eval-steps 100
    

コマンドラインの出力を確認するか、Google Cloud Platform Console の [ML Engine] > [ジョブ] からジョブの進捗状況をモニタリングできます。

ログの検査

単一インスタンスのトレーニング ジョブと同じ方法で、Stackdriver のログと要約ログを調べます。

Stackdriver のログの場合: GCP Console の [ML Engine] > [ジョブ] でジョブを選択してから [ログの表示] をクリックするか、ターミナルで次のコマンドを使用します。

gcloud ml-engine jobs stream-logs $JOB_NAME

TensorBoard の場合:

macOS

  1. TensorBoard を起動します。

    tensorboard --logdir=$OUTPUT_PATH
    
  2. TensorBoard が起動したら、ブラウザで http://localhost:6006 にアクセスします。

Cloud Shell

  1. TensorBoard を起動します。

    tensorboard --logdir=$OUTPUT_PATH --port=8080
    
  2. コマンドラインの上部にある [ウェブでプレビュー] メニューで、ポート 8080 でのプレビューを選択します。

ハイパーパラメータの調整

Cloud ML Engine は、モデルの予測精度を最大限に高められるように、ハイパーパラメータ調整を行います。国勢調査のサンプルでは、hptuning_config.yaml という名前の YAML ファイルにハイパーパラメータ構成設定値を格納し、--config 変数を使用して、トレーニング リクエストにそのファイルを含めています。

  1. 新しいジョブ名を選択し、構成ファイルを参照する変数を作成します。

    HPTUNING_CONFIG=../hptuning_config.yaml
    JOB_NAME=census_core_hptune_1
    TRAIN_DATA=gs://$BUCKET_NAME/data/adult.data.csv
    EVAL_DATA=gs://$BUCKET_NAME/data/adult.test.csv
    
  2. OUTPUT_PATH を指定すると、ジョブ間でチェックポイントを誤って再利用しないようにジョブ名を含めることができます。最後に定義してから新しくコマンドライン セッションを開始した場合は、BUCKET_NAME を再定義する必要があります。たとえば、次の OUTPUT_PATH は、census_core_hptune_1 という名前のディレクトリを指しています。

    OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
    
  3. 次のコマンドを実行して、複数のワーカーを使用するだけでなくハイパーパラメータ調整も使用するトレーニング ジョブを送信します。

    gcloud ml-engine jobs submit training $JOB_NAME \
        --stream-logs \
        --job-dir $OUTPUT_PATH \
        --runtime-version 1.8 \
        --config $HPTUNING_CONFIG \
        --module-name trainer.task \
        --package-path trainer/ \
        --region $REGION \
        --scale-tier STANDARD_1 \
        -- \
        --train-files $TRAIN_DATA \
        --eval-files $EVAL_DATA \
        --train-steps 1000 \
        --verbosity DEBUG  \
        --eval-steps 100
    

ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要をご覧ください。

予測をサポートするモデルをデプロイする

  1. モデルの名前を選択します。先頭は英字にしてください。その後には英字、数字、アンダースコアのみ使用できます。例:

    MODEL_NAME=census
    
  2. Cloud ML Engine モデルを作成します。

    gcloud ml-engine models create $MODEL_NAME --regions=$REGION
    
  3. 使用するジョブ出力を選択します。次のサンプルでは、census_dist_1 というジョブを使用しています。

    OUTPUT_PATH=gs://$BUCKET_NAME/census_dist_1
    
  4. エクスポートしたトレーニング済みモデルのバイナリのフルパスを調べます。

    gsutil ls -r $OUTPUT_PATH/export
    
  5. $OUTPUT_PATH/export/census/<timestamp> というディレクトリを探し、このディレクトリ パス(末尾に : なし)をコピーして、環境変数 MODEL_BINARIES にその値を設定します。例:

    MODEL_BINARIES=gs://$BUCKET_NAME/census_dist_1/export/census/1487877383942/

    ここで、$BUCKET_NAME は Cloud Storage バケット名で、census_dist_1 は出力ディレクトリです。

  6. 次のコマンドを実行して、バージョン v1 を作成します。

    gcloud ml-engine versions create v1 \
    --model $MODEL_NAME \
    --origin $MODEL_BINARIES \
    --runtime-version 1.8
    

models list コマンドを使用して、モデルの一覧を取得できます。

gcloud ml-engine models list

デプロイ済みモデルにオンライン予測リクエストを送信する

モデルに予測リクエストを送信できるようになりました。たとえば、次のコマンドは、サンプル GitHub リポジトリの一部としてダウンロードした test.json ファイルを使用してオンライン予測リクエストを送信します。

gcloud ml-engine predict \
--model $MODEL_NAME \
--version v1 \
--json-instances \
../test.json

レスポンスには、test.json のデータエントリに基づく各ラベル(>50K<=50K)の確率が含まれます。これは予測される所得が 50,000 ドル超と 50,000 ドル以下のどちらであるかを示しています。

レスポンスは次のようになります。

CLASSES       PROBABILITIES
[u'0', u'1']  [0.9969545602798462, 0.0030454816296696663]

バッチ予測ジョブの送信

バッチ予測サービスは、大量のデータがあり、予測結果の受信にレイテンシ要件がない場合に便利です。これはオンライン予測と同じ形式を使用しますが、データを Cloud Storage に保存する必要があります。

  1. ジョブの名前を設定します。

    JOB_NAME=census_prediction_1
    
  2. 出力パスを設定します。

    OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
    
  3. 予測ジョブを送信します。

    gcloud ml-engine jobs submit prediction $JOB_NAME \
        --model $MODEL_NAME \
        --version v1 \
        --data-format TEXT \
        --region $REGION \
        --input-paths $TEST_JSON \
        --output-path $OUTPUT_PATH/predictions
    

前のコマンドとは異なり、このコマンドはすぐに戻ります。ジョブの進行を確認し、終了するのを待ちます。

gcloud ml-engine jobs describe $JOB_NAME

ジョブが完了すると、state: SUCCEEDED が表示されます。これには数分間かかる場合があります。また、次のコマンドを使用しても、端末でジョブログを確認できます。

gcloud ml-engine jobs stream-logs $JOB_NAME

または、GCP Console の [ML Engine] > [ジョブ] から進捗状況を確認できます。

ジョブが成功したら、以下の操作を実行できます。

  • 出力の要約を確認します。

    gsutil cat $OUTPUT_PATH/predictions/prediction.results-00000-of-00001
    

    出力は次のようになります。

    {"probabilities": [0.9962924122810364, 0.003707568161189556], "logits": [-5.593664646148682], "classes": 0, "logistic": [0.003707568161189556]}
    

  • gsutil ls コマンドを使用してジョブが生成した他のファイルの一覧を表示します。

    gsutil ls -r $OUTPUT_PATH
    

オンライン予測と比較した場合のバッチ予測:

  • インスタンスが少ない場合は遅くなります(インスタンスが多数ある場合に適しています)。
  • 入力とは異なる順序で出力を返す可能性があります(ただし、数値インデックスにより、それぞれの出力を対応する入力インスタンスに適合させることができます。このことは、オンライン予測では必要ありません。出力は元の入力インスタンスと同じ順序で返されるからです)。

予測が利用できるようになったら、次の手順としては、通常、これらの予測をデータベースまたはデータ処理パイプラインに取り込みます。

このサンプルでは、バッチ予測を実行する前にモデルをデプロイしましたが、バッチ予測ジョブを送信するときにモデルのバイナリ URI を指定することで、このステップをスキップできます。モデルをデプロイする前にそのモデルから予測を生成する利点の 1 つは、さまざまな評価データセットでモデルのパフォーマンスを評価して、そのモデルがデプロイ基準を満たすかどうかを判断できることです。

クリーンアップ

トレーニングと予測実行の出力の分析が完了している場合は、このガイドで使用されている Cloud Storage ディレクトリの GCP アカウントに追加料金が発生することを回避できます。

  1. ターミナル ウィンドウを開きます(まだ開いていない場合)。

  2. gsutil rm コマンドに -r フラグを付けて実行します。これで、最新のジョブが格納されているディレクトリが削除されます。

    gsutil rm -r gs://$BUCKET_NAME/$JOB_NAME
    

コマンドが正常終了した場合は、次のようなメッセージが返されます。

Removing gs://my-awesome-bucket/just-a-folder/cloud-storage.logo.png#1456530077282000...
Removing gs://my-awesome-bucket/...

このサンプル用に作成したディレクトリが他にもある場合は、このコマンドを繰り返し実行します。

バケットにその他のデータが格納されていない場合は、gsutil rm -r コマンドをバケットそのものに対して実行することもできます。

データについて

このサンプルのトレーニングに使用している国勢調査所得データセットは、UC Irvine Machine Learning Repository によってホストされています。

国勢調査データ転載元: Lichman, M. (2013). UCI Machine Learning Repository http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science.このデータセットは、データセット ソース(http://archive.ics.uci.edu/ml)で指定される次の条件の下ですべてのユーザーが使用できるように公開されています。Google はこのデータセットを「現状有姿」で提供し、明示または黙示を問わず、いかなる保証も行いません。Google は、このデータセットの使用で、直接または間接の損害が発生したとしても一切の責任を負いません。

次のステップ

これで、人口統計データをトレーニングおよび予測に使用する Cloud ML Engine サンプルのチュートリアルを完了しました。トレーニング ジョブをローカルで検証し、それをクラウド上で単一インスタンス モードと分散モードの両方で実行し、ハイパーパラメータ調整を使用してモデルを改善し、モデルを使用してオンライン予測とバッチ予測を取得しました。

以下のリソースは、引き続き Cloud ML Engine について学習するのに役立ちます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

TensorFlow 用 Cloud ML Engine