Cloud ML Engine での XGBoost を使用したトレーニング

Cloud Machine Learning Engine トレーニング サービスは、モデルをトレーニングするためのクラウド内のコンピューティング リソースを管理します。このページでは、Cloud ML Engine を使用して XGBoost モデルをトレーニングするプロセスについて説明します。

このチュートリアルでは、国勢調査所得データセットに基づいて所得水準を予測する簡単なモデルをトレーニングします。トレーニング アプリケーションをローカルに作成し、Cloud Storage にアップロードして、トレーニング ジョブを送信します。Cloud ML Engine トレーニング サービスは Cloud Storage バケットに出力を書き込み、Logging にログを作成します。

このコンテンツは、GitHub にも Jupyter ノートブックとして公開されています。

Cloud ML Engine でモデルをトレーニングする方法

Cloud ML Engine では、次の 3 つのステップでモデルをトレーニングできます。

  • Python モデルファイルを作成する
    • Cloud Storage からデータをダウンロードするコードを追加して、Cloud ML Engine でデータを使用できるようにする
    • Cloud ML 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 を有効にします。

    APIを有効にする

  5. Cloud SDK をインストールして初期化します。

環境の設定

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

macOS の場合、以下の [macOS] タブで環境を設定することをおすすめします。[Cloud 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. コンソール ウィンドウの上部にある [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

フレームワークのインストール

macOS

仮想環境内で次のコマンドを実行して、scikit-learn、XGBoost、pandas をインストールします。

(cmle-env)$ pip install scikit-learn xgboost pandas

インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。

Cloud Shell

次のコマンドを実行して、scikit-learn、XGBoost、pandas をインストールします。

pip install --user scikit-learn xgboost pandas

インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。

Cloud Storage バケットの設定

トレーニング コードと依存関係を保存するための Cloud Storage バケットが必要です。このチュートリアルの目的を考慮すると、Cloud ML Engine で使用しているのと同じプロジェクト内に専用の Cloud Storage バケットを用意して使用するのが最も簡単な方法です。

別のプロジェクト内のバケットを使用する場合は、Cloud ML Engine サービス アカウントが Cloud Storage 内のトレーニング コードと依存関係にアクセスできることを確認する必要があります。適切な権限がないと、トレーニング ジョブは失敗します。ストレージの権限を付与する方法をご覧ください。

必ず、トレーニング ジョブを実行するために使用しているのと同じリージョンのバケットを使用または設定してください。Cloud ML Engine サービスの利用可能なリージョンをご覧ください。

このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、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 環境変数を設定します。

    たとえば、次のコードは REGION を作成して、その値を us-central1 に設定します。

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

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

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

データについて

このサンプルでトレーニングに使用される国勢調査所得データセットは、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 Storage の公開バケット(gs://cloud-samples-data/ml-engine/sklearn/census_data/)にホストしてあり、Python トレーニング ファイル内でダウンロードできます。

Python モデルファイルの作成

このセクションのすべてのトレーニング コードは GitHub の train.py で参照できます。

このセクションの残りの部分では、トレーニング コードの動作について説明します。

設定

Python、Cloud SDK、XGBoost、scikit-learn から、以下のライブラリをインポートします。Cloud Storage バケットの名前のための変数を設定します。

import xgboost as xgb
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import subprocess
from google.cloud import storage

# Fill in your Cloud Storage bucket name
BUCKET_ID = <YOUR_BUCKET_NAME>

Cloud Storage からデータをダウンロードする

典型的な開発プロセスでは、データを Cloud Storage にアップロードして、Cloud ML Engine がそのデータにアクセスできるようにします。このチュートリアルのデータは、公開バケット(gs://cloud-samples-data/ml-engine/sklearn/census_data/)にホストされています。

以下のコードは、トレーニング データセット adult.data をダウンロードします(評価データは adult.test で提供されていますが、このチュートリアルでは使用しません)。

census_data_filename = 'adult.data.csv'

# Public bucket holding the census data
bucket = storage.Client().bucket('cloud-samples-data')

# Path to the data inside the public bucket
data_dir = 'ml-engine/census/data/'

# Download the data
blob = bucket.blob(''.join([data_dir, census_data_filename]))
blob.download_to_filename(census_data_filename)

モデルコードを追加する

モデルのトレーニング コードでは、いくつかの基本操作を行います。

  • データを定義して読み込む
  • カテゴリの特徴を数値の特徴に変換する
  • scikit-learn パイプラインを使用して数値の特徴を抽出する
  • モデルを Cloud Storage にエクスポートして保存する

データを定義して読み込む

# these are the column labels from the census data files
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)
# categorical columns contain data that need to be turned into numerical values before being used by XGBoost
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)

# Load the training census dataset
with open(census_data_filename, 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)
# remove column we are trying to predict ('income-level') from features list
train_features = raw_training_data.drop('income-level', axis=1)
# create training labels list
train_labels = (raw_training_data['income-level'] == ' >50K')

カテゴリの特徴を数値の特徴に変換する

# Since the census data set has categorical features, we need to convert
# them to numerical values.
# convert data in categorical columns to numerical values
encoders = {col:LabelEncoder() for col in CATEGORICAL_COLUMNS}
for col in CATEGORICAL_COLUMNS:
    train_features[col] = encoders[col].fit_transform(train_features[col])

モデルをトレーニングし、Cloud Storage にエクスポートして保存する

# load data into DMatrix object
dtrain = xgb.DMatrix(train_features, train_labels)
# train model
bst = xgb.train({}, dtrain, 20)

Cloud Storage バケットが、Cloud ML Engine に使用しているのと同じプロジェクトにある場合、Cloud ML Engine はバケットの読み取りと書き込みを行うことができます。異なるプロジェクトにある場合は、Cloud ML Engine を実行するために使用しているプロジェクトが Cloud Storage バケットにアクセスできることを確認してください。ストレージの権限を付与する方法をご覧ください。

Cloud ML Engine によるオンライン予測のリクエストにモデルを使用する場合は、必ずモデルファイルの名前を model.pklmodel.joblib、または model.bst として指定してください。

# Export the model to a file
model = 'model.bst'
bst.save_model(model)

# Upload the model to GCS
bucket = storage.Client().bucket(BUCKET_ID)
blob = bucket.blob('{}/{}'.format(
    datetime.datetime.now().strftime('census_%Y%m%d_%H%M%S'),
    model))
blob.upload_from_filename(model)

モデルファイルが Cloud Storage にアップロードされていることを確認する(オプション)

コマンドラインで、保存先のモデルフォルダの内容を表示して、モデルファイルが Cloud Storage にアップロードされていることを確認します。バケット名の環境変数(BUCKET_ID)をまだ設定していない場合は、設定します。

gsutil ls gs://$BUCKET_ID/census_*

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

gs://[YOUR-PROJECT-ID]/census_[DATE]_[TIME]/model.bst

トレーニング アプリケーション パッケージの作成

トレーニング アプリケーション パッケージを作成する最も簡単な(推奨される)方法は、トレーニング ジョブを送信する際に、gcloud を使用してアプリケーションをパッケージングしてアップロードするという方法です。この方法では、ファイルが 2 つのみ含まれる非常に単純なファイル構造を作成するだけで済みます。このチュートリアルでは、トレーニング アプリケーション パッケージのファイル構造は次のようになります。

census_training/
    __init__.py
    train.py
  1. ディレクトリをローカルに作成します。

    mkdir census_training
    
  2. __init__.py という名前の空のファイルを作成します。

    touch census_training/__init__.py
    
  3. トレーニング コードを 1 つの Python ファイルに保存し、そのファイルを census_training ディレクトリ内に保存します。train.py のサンプルコードをご覧ください。cURL を使用して、ファイルをダウンロードして保存できます。

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/xgboost/notebooks/census_training/train.py > census_training/train.py
    

詳細については、トレーニング アプリケーションのパッケージングをご覧ください。

トレーニング ジョブの送信

このセクションでは、gcloud ml-engine jobs submit training を使用してトレーニング ジョブを送信します。

トレーニング ジョブのパラメータを指定する

トレーニング ジョブ リクエストのパラメータ用に次の環境変数を設定します。

  • PROJECT_ID - お使いの Google Cloud Platform プロジェクトに対応した PROJECT_ID を使用します。
  • BUCKET_ID - Cloud Storage バケットの名前。
  • JOB_NAME - ジョブに使用する名前(英大文字と小文字、数字、アンダースコアのみを使用でき、先頭は文字にする必要があります)。ここでは census_training_$(date +"%Y%m%d_%H%M%S") としています。
  • JOB_DIR - トレーニング ジョブの出力ファイルに使用する Cloud Storage の場所のパス。例: gs://$BUCKET_ID/xgboost_job_dir
  • TRAINING_PACKAGE_PATH - トレーニング アプリケーションのルート ディレクトリのローカルパス。ここでは ./census_training/ としています。
  • MAIN_TRAINER_MODULE - Cloud ML Engine トレーニング サービスで実行するファイルを指定します。形式は [YOUR_FOLDER_NAME.YOUR_PYTHON_FILE_NAME] です。ここでは census_training.train としています。
  • REGION - トレーニング ジョブを実行するために使用しているリージョンの名前。Cloud ML Engine トレーニング サービスで使用可能なリージョンのいずれかを使用します。Cloud Storage バケットが同じリージョンにあることを確認してください。このチュートリアルでは us-central1 を使用します。
  • RUNTIME_VERSION - scikit-learn をサポートしている Cloud ML Engine ランタイム バージョンを指定する必要があります。この例では 1.13 です。
  • PYTHON_VERSION - ジョブに使用する Python のバージョン。Python 3.5 は、Cloud ML Engine 1.4 以上で使用できます。Python バージョンを指定しない場合、トレーニング サービスでは Python 2.7 が使用されます。このチュートリアルでは Python 3.5 を指定します。
  • SCALE_TIER - トレーニング ジョブを実行するマシンの事前定義されたクラスタ仕様。ここでは BASIC としています。カスタム スケール階層を使用して、トレーニング用の独自のクラスタ構成を定義することもできます。

このチュートリアルの環境変数は以下のとおりです。[VALUES-IN-BRACKETS] は適切な値に置き換えます。

PROJECT_ID=[YOUR-PROJECT-ID]
BUCKET_ID=[YOUR-BUCKET-ID]
JOB_NAME=census_training_$(date +"%Y%m%d_%H%M%S")
JOB_DIR=gs://$BUCKET_ID/xgboost_job_dir
TRAINING_PACKAGE_PATH="[YOUR-LOCAL-PATH-TO-TRAINING-PACKAGE]/census_training/"
MAIN_TRAINER_MODULE=census_training.train
REGION=us-central1
RUNTIME_VERSION=1.13
PYTHON_VERSION=3.5
SCALE_TIER=BASIC

リクエストを送信します。

gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir $JOB_DIR \
--package-path $TRAINING_PACKAGE_PATH \
--module-name $MAIN_TRAINER_MODULE \
--region $REGION \
--runtime-version=$RUNTIME_VERSION \
--python-version=$PYTHON_VERSION \
--scale-tier $SCALE_TIER

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

Job [census_training_[DATE]_[TIME]] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ml-engine jobs describe census_training_20180718_160825

or continue streaming the logs with the command

  $ gcloud ml-engine jobs stream-logs census_training_[DATE]_[TIME]
jobId: census_training_[DATE]_[TIME]
state: QUEUED

トレーニング ログの表示(オプション)

Cloud ML Engine は、すべての stdout および stderr ストリームとロギング ステートメントを取得します。これらのログは Logging に保存されます。これらは実行中でも、実行後でも表示することができます。

トレーニング ジョブのログを表示するには:

Console

  1. Cloud ML Engine の [ジョブ] ページを開きます。

    GCP Console でジョブを開く

  2. 確認するトレーニング ジョブの名前を選択します。選択したトレーニング ジョブの [ジョブの詳細] ページが表示されます。

  3. [ジョブの詳細] の内部で、[ログを表示] リンクを選択します。[Logging] ページが表示され、選択したトレーニング ジョブのログを検索したり、フィルタリングしたりできます。

gcloud

gcloud ml-engine jobs stream-logs を使用すると、ターミナルでログを表示できます。

gcloud ml-engine jobs stream-logs $JOB_NAME

次のステップ

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

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

scikit-learn と XGBoost の Cloud ML Engine