scikit-learn と XGBoost を使用したトレーニング

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

概要

このチュートリアルでは、Iris データセットを使用して、花の種を予測する簡単なモデルをトレーニングします。モデルのトレーニング コードを調整し、Cloud Storage からデータをダウンロードし、保存したモデルファイルを Cloud Storage にアップロードするようにコードを変更します。その後、トレーニング アプリケーション パッケージを作成し、それを使用して Cloud ML Engine でトレーニングを実行します。

このチュートリアルでは Python 2.7 を使用します。

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

初期設定プロセスを完了したら、次の 3 つのステップにより、Cloud ML Engine でモデルをトレーニングできます。

  • Python トレーニング モジュールの作成
    • Cloud Storage からデータをダウンロードするコードを追加して、Cloud ML Engine でデータを使用できるようにする
    • Cloud ML Engine によるモデルのトレーニングが完了した後で、モデルを Cloud Storage にエクスポートして保存するためのコードを追加する
  • トレーニング アプリケーション パッケージの準備
  • トレーニング ジョブの送信

初期設定プロセスでは、Google Cloud Platform プロジェクトの作成、課金と API の有効化、Cloud ML Engine で使用する Cloud Storage バケットの設定、scikit-learn または XGBoost のローカル インストールを行います。すべての設定とインストールがすでに完了している場合は、モデルのトレーニング コードの作成に進んでください。

始める前に

次の操作を行って 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、joblib をインストールします。

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

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

Cloud Shell

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

pip install --user scikit-learn xgboost pandas joblib

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

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 を使用しています。「使ってみる」の説明でこのリージョンが使用されているためです。

Python トレーニング モジュールの作成

ファイル iris_training.py を作成します。このファイルにはモデルをトレーニングするためのコードが含まれます。このセクションでは、トレーニング コードの各部分の役割について説明します。

  • セットアップとインポート
  • Cloud Storage からデータをダウンロードする
  • pandas にデータを読み込む
  • モデルをトレーニングして保存する
  • 保存したモデルファイルを Cloud Storage にアップロードする

iris_training.py のコード全体が GitHub でホストされているため、このチュートリアルで簡単に利用できます。

設定

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

scikit-learn

import datetime
import os
import subprocess
import sys
import pandas as pd
from sklearn import svm
import joblib

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

XGBoost

import datetime
import os
import subprocess
import sys
import pandas as pd
import xgboost as xgb

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

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

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

次のコードで、gsutil を使用してデータをダウンロードし、gsutil から stdout にデータを出力します。

scikit-learn

iris_data_filename = 'iris_data.csv'
iris_target_filename = 'iris_target.csv'
data_dir = 'gs://cloud-samples-data/ml-engine/iris'

# gsutil outputs everything to stderr so we need to divert it to stdout.
subprocess.check_call(['gsutil', 'cp', os.path.join(data_dir,
                                                    iris_data_filename),
                       iris_data_filename], stderr=sys.stdout)
subprocess.check_call(['gsutil', 'cp', os.path.join(data_dir,
                                                    iris_target_filename),
                       iris_target_filename], stderr=sys.stdout)

XGBoost

iris_data_filename = 'iris_data.csv'
iris_target_filename = 'iris_target.csv'
data_dir = 'gs://cloud-samples-data/ml-engine/iris'

# gsutil outputs everything to stderr so we need to divert it to stdout.
subprocess.check_call(['gsutil', 'cp', os.path.join(data_dir,
                                                    iris_data_filename),
                       iris_data_filename], stderr=sys.stdout)
subprocess.check_call(['gsutil', 'cp', os.path.join(data_dir,
                                                    iris_target_filename),
                       iris_target_filename], stderr=sys.stdout)

pandas にデータを読み込む

pandas を利用してデータを NumPy 配列に読み込んで、scikit-learn または XGBoost でトレーニングします。

scikit-learn

# Load data into pandas, then use `.values` to get NumPy arrays
iris_data = pd.read_csv(iris_data_filename).values
iris_target = pd.read_csv(iris_target_filename).values

# Convert one-column 2D array into 1D array for use with scikit-learn
iris_target = iris_target.reshape((iris_target.size,))

XGBoost

# Load data into pandas, then use `.values` to get NumPy arrays
iris_data = pd.read_csv(iris_data_filename).values
iris_target = pd.read_csv(iris_target_filename).values

# Convert one-column 2D array into 1D array for use with XGBoost
iris_target = iris_target.reshape((iris_target.size,))

モデルのトレーニングと保存

Cloud ML Engine で実行するトレーニング モジュールを作成します。この例のトレーニング モジュールは、Iris トレーニング データ(iris_datairis_target)を使用してモデルをトレーニングし、トレーニング済みのモデルをファイルにエクスポートして保存します。トレーニング後に Cloud ML Engine を使用してオンライン予測を取得する場合は、モデルファイルのエクスポートに使用するライブラリに応じて、モデルファイルに名前を付ける必要があります。詳細については、モデルファイルの命名規則をご覧ください。

scikit-learn

モデルの永続性に関する scikit-learn の例の手順に沿って、次のようにモデルをトレーニングし、エクスポートします。

# Train the model
classifier = svm.SVC(gamma='auto', verbose=True)
classifier.fit(iris_data, iris_target)

# Export the classifier to a file
model_filename = 'model.joblib'
joblib.dump(classifier, model_filename)

モデルをエクスポートするには、次のように pickle ライブラリを組み込みで使用します。

import pickle
with open('model.pkl', 'wb') as model_file:
  pickle.dump(classifier, model_file)

XGBoost

Booster オブジェクトの「save_model」メソッドを使用すると、モデルをエクスポートできます。

# Load data into DMatrix object
dtrain = xgb.DMatrix(iris_data, label=iris_target)

# Train XGBoost model
bst = xgb.train({}, dtrain, 20)

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

モデルをエクスポートするには、次のように pickle ライブラリを組み込みで使用します。

import pickle
with open('model.pkl', 'wb') as model_file:
  pickle.dump(bst, model_file)

モデルファイルの命名規則

Cloud Storage にアップロードする保存済みモデルのファイル名は、使用したライブラリに応じて、model.pklmodel.joblibmodel.bst のいずれかにする必要があります。この制限により、Cloud ML Engine はエクスポート時と同じパターンを使用して、インポート時にモデルを再構築できます。

scikit-learn

モデルのエクスポートに使用するライブラリ 正しいモデル名
pickle model.pkl
joblib model.joblib

XGBoost

モデルのエクスポートに使用するライブラリ 正しいモデル名
pickle model.pkl
joblib model.joblib
xgboost.Booster model.bst

モデルを今後繰り返し利用する場合は、新しいモデルのそれぞれに専用のディレクトリが存在するように Cloud Storage バケットを整理してください。

保存したモデルを Cloud Storage にアップロードする

使用する Cloud Storage バケットが Cloud ML Engine の実行に使用する Google Cloud Platform プロジェクトの外部にある場合は、Cloud ML Engine からそのバケットにアクセスできることを確認してください。

scikit-learn

# Upload the saved model file to Cloud Storage
gcs_model_path = os.path.join('gs://', BUCKET_NAME,
    datetime.datetime.now().strftime('iris_%Y%m%d_%H%M%S'), model_filename)
subprocess.check_call(['gsutil', 'cp', model_filename, gcs_model_path],
    stderr=sys.stdout)

XGBoost

# Upload the saved model file to Cloud Storage
gcs_model_path = os.path.join('gs://', BUCKET_NAME,
    datetime.datetime.now().strftime('iris_%Y%m%d_%H%M%S'), model_filename)
subprocess.check_call(['gsutil', 'cp', model_filename, gcs_model_path],
    stderr=sys.stdout)

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

上記のスニペットから作成した iris_training.py を使用して、メイン モジュールとして iris_training.py が含まれるトレーニング アプリケーション パッケージを作成します。

トレーニング アプリケーション パッケージを作成する最も簡単な(おすすめの)方法は、トレーニング ジョブを送信する際に、gcloud でアプリケーションをパッケージングしてアップロードする方法です。この方法で必要なのは、2 つのファイルを含む非常に単純なファイル構造を作成することです。

scikit-learn

このチュートリアルでは、トレーニング アプリケーション パッケージのファイル構造は次のようになります。

iris_sklearn_trainer/
    __init__.py
    iris_training.py
  1. コマンドラインで、ディレクトリをローカルに作成します。

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

    touch iris_sklearn_trainer/__init__.py
    
  3. トレーニング コードを iris_training.py という名前で保存し、そのファイルを iris_sklearn_trainer ディレクトリに保存します。また、cURL を使用して GitHub からファイルをダウンロードして保存する方法もあります。

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/sklearn/iris_training.py > iris_sklearn_trainer/iris_training.py
    

    GitHub にある完全なソースコードを表示します。

  4. トレーニング アプリケーション パッケージが正しく設定されていることを確認します。

    ls ./iris_sklearn_trainer
      __init__.py  iris_training.py
    

XGBoost

このチュートリアルでは、トレーニング アプリケーション パッケージのファイル構造は次のようになります。

iris_xgboost_trainer/
    __init__.py
    iris_training.py
  1. コマンドラインで、ディレクトリをローカルに作成します。

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

    touch iris_xgboost_trainer/__init__.py
    
  3. トレーニング コードを iris_training.py という名前で保存し、そのファイルを iris_xgboost_trainer ディレクトリに保存します。また、cURL を使用して GitHub からファイルをダウンロードして保存する方法もあります。

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/xgboost/iris_training.py > iris_xgboost_trainer/iris_training.py
    

    GitHub にある完全なソースコードを表示します。

  4. トレーニング アプリケーション パッケージが正しく設定されていることを確認します。

    ls ./iris_xgboost_trainer
      __init__.py  iris_training.py
    

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

トレーナーをローカルで実行する

gcloud ml-engine local train コマンドを使用すると、トレーニング アプリケーションをローカルでテストできます。この手順は省略可能ですが、デバッグの際に役立ちます。

scikit-learn

コマンドラインで次の環境変数を設定します。[VALUES-IN-BRACKETS] は適切な値に置き換えてください。

TRAINING_PACKAGE_PATH="./iris_sklearn_trainer/"
MAIN_TRAINER_MODULE="iris_sklearn_trainer.iris_training"

トレーニング ジョブをローカルでテストします。

gcloud ml-engine local train \
  --package-path $TRAINING_PACKAGE_PATH \
  --module-name $MAIN_TRAINER_MODULE

XGBoost

コマンドラインで次の環境変数を設定します。[VALUES-IN-BRACKETS] は適切な値に置き換えてください。

TRAINING_PACKAGE_PATH="./iris_xgboost_trainer/"
MAIN_TRAINER_MODULE="iris_xgboost_trainer.iris_training"

トレーニング ジョブをローカルでテストします。

gcloud ml-engine local train \
  --package-path $TRAINING_PACKAGE_PATH \
  --module-name $MAIN_TRAINER_MODULE

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

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

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

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

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

参考のため、このチュートリアルで使用する環境変数を以下に示します。

scikit-learn

[VALUES-IN-BRACKETS] は適切な値に置き換えてください。

    BUCKET_NAME=[YOUR-BUCKET-NAME]
    JOB_NAME="iris_scikit_learn_$(date +"%Y%m%d_%H%M%S")"
    JOB_DIR=gs://$BUCKET_NAME/scikit_learn_job_dir
    TRAINING_PACKAGE_PATH="./iris_sklearn_trainer/"
    MAIN_TRAINER_MODULE="iris_sklearn_trainer.iris_training"
    REGION=us-central1
    RUNTIME_VERSION=1.12
    PYTHON_VERSION=2.7
    SCALE_TIER=BASIC

XGBoost

[VALUES-IN-BRACKETS] は適切な値に置き換えてください。

    BUCKET_NAME=[YOUR-BUCKET-NAME]
    JOB_NAME="iris_xgboost_$(date +"%Y%m%d_%H%M%S")"
    JOB_DIR=gs://$BUCKET_NAME/xgboost_job_dir
    TRAINING_PACKAGE_PATH="./iris_xgboost_trainer/"
    MAIN_TRAINER_MODULE="iris_xgboost_trainer.iris_training"
    REGION=us-central1
    RUNTIME_VERSION=1.12
    PYTHON_VERSION=2.7
    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 [iris_scikit_learn_[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 iris_scikit_learn_[DATE]_[TIME]

or continue streaming the logs with the command

  $ gcloud ml-engine jobs stream-logs iris_scikit_learn_[DATE]_[TIME]

jobId: iris_scikit_learn_[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

Cloud Storage 内のモデルファイルの確認

保存先のモデルフォルダの内容を表示して、保存したモデルファイルが Cloud Storage にアップロードされていることを確認します。

gsutil ls gs://$BUCKET_NAME/iris_*

出力例:

gs://bucket-name/iris_20180518_123815/:
gs://bucket-name/iris_20180518_123815/model.joblib

Cloud ML Engine へのモデルのデプロイ(オンライン予測用)

モデルをデプロイして予測を返すには、指示に沿ってモデルとバージョンをデプロイします。gcloud ml-engine versions create コマンドと、このチュートリアルで以前に定義した $RUNTIME_VERSION 変数および $PYTHON_VERSION 変数を使用して、モデルをデプロイできます。

次のステップ

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

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

scikit-learn と XGBoost の AI Platform