予測のためのモデルのエクスポート

AI Platform から予測を提供するには、トレーニング済みの機械学習モデルを 1 つ以上のアーティファクトとしてエクスポートする必要があります。このガイドでは、AI Platform の予測にデプロイするトレーニング済みモデルをエクスポートする方法をいくつか紹介します。

ここで紹介するモデルのエクスポート方法はそれぞれ、AI Platform 上でトレーニングを実施する場合にも、トレーニングを別の場所で実施して予測のみを AI プラットフォームにデプロイして行う場合にも適用できます。

モデルのエクスポート後は、モデルのデプロイに関するガイドで、予測を行うモデルとバージョンのリソースを AI Platform で作成する方法の説明をご覧ください。

予測のカスタムコード

scikit-learn パイプラインカスタム予測ルーチンをエクスポートする場合は、機械学習フレームワークで提供される予測ルーチンのほかに、予測時に実行されるカスタムコードを含めることもできます。これは、予測入力の前処理、予測結果の後処理、カスタム ロギングの追加を行う場合に使用できます。

モデルの最大サイズ

レガシー(MLS1)マシンタイプを使用している場合、AI Platform Prediction にデプロイするモデル アーティファクトのファイルサイズの合計は、500 MB 以下にする必要があります。Compute Engine(N1)マシンタイプ(ベータ版)を使用している場合、2 GB 以下である必要があります。詳細は、オンライン予測のマシンタイプをご覧ください。

TensorFlow SavedModel をエクスポートする

TensorFlow を使用してモデルをトレーニングする場合、モデルを TensorFlow SavedModel ディレクトリとしてエクスポートできます。AI Platform の予測へのデプロイが可能な TensorFlow SavedModel をエクスポートする方法については、予測に使用する SavedModel をエクスポートするためのガイドをご覧ください。

TensorFlow モデルをカスタム予測ルーチンの一部としてデプロイする場合は、モデルを SavedModel としても、別のアーティファクトのセットとしてもエクスポートできます。詳しくは、カスタム予測ルーチンに関するガイドをご覧ください。

XGBoost ブースターのエクスポート

XGBoost を使用してモデルをトレーニングする場合は、次の 3 つの方法のいずれかでトレーニング済みモデルをエクスポートできます。

  • xgboost.Boostersave_model メソッドを使用して、ファイル model.bst をエクスポートする。
  • sklearn.externals.joblib を使用して、ファイル model.joblib をエクスポートする。
  • Python の pickle モジュールを使用して、ファイル model.pkl をエクスポートする。

モデルのアーティファクトのファイル名は、これらのオプションのいずれかと正確に一致している必要があります。

次のタブ表記の例は、これら 3 つの方法のそれぞれでモデルをトレーニングしてエクスポートする方法を示しています。

xgboost.Booster

from sklearn import datasets
import xgboost as xgb

iris = datasets.load_iris()
dtrain = xgb.DMatrix(iris.data, label=iris.target)
bst = xgb.train({}, dtrain, 20)

bst.save_model('model.bst')

joblib

from sklearn import datasets
from sklearn.externals import joblib
import xgboost as xgb

iris = datasets.load_iris()
dtrain = xgb.DMatrix(iris.data, label=iris.target)
bst = xgb.train({}, dtrain, 20)

joblib.dump(bst, 'model.joblib')

pickle

import pickle

from sklearn import datasets
import xgboost as xgb

iris = datasets.load_iris()
dtrain = xgb.DMatrix(iris.data, label=iris.target)
bst = xgb.train({}, dtrain, 20)

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

scikit-learn Estimator のエクスポート

モデルのトレーニングに scikit-learn を使用する場合は、次の 2 つの方法のいずれかでモデルをエクスポートできます。

  • sklearn.externals.joblib を使用して、ファイル model.joblib をエクスポートする。
  • Python の pickle モジュールを使用して、ファイル model.pkl をエクスポートする。

モデルのアーティファクトのファイル名は、これらのオプションのいずれかと正確に一致している必要があります。

次のタブ表記の例は、これら 2 つの方法のそれぞれでモデルをトレーニングしてエクスポートする方法を示しています。

joblib

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib

iris = datasets.load_iris()
classifier = RandomForestClassifier()
classifier.fit(iris.data, iris.target)

joblib.dump(classifier, 'model.joblib')

pickle

import pickle

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier

iris = datasets.load_iris()
classifier = RandomForestClassifier()
classifier.fit(iris.data, iris.target)

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

scikit-learn パイプラインのエクスポート

scikit-learn の Pipeline クラスは、複数の estimator を作成するうえで効果的です。たとえば、変換機能を使用してデータを前処理し、変換したデータを分類子に渡すことができます。別の scikit-learn estimator をエクスポートする場合と同様に、次の 2 つの方法でパイプラインをエクスポートできます。

  • sklearn.externals.joblib を使用して、ファイル model.joblib をエクスポートする。
  • Python の pickle モジュールを使用して、ファイル model.pkl をエクスポートする。

モデルのアーティファクトのファイル名は、これらのオプションのいずれかと正確に一致している必要があります。

次のタブ表記の例は、これら 2 つの方法のそれぞれでモデルをトレーニングしてエクスポートする方法を示しています。

joblib

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import Pipeline

iris = datasets.load_iris()
pipeline = Pipeline([
      ('feature_selection', SelectKBest(chi2, k=2)),
      ('classification', RandomForestClassifier())
    ])
pipeline.fit(iris.data, iris.target)

joblib.dump(pipeline, 'model.joblib')

pickle

import pickle

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import Pipeline

iris = datasets.load_iris()
pipeline = Pipeline([
      ('feature_selection', SelectKBest(chi2, k=2)),
      ('classification', RandomForestClassifier())
    ])
pipeline.fit(iris.data, iris.target)

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

カスタム パイプライン コードのエクスポート

sklearn パッケージのトランスフォーマーのみを使用してパイプラインを構築する場合は、1 つの model.joblib アーティファクトまたは model.pkl アーティファクトをエクスポートすれば十分です。scikit-learn は AI Platform のランタイム イメージに含まれているため、AI Platform のデプロイメントでは、予測時にこうしたトランスフォーマーを使用できます。

ただし、scikit-learn の FunctionTransformer または TransformerMixin のクラスを使用して、カスタム変換を組み込むこともできます。これを行う場合は、カスタムコードをソース配布パッケージとしてエクスポートして、AI Platform に提供できるようにする必要があります。

次の例では、カスタムコードをパイプラインで使用して、AI Platform にエクスポートしています。この例では、FunctionTransformerTransformerMixin の両方を使用しています。一般に、単純な変換には FunctionTransformer が便利です。これに対して TransformerMixin では、予測時に使用できるシリアル化された状態をトレーニング時に保存する、より複雑な変換を定義できます。

まず、以下のコードを my_module.py という名前のファイルに書き込みます。

import numpy as np
from sklearn.base import BaseEstimator
from sklearn.base import TransformerMixin
from sklearn.utils.validation import check_is_fitted

def add_sum(X):
  sums = X.sum(1).reshape((-1,1))
  transformed_X = np.append(X, sums, 1)
  return transformed_X

class MySimpleScaler(BaseEstimator, TransformerMixin):
  def fit(self, X, y=None):
    self.means = np.mean(X, axis=0)
    self.stds = np.std(X, axis=0)
    if not self.stds.all():
      raise ValueError('At least one column has standard deviation of 0.')
    return self

  def transform(self, X):
    check_is_fitted(self, ('means', 'stds'))
    transformed_X = (X - self.means) / self.stds
    return transformed_X

次に、以下の変換を使用してパイプラインのトレーニングとエクスポートを行います。パイプラインをエクスポートする 2 つの方法は、以下のタブを切り替えて表示できます。

joblib

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer

import my_module

iris = datasets.load_iris()
pipeline = Pipeline([
      ('scale_data', my_module.MySimpleScaler()),
      ('add_sum_column', FunctionTransformer(my_module.add_sum)),
      ('classification', RandomForestClassifier())
    ])
pipeline.fit(iris.data, iris.target)

joblib.dump(pipeline, 'model.joblib')

pickle

import pickle

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer

import my_module

iris = datasets.load_iris()
pipeline = Pipeline([
      ('scale_data', my_module.MySimpleScaler()),
      ('add_sum_column', FunctionTransformer(my_module.add_sum)),
      ('classification', RandomForestClassifier())
    ])
pipeline.fit(iris.data, iris.target)

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

最後に、my_module を含む .tar.gzソース配布パッケージを作成します。まず、次に setup.py ファイルを作成します。

from setuptools import setup

setup(name='my_custom_code', version='0.1', scripts=['my_module.py'])

次に、シェルで python setup.py sdist --formats=gztar を実行し dist/my_custom_code-0.1.tar.gz を作成します。

この tarball を model.joblib ファイルまたは model.pkl ファイルと一緒にデプロイする方法については、モデルのデプロイに関するガイドをご覧ください。

なお、my_module.py は NumPy と scikit-learn を依存関係として使用します。これらの両ライブラリは AI Platform ランタイム イメージに含まれているので、tarball に含める必要はありません。

カスタム パイプライン コードの使用に関する詳細なチュートリアルについては、scikit-learn パイプライン用のカスタムコードを使用するをご覧ください。

カスタム予測ルーチンのエクスポート

最大限の柔軟性を実現するには、カスタム予測ルーチンを作成してエクスポートします。カスタム予測ルーチンを使用すると、予測時に実行する Python コードや、予測時に使用するトレーニング アーティファクトを AI Platform に提供できます。

それらの使用方法については、カスタム予測ルーチンに関するガイドをご覧ください。

次のステップ