このサンプルでは、国勢調査所得データセットに基づいて所得水準を予測するモデルをトレーニングします。モデルをローカルでトレーニングして保存したら、AI Platform Prediction にデプロイしてクエリでオンライン予測を取得します。
AI Platform Prediction では scikit-learn パイプラインをデプロイして実行できます。scikit-learn の Pipeline モジュールを使用すると、estimator でトレーニングを行う前に複数のデータ変換を適用できます。これにより、データ処理の複数のステップがカプセル化され、各ステップで同じトレーニング データが使用されるようになります。
このチュートリアルは、GitHub で Jupyter ノートブックとして公開されています。
AI Platform Prediction にモデルを公開する方法
AI Platform Prediction にモデルを公開して予測を取得するには、次の 5 つのステップを行います。
- モデルをファイルに保存する。
- 保存したモデルを Cloud Storage にアップロードする。
- AI Platform Prediction にモデルリソースを作成する。
- モデル バージョンを作成して、保存したモデルをリンクする。
- オンライン予測を行う。
始める前に
次の手順に従って GCP アカウントを設定し、AI Platform Prediction API を有効にします。さらに、Cloud SDK をインストールして有効にします。
GCP プロジェクトの設定
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
環境を設定する
以下のいずれかのオプションを選択して、macOS のローカル環境または Cloud Shell のリモート環境を設定します。
macOS の場合、以下の [MACOS] タブで環境を設定することをおすすめします。[CLOUD SHELL] タブに表示される Cloud Shell は、macOS、Linux、Windows で使用できます。Cloud Shell は、AI Platform Prediction の機能を試すような場合には便利ですが、継続的な開発作業には適していません。
macOS
-
Python のインストールを確認する
Python がインストールされていることを確認します。されていない場合はインストールします。python -V
-
pip
のインストールを確認するpip
は、Python のパッケージ マネージャーであり、Python の現在のバージョンに含まれています。pip --version
コマンドを実行して、pip
がすでにインストールされているかどうかを確認します。インストールされていない場合は、pip
のインストール方法をご覧ください。次のコマンドを使用すると、
pip
をアップグレードできます。pip install -U pip
詳細については、pip のドキュメントをご覧ください。
-
virtualenv
をインストールするvirtualenv
は隔離された Python 環境を作成するツールです。次のコマンドを実行して、virtualenv
がすでにインストールされているかどうかを確認します。virtualenv --version
。インストールされていない場合は、virtualenv
をインストールします。pip install --user --upgrade virtualenv
このガイド用に隔離された開発環境を作成するために、
virtualenv
で新しい仮想環境を作成します。たとえば、次のコマンドは、aip-env
という名前の環境をアクティブにします。virtualenv aip-env source aip-env/bin/activate
-
このチュートリアルでは、仮想環境内で残りのコマンドを実行します。
virtualenv
の使用方法の詳細をご覧ください。virtualenv
を終了するには、deactivate
を実行します。
Cloud Shell
-
Google Cloud Console を開きます。
-
Console ウィンドウの上部にある「Cloud Shell をアクティブにする」ボタンをクリックします。
コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。シェル セッションが初期化されるまで、数秒かかる場合があります。
Cloud Shell セッションが使用できる状態になります。
-
選択したプロジェクトを使用するように
gcloud
コマンドライン ツールを構成します。gcloud config set project [selected-project-id]
ここで、
[selected-project-id]
はプロジェクト ID ですID を囲んでいる角かっこは不要です。
フレームワークをインストールする
macOS
仮想環境内で、次のコマンドを実行して、AI Platform Prediction ランタイム バージョン 2.11 で使用する scikit-learn と pandas のバージョンをインストールします。
(aip-env)$ pip install scikit-learn==1.0.2 pandas==1.3.5
上述のコマンドでバージョン番号を指定して、仮想環境内の依存関係とランタイム バージョン内の依存関係を一致させます。これにより、AI Platform Prediction でコードを実行中に予期せぬ動作が起こらないようにします。
インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。
Cloud Shell
次のコマンドを実行して、scikit-learn、pandas をインストールします。
pip install --user scikit-learn pandas
インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。
データのダウンロード
このサンプルのトレーニングに使用している国勢調査所得データセットは、UC Irvine Machine Learning Repository によってホストされています。詳しくは、データについてをご覧ください。
- トレーニング ファイルは
adult.data
です - 評価ファイルは
adult.test
です
モデルのトレーニングと保存
モデルをトレーニングして保存する手順は次のとおりです。
- pandas DataFrame にデータを読み込み、scikit-learn で使用できるように準備します。
- scikit-learn で単純なモデルをトレーニングします。
- AI Platform Prediction にアップロード可能なファイルにモデルを保存します。
アップロードするモデルのトレーニングが完了している場合は、モデルをエクスポートする方法をご覧ください。
データの読み込みと変換
scikit-learn estimators をエクスポートする場合と同様に、scikit-learn に含まれている joblib
のバージョンまたは pickle
を使用して Pipeline
オブジェクトをエクスポートできます。次の例では、パイプラインを使用して個々のカテゴリ別の特徴を数値に変換し、これらの値を組み合わせて、RandomForestClassifier
を使用してモデルをトレーニングしています。
from sklearn.externals import joblib
import json
import numpy as np
import os
import pandas as pd
import pickle
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer
# Define the format of your input data, including unused columns.
# These are the columns 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 are columns that need to be turned into a numerical value to be used by scikit-learn
CATEGORICAL_COLUMNS = (
'workclass',
'education',
'marital-status',
'occupation',
'relationship',
'race',
'sex',
'native-country'
)
# Load the training census dataset
with open('./census_data/adult.data', 'r') as train_data:
raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)
# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
train_features = raw_training_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').as_matrix().tolist()
# Load the test census dataset
with open('./census_data/adult.test', 'r') as test_data:
raw_testing_data = pd.read_csv(test_data, names=COLUMNS, skiprows=1)
# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
test_features = raw_testing_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
test_labels = (raw_testing_data['income-level'] == ' >50K.').as_matrix().tolist()
# Since the census data set has categorical features, we need to convert
# them to numerical values. We'll use a list of pipelines to convert each
# categorical column and then use FeatureUnion to combine them before calling
# the RandomForestClassifier.
categorical_pipelines = []
# Each categorical column needs to be extracted individually and converted to a numerical value.
# To do this, each categorical column will use a pipeline that extracts one feature column via
# SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
# A scores array (created below) will select and extract the feature column. The scores array is
# created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
for i, col in enumerate(COLUMNS[:-1]):
if col in CATEGORICAL_COLUMNS:
# Create a scores array to get the individual categorical column.
# Example:
# data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
# 'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
# scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#
# Returns: [['Sate-gov']]
scores = []
# Build the scores array
for j in range(len(COLUMNS[:-1])):
if i == j: # This column is the categorical column we want to extract.
scores.append(1) # Set to 1 to select this column
else: # Every other column should be ignored.
scores.append(0)
skb = SelectKBest(k=1)
skb.scores_ = scores
# Convert the categorical column to a numerical value
lbn = LabelBinarizer()
r = skb.transform(train_features)
lbn.fit(r)
# Create the pipeline to extract the categorical feature
categorical_pipelines.append(
('categorical-{}'.format(i), Pipeline([
('SKB-{}'.format(i), skb),
('LBN-{}'.format(i), lbn)])))
# Create pipeline to extract the numerical features
skb = SelectKBest(k=6)
# From COLUMNS use the features that are numerical
skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
categorical_pipelines.append(('numerical', skb))
# Combine all the features using FeatureUnion
preprocess = FeatureUnion(categorical_pipelines)
# Create the classifier
classifier = RandomForestClassifier()
# Transform the features and fit them to the classifier
classifier.fit(preprocess.transform(train_features), train_labels)
# Create the overall model as a single pipeline
pipeline = Pipeline([
('union', preprocess),
('classifier', classifier)
])
モデルをエクスポートする
モデルをエクスポートするには、下記のように joblib または Python pickle
ライブラリを使用します。
joblib
from sklearn.externals import joblib
# Export the model to a file
joblib.dump(pipeline, 'model.joblib')
pickle
# Export the model to a file
with open('model.pkl', 'wb') as model_file:
pickle.dump(pipeline, model_file)
モデルファイルの命名規則
Cloud Storage にアップロードする保存済みモデルファイルの名前は、使用したライブラリに応じて、model.pkl
か model.joblib
のいずれかにする必要があります。この制限により、AI Platform Prediction はエクスポート時と同じパターンを使用して、インポート時にモデルを再構築できます。
モデルのエクスポートに使用するライブラリ | 正しいモデル名 |
---|---|
pickle |
model.pkl |
sklearn.externals.joblib |
model.joblib |
モデルを今後繰り返し利用する場合は、それぞれの新しいモデルに専用のディレクトリが存在するよう Cloud Storage バケットを整理してください。
モデルを Cloud Storage に保存する
このチュートリアルでは、AI Platform Prediction に使用しているのと同じプロジェクトで専用の Cloud Storage バケットを使用する方法が最も簡単です。
別のプロジェクトのバケットを使用している場合は、AI Platform Prediction サービス アカウントで Cloud Storage のモデルにアクセスできるようにする必要があります。適切な権限がないと、AI Platform Prediction モデル バージョンの作成リクエストが失敗します。詳しくは、ストレージの権限の付与をご覧ください。
Cloud Storage バケットを設定する
このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、AI Platform ジョブを実行する予定のリージョンと同じリージョンにある必要があります。また、AI Platform Prediction を実行するプロジェクトに含まれていない場合は、明示的に AI Platform Prediction サービス アカウントへのアクセスを許可する必要があります。
-
新しいバケットに名前を指定します。名前は Cloud Storage のすべてのバケット全体で重複しないようにする必要があります。
BUCKET_NAME="YOUR_BUCKET_NAME"
たとえば、プロジェクト名に
-aiplatform
を追加したものを使います。PROJECT_ID=$(gcloud config list project --format "value(core.project)") BUCKET_NAME=${PROJECT_ID}-aiplatform
-
作成したバケット名を確認します。
echo $BUCKET_NAME
-
バケットのリージョンを選択して、
REGION
環境変数を設定します。AI Platform Prediction ジョブを実行する予定のリージョンと同じリージョンを使用してください。詳しくは、AI Platform Prediction サービスの利用可能なリージョンをご覧ください。
たとえば、次のコードは
REGION
を作成し、us-central1
に設定します。REGION=us-central1
-
新しいバケットを作成します。
gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION
エクスポートしたモデルファイルを Cloud Storage にアップロードする
次のコマンドを実行して、保存したモデルファイルを Cloud Storage のバケットにアップロードします。
gcloud storage cp ./model.joblib gs://your_bucket_name/model.joblib
予測で使用するデータをフォーマットする
オンライン予測のリクエストを送信する前に、AI Platform Prediction 予測サービスで使用できるようにテストデータをフォーマットする必要があります。入力インスタンスの形式は、モデルの想定と一致させる必要があります。
gcloud
1 行に 1 つの入力インスタンスを記述して input.json
ファイルを作成します。次の例では、上の手順で定義した test_features
リストにある最初の 10 個のデータ インスタンスを使用します。
[25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"]
[38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"]
[28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"]
[44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"]
[18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"]
[34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"]
[29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"]
[63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"]
[24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"]
[55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]
入力インスタンスの形式は、モデルの想定と一致させる必要があります。この例では、Census モデルに 14 個の特徴が必要なため、入力は形状の行列(num_instances, 14
)でなければなりません。
REST API
1 行に 1 つの入力インスタンスを記述して input.json
ファイルを作成します。次の例では、上の手順で定義した test_features
リストにある最初の 10 個のデータ インスタンスを使用します。
{
"instances": [
[25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"],
[38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"],
[28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"],
[44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"],
[18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"],
[34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"],
[29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"],
[63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"],
[24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"],
[55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]
]
}
入力インスタンスの形式は、モデルの想定と一致させる必要があります。この例では、Census モデルに 14 個の特徴が必要なため、入力は形状の行列(num_instances, 14
)でなければなりません。
詳細については、オンライン予測の入力形式をご覧ください。
ローカル予測を使用したモデルのテスト
モデルを AI Platform Prediction にデプロイする前に、gcloud ai-platform local predict
コマンドを使用してモデルがどのように予測に対応するかをテストできます。このコマンドは、ローカル環境の依存関係を使用して予測を実行し、結果を gcloud ai-platform predict
オンライン予測を実行するときに使用されます。予測をローカルでテストすると、オンライン予測で費用が発生する前にエラーを見つけることができます。
--model-dir
引数で、エクスポートした機械学習モデルが含まれた、ローカルマシン上あるいは Cloud Storage 内のディレクトリを指定します。--framework
引数には、tensorflow
、scikit-learn
、または xgboost
を指定します。gcloud ai-platform local predict
コマンドをカスタム予測ルーチンで使用することはできません。
次の例は、ローカル予測を実行する方法を示しています。
gcloud ai-platform local predict --model-dir LOCAL_OR_CLOUD_STORAGE_PATH_TO_MODEL_DIRECTORY/ \
--json-instances LOCAL_PATH_TO_PREDICTION_INPUT.JSON \
--framework NAME_OF_FRAMEWORK
モデルとバージョンをデプロイする
AI Platform Prediction は、モデルリソースとバージョン リソースを使用してトレーニング済みモデルを整理します。AI Platform Prediction モデルは、機械学習モデルの複数のバージョンを格納するコンテナに相当します。
モデルをデプロイするには、AI Platform Prediction でモデルリソースを作成し、そのモデルのバージョンを作成して Cloud Storage に格納されたモデルファイルにリンクします。
モデルリソースの作成
AI Platform Prediction はモデルリソースを使用して、さまざまなバージョンのモデルを整理します。
この段階で、このモデルに属するモデル バージョンがリージョン エンドポイントとグローバル エンドポイントのどちらを使用するかを決める必要があります。ほとんどの場合、リージョン エンドポイントを選択します。以前の(MLS1)マシンタイプでのみ使用できる機能が必要な場合は、グローバル エンドポイントを使用します。
また、このモデルに属するモデル バージョンで予測を行う際に、そのモデル バージョンでログをエクスポートするかどうかもこの段階で決める必要があります。次の例では、ロギングを有効にしていません。ロギングを有効にする方法については、こちらをご覧ください。
コンソール
Google Cloud コンソールで、AI Platform Prediction の [モデル] ページを開きます。
[モデル] ページの上部にある [新しいモデル] ボタンをクリックします。[モデルの作成] ページが表示されます。
一意のモデル名を、[モデル名] フィールドに入力します。
[リージョン エンドポイントを使用する] チェックボックスがオンの場合、AI Platform Prediction はリージョン エンドポイントを使用します。代わりにグローバル エンドポイントを使用するには、[リージョン エンドポイントを使用する] チェックボックスをオフにします。
[リージョン] プルダウン リストで、予測ノードのロケーションを選択します。使用可能なリージョンは、リージョン エンドポイントとグローバル エンドポイントのどちらを使用するかによって異なります。
[作成] をクリックします。
[モデル] ページに戻り、新しいモデルがリストに表示されていることを確認してください。
gcloud
リージョン エンドポイント
次のコマンドを実行します。
gcloud ai-platform models create MODEL_NAME \
--region=REGION
以下のように置き換えます。
- MODEL_NAME: モデルに付ける名前。
- REGION: 予測ノードを実行するリージョン エンドポイントのリージョン。Compute Engine(N1)マシンタイプをサポートしているリージョンである必要があります。
--region
フラグを指定しない場合、gcloud CLI のプロンプトが表示され、リージョン エンドポイントを選択するか、グローバル エンドポイントで us-central
を使用するように指示されます。
また、特定のリージョンに ai_platform/region
プロパティを設定すると、--region
フラグを指定していない場合であっても、gcloud CLI で常に AI Platform Prediction 対応のリージョン エンドポイントが使用されるようになります(この構成は、gcloud ai-platform operations
コマンド グループのコマンドには適用されません)。
グローバル エンドポイント
次のコマンドを実行します。
gcloud ai-platform models create MODEL_NAME \
--regions=REGION
以下のように置き換えます。
- MODEL_NAME: モデルに付ける名前。
- REGION: 予測ノードを実行するグローバル エンドポイントのリージョン。以前の(MLS1)マシンタイプをサポートしているリージョンである必要があります。
--regions
フラグを指定しない場合、gcloud CLI のプロンプトが表示され、リージョン エンドポイントを選択するか、グローバル エンドポイントで us-central1
を使用するように指示されます。
REST API
リージョン エンドポイント
リクエスト本文にモデル オブジェクトを配置して、リクエストの形式を整えます。少なくとも、次のサンプルの MODEL_NAME を置き換えてモデルの名前を指定します。
{ "name": "MODEL_NAME" }
PROJECT_ID を Google Cloud プロジェクト ID に置き換えた次の URL に対して REST API 呼び出しを実行します。
POST https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/
以下のように置き換えます。
REGION: モデルをデプロイするリージョン エンドポイントのリージョン。Compute Engine(N1)マシンタイプをサポートしているリージョンである必要があります。
PROJECT_ID: Google Cloud プロジェクト ID
たとえば、
curl
コマンドを使用して次のリクエストを行えます。このコマンドでは、インストールされている Google Cloud CLI に関連付けられた認証情報を使用してリクエストを承認します。curl -X POST -H "Content-Type: application/json" \ -d '{"name": "MODEL_NAME"}' \ -H "Authorization: Bearer `gcloud auth print-access-token`" \ "https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models"
API により、次のようなレスポンスが返されます。
{ "name": "projects/PROJECT_ID/models/MODEL_NAME", "regions": [ "REGION" ] }
グローバル エンドポイント
リクエスト本文にモデル オブジェクトを配置して、リクエストの形式を整えます。少なくとも、次のサンプルの MODEL_NAME を置き換えてモデルの名前を指定し、REGION を従来の(MLS1)マシンタイムをサポートするリージョンに置き換えてリージョンを指定します。
{ "name": "MODEL_NAME", "regions": ["REGION"] }
PROJECT_ID を Google Cloud プロジェクト ID に置き換えた次の URL に対して REST API 呼び出しを実行します。
POST https://ml.googleapis.com/v1/projects/PROJECT_ID/models/
たとえば、
curl
コマンドを使用して次のリクエストを行えます。このコマンドでは、インストールされている Google Cloud CLI に関連付けられた認証情報を使用してリクエストを承認します。curl -X POST -H "Content-Type: application/json" \ -d '{"name": "MODEL_NAME", "regions": ["REGION"]}' \ -H "Authorization: Bearer `gcloud auth print-access-token`" \ "https://ml.googleapis.com/v1/projects/PROJECT_ID/models"
API により、次のようなレスポンスが返されます。
{ "name": "projects/PROJECT_ID/models/MODEL_NAME", "regions": [ "REGION" ] }
詳細については、AI Platform Prediction モデル API をご覧ください。
モデル バージョンの作成
これで、Cloud Storage にアップロードされたトレーニング済みのモデルでモデル バージョンを作成する準備が整いました。バージョンを作成するときに、いくつかのパラメータを指定できます。一般的なパラメータを次に示します。一部は必須のパラメータです。
name
: AI Platform Prediction モデル内で一意にする必要があります。deploymentUri
: Cloud Storage のモデル ディレクトリのパス。- TensorFlow モデルをデプロイしている場合、これは SavedModel ディレクトリです。
- scikit-learn または XGBoost モデルをデプロイしている場合は、
model.joblib
ファイル、model.pkl
ファイル、またはmodel.bst
ファイルが格納されているディレクトリです。 - カスタム予測ルーチンをデプロイしている場合、これはすべてのモデル アーティファクトが格納されたディレクトリです。このディレクトリの合計サイズは 500 MB 以下にする必要があります。
framework
:TENSORFLOW
、SCIKIT_LEARN
、またはXGBOOST
。runtimeVersion
: モデルに必要な依存関係に基づくランタイム バージョン。scikit-learn モデルまたは XGBoost モデルをデプロイしている場合は 1.4 以上である必要があります。バッチ予測にこのモデル バージョンを使用する場合は、ランタイム バージョン 2.1 以前を使用する必要があります。pythonVersion
: Python 3 を使用してエクスポートされたモデルファイルとの互換性を持たせるには、3.5(ランタイム バージョン 1.4~1.14)または 3.7(ランタイム バージョン 1.15 以降)に設定する必要があります。ランタイム バージョン 1.15 以前で使用する場合は「2.7」に設定することもできます。machineType
(省略可): AI Platform Prediction が予測を提供するノードに使用する仮想マシンの種類。詳細については、マシンタイプをご覧ください。設定しない場合、デフォルトでリージョン エンドポイントにn1-standard-2
、グローバル エンドポイントにmls1-c1-m2
が設定されます。
これらの各パラメータの詳細と、あまり一般的でないその他のパラメータについては、バージョン リソースの API リファレンスをご覧ください。
また、モデルをリージョン エンドポイントで作成した場合は、必ず同じリージョン エンドポイントでバージョンを作成してください。
コンソール
Google Cloud コンソールで、AI Platform Prediction の [モデル] ページを開きます。
[モデル] ページで、バージョンの作成に使用するモデルリソースの名前を選択します。[モデルの詳細] ページが表示されます。
[モデルの詳細] ページの上部にある [新しいバージョン] ボタンをクリックします。[バージョンの作成] ページが表示されます。
[名前] フィールドにバージョン名を入力します。必要に応じて、[説明] フィールドにバージョンの説明を入力します。
対応するプルダウン ボックスに、モデルのトレーニング方法に関連する次の情報を入力します。
- モデルのトレーニングに使用した Python のバージョンを選択します。
- フレームワークとフレームワーク バージョンを選択します。
- ML ランタイムのバージョンを選択します。詳しくは、AI Platform Prediction のランタイム バージョンをご覧ください。
オンライン予測を行うマシンタイプを選択します。
[モデル URI] フィールドに、モデルファイルをアップロードした Cloud Storage バケットの場所を入力します。[参照] ボタンを使用すると、正しいパスを見つけることができます。
モデルファイル自体のパスではなく、ファイルを含むディレクトリへのパスを指定してください。たとえば、
gs://your_bucket_name/model-dir/saved_model.pb
やgs://your_bucket_name/model-dir/model.pkl
ではなくgs://your_bucket_name/model-dir/
を使用します。オンライン予測デプロイの [スケーリング] オプションを選択します。
自動スケーリングを選択すると、オプションの [ノードの最小数] フィールドが表示されます。サービスがスケールダウンしたときにも稼働し続けるノードの最小数を入力できます。
手動スケーリングを選択すると、常に稼働し続ける [ノードの数] を入力する必要があります。
マシンタイプごとのスケーリング オプションの違いについては、こちらをご覧ください。
Prediction の料金については、こちらをご覧ください。
モデル バージョンの作成を終了するには、[保存] をクリックします。
gcloud
モデルバイナリが配置されている Cloud Storage ディレクトリへのパス、モデル名、バージョン名、使用するフレームワークを格納する環境変数を設定します。
gcloud CLI を使用してバージョンを作成する場合、フレームワーク名の入力には大文字とアンダースコアを使用することも(例:
SCIKIT_LEARN
)、小文字とハイフンを使用することも(例:scikit-learn
)できます。どちらのオプションを使用しても同じ動作になります。[VALUES_IN_BRACKETS]
は適切な値に置き換えます。MODEL_DIR="gs://your_bucket_name/" VERSION_NAME="[YOUR-VERSION-NAME]" MODEL_NAME="[YOUR-MODEL-NAME]" FRAMEWORK="[YOUR-FRAMEWORK_NAME]"
バージョンを作成します。
gcloud ai-platform versions create $VERSION_NAME \ --model=$MODEL_NAME \ --origin=$MODEL_DIR \ --runtime-version=2.11 \ --framework=$FRAMEWORK \ --python-version=3.7 \ --region=REGION \ --machine-type=MACHINE_TYPE
以下のように置き換えます。
REGION: モデルを作成したリージョン エンドポイントのリージョン。グローバル エンドポイントにモデルを作成した場合、
--region
フラグは省略します。MACHINE_TYPE: マシンタイプ。予測ノードで使用できるコンピューティング リソースを指定します。
バージョンの作成には数分かかります。完了すると次の出力が表示されます。
Creating version (this might take a few minutes)......done.
新しいバージョンに関する情報を取得します。
gcloud ai-platform versions describe $VERSION_NAME \ --model=$MODEL_NAME
次のような出力が表示されます。
createTime: '2018-02-28T16:30:45Z' deploymentUri: gs://your_bucket_name framework: [YOUR-FRAMEWORK-NAME] machineType: mls1-c1-m2 name: projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME] pythonVersion: '3.7' runtimeVersion: '2.11' state: READY
REST API
リクエスト本文の形式を整え、バージョン オブジェクトを追加します。次の例では、バージョンの
name
、deploymentUri
、runtimeVersion
、framework
、machineType
を指定しています。[VALUES_IN_BRACKETS]
は適切な値に置き換えます。{ "name": "[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name/", "runtimeVersion": "2.11", "framework": "[YOUR_FRAMEWORK_NAME]", "pythonVersion": "3.7", "machineType": "[YOUR_MACHINE_TYPE]" }
[VALUES_IN_BRACKETS]
を適切な値に置き換えた次のパスに対して REST API 呼び出しを実行します。POST https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions
REGION は、モデルを作成したリージョン エンドポイントのリージョンに置き換えます。グローバル エンドポイントにモデルを作成した場合は、
ml.googleapis.com
を使用します。たとえば、
curl
コマンドを使用して次のリクエストを行えます。curl -X POST -H "Content-Type: application/json" \ -d '{"name": "[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name/", "runtimeVersion": "2.11", "framework": "[YOUR_FRAMEWORK_NAME]", "pythonVersion": "3.7", "machineType": "[YOUR_MACHINE_TYPE]"}' \ -H "Authorization: Bearer `gcloud auth print-access-token`" \ "https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions"
バージョンの作成には数分かかります。完了すると、次のような出力が表示されます。
{ "name": "projects/[YOUR-PROJECT-ID]/operations/create_[YOUR-MODEL-NAME]_[YOUR-VERSION-NAME]-[TIMESTAMP]", "metadata": { "@type": "type.googleapis.com/google.cloud.ml.v1.OperationMetadata", "createTime": "2018-07-07T02:51:50Z", "operationType": "CREATE_VERSION", "modelName": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]", "version": { "name": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name", "createTime": "2018-07-07T02:51:49Z", "runtimeVersion": "2.11", "framework": "[YOUR_FRAMEWORK_NAME]", "machineType": "[YOUR_MACHINE_TYPE]", "pythonVersion": "3.7" } } }
オンライン予測リクエストを送信する
バージョンが正常に作成されると、AI Platform Prediction が予測リクエストを処理する新しいサーバーを起動します。
このセクションでは、次の方法を説明します。
gcloud
を使用して、小規模なデータセットに対するリクエストを送信し、モデルをテストする方法。- Python クライアント ライブラリを使用して、完全なテスト データセットに対する複数のリクエストを送信し、最初の 10 件の結果を表示する方法。
gcloud
このセクションでは、前のステップで作成した input.json
ファイルを使用して予測リクエストを送信する方法について説明します。
モデル名、バージョン名、入力ファイル名を環境変数に設定します。
[VALUES_IN_BRACKETS]
を適切な値に置き換えます。MODEL_NAME="[YOUR-MODEL-NAME]" VERSION_NAME="[YOUR-VERSION-NAME]" INPUT_FILE="input.json"
予測リクエストを送信します。
gcloud ai-platform predict --model $MODEL_NAME --version \ $VERSION_NAME --json-instances $INPUT_FILE
個人の年間所得が $50,000 を超えると予測された場合、
True
が返されます。それ以外の場合はFalse
が返されます。たとえば、最初の 10 個の結果は次のように表示されます。[False, False, False, True, False, False, False, False, False, False]
REST API
このセクションでは、前のステップで作成した input.json
ファイルを使用して予測リクエストを送信する方法について説明します。
予測リクエストを送信します。
curl -X POST -H "Content-Type: application/json" -d @input.json \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
"https://ml.googleapis.com/v1/projects/${PROJECT_ID}/models/${MODEL_NAME}/versions/${VERSION_NAME}:predict"
個人の年間所得が $50,000 を超えると予測された場合、True
が返されます。それ以外の場合は False
が返されます。コンソールでは予測結果がブール値のリストとして表示されます。たとえば、最初の 10 個の結果は次のように表示されます。
{"predictions": [false, false, false, true, false, false, false, false, false, false]}
Python
このサンプルでは、Python クライアント ライブラリを使用して Census データセット全体に対する予測リクエストを送信し、最初の 10 個の結果を出力します。ライブラリの使用方法については、Python クライアント ライブラリをご覧ください。
[VALUES_IN_BRACKETS]
は適切な値に置き換えます。
import googleapiclient.discovery
# Fill in your PROJECT_ID, VERSION_NAME and MODEL_NAME before running
# this code.
PROJECT_ID = [YOUR PROJECT_ID HERE]
VERSION_NAME = [YOUR VERSION_NAME HERE]
MODEL_NAME = [YOUR MODEL_NAME HERE]
service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}'.format(PROJECT_ID, MODEL_NAME)
name += '/versions/{}'.format(VERSION_NAME)
# Due to the size of the data, it needs to be split in 2
first_half = test_features[:int(len(test_features)/2)]
second_half = test_features[int(len(test_features)/2):]
complete_results = []
for data in [first_half, second_half]:
responses = service.projects().predict(
name=name,
body={'instances': data}
).execute()
if 'error' in responses:
print(response['error'])
else:
complete_results.extend(responses['predictions'])
# Print the first 10 responses
for i, response in enumerate(complete_results[:10]):
print('Prediction: {}\tLabel: {}'.format(response, test_labels[i]))
個人の年間所得が $50,000 を超えると予測された場合、True
が返されます。それ以外の場合は False
が返されます。たとえば、最初の 10 個の結果は次のように表示されます。
Prediction: False Label: False
Prediction: False Label: False
Prediction: True Label: True
Prediction: True Label: True
Prediction: False Label: False
Prediction: False Label: False
Prediction: False Label: False
Prediction: True Label: True
Prediction: False Label: False
Prediction: False Label: False
各入力パラメータの詳細については、AI Platform Prediction API の予測リクエストの詳細をご覧ください。
データについて
このサンプルのトレーニングに使用している国勢調査所得データセットは、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 は、このデータセットの使用で、直接または間接の損害が発生したとしても一切の責任を負いません。
次のステップ
- このチュートリアルを GitHub の Jupyter ノートブックで試してみる。
- GitHub で別のサンプル scikit-learn ノートブックを参照する。