scikit-learn と XGBoost による ML モデルのトレーニング

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

概要

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

AI Platform Training でモデルをトレーニングする方法

AI Platform Training では、初期設定プロセスを完了したら、次の 3 つのステップでモデルをトレーニングできます。

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

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

始める前に

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

GCP プロジェクトを設定する

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  4. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init

環境の設定

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

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

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 がすでにインストールされているかどうかを確認します。virtualenv --version。インストールされていない場合は、virtualenv をインストールします。

    pip install --user --upgrade virtualenv

    このガイド用に隔離された開発環境を作成するために、virtualenv で新しい仮想環境を作成します。たとえば、次のコマンドは、aip-env という名前の環境をアクティブにします。

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

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

Cloud Shell

  1. Google Cloud Console を開きます。

    Google Cloud Console

  2. Console ウィンドウの上部にある「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 を囲んでいる角かっこは不要です。

フレームワークをインストールする

macOS

仮想環境内で次のコマンドを実行して、AI Platform Training ランタイム バージョン 2.11 で使用する scikit-learn、XGBoost、pandas をインストールします。

(aip-env)$ pip install scikit-learn==1.0.2 xgboost==1.6.2 pandas==1.3.5

上述のコマンドでバージョン番号を指定して、仮想環境内の依存関係とランタイム バージョン内の依存関係を一致させます。これによって、AI Platform Training でコードを実行するときの予期しない動作を防ぎます。

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

Cloud Shell

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

pip install --user scikit-learn xgboost pandas

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

Cloud Storage バケットを設定する

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

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

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

このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、AI Platform ジョブを実行する予定のリージョンと同じリージョンにある必要があります。また、AI Platform Training を実行するプロジェクトに含まれていない場合は、明示的に AI Platform Training サービス アカウントへのアクセスを許可する必要があります。

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

    BUCKET_NAME="YOUR_BUCKET_NAME"

    たとえば、プロジェクト名に -aiplatform を追加したものを使います。

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

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

    AI Platform Training ジョブを実行する予定のリージョンと同じリージョンを使用してください。AI Platform Training サービスに利用可能なリージョンをご覧ください。

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

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

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

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
from sklearn.externals 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 にアップロードして、AI Platform Training がそのデータにアクセスできるようにします。このチュートリアルのデータは、Cloud Storage の公開バケット gs://cloud-samples-data/ai-platform/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/ai-platform/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,))

モデルをトレーニングして保存する

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

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 のいずれかにする必要があります。この制限により、AI Platform Prediction はエクスポート時と同じパターンを使用して、インポート時にモデルを再構築できます。

カスタム予測ルーチン(ベータ版)を作成する場合、この要件は適用されません。

scikit-learn

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

XGBoost

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

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

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

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

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

scikit-learn

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

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

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

gcloud ai-platform 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 ai-platform local train \
  --package-path $TRAINING_PACKAGE_PATH \
  --module-name $MAIN_TRAINER_MODULE

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

このセクションでは、gcloud ai-platform 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_dir または gs://$BUCKET_NAME/xgboost_job_dir
  • TRAINING_PACKAGE_PATH - トレーニング アプリケーションのルート ディレクトリのローカルパス。例: ./iris_sklearn_trainer/ または ./iris_xgboost_trainer/
  • MAIN_TRAINER_MODULE - AI Platform Training トレーニング サービスで実行するファイルを指定します。形式は [YOUR_FOLDER_NAME.YOUR_PYTHON_FILE_NAME] です。例: iris_sklearn_trainer.iris_training または iris_xgboost_trainer.iris_training
  • REGION - トレーニング ジョブを実行するために使用しているリージョンの名前。AI Platform Training トレーニング サービスに利用可能なリージョンのいずれかを使用します。Cloud Storage バケットが同じリージョンにあることを確認してください。
  • RUNTIME_VERSION - scikit-learn をサポートする AI Platform Training のランタイム バージョンを指定する必要があります。この例では、2.11 です。
  • PYTHON_VERSION - ジョブに使用する Python のバージョン。このチュートリアルでは Python 3.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=2.11
    PYTHON_VERSION=3.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=2.11
    PYTHON_VERSION=3.7
    SCALE_TIER=BASIC

トレーニング ジョブ リクエストを送信します。

gcloud ai-platform 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 ai-platform jobs describe iris_scikit_learn_[DATE]_[TIME]

or continue streaming the logs with the command

  $ gcloud ai-platform jobs stream-logs iris_scikit_learn_[DATE]_[TIME]

jobId: iris_scikit_learn_[DATE]_[TIME]
state: QUEUED

トレーニング ログの表示(省略可)

AI Platform Training はすべての stdout ストリームと stderr ストリーム、ログ ステートメントをキャプチャします。これらのログは Logging に保存されます。これらは実行中でも、実行後でも表示できます。

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

Console

  1. AI Platform Training の [ジョブ] ページを開きます。

    Google Cloud コンソールでジョブを開く

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

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

gcloud

gcloud ai-platform jobs stream-logs を使用して、ターミナルでログを表示できます。

gcloud ai-platform 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

次のステップ