AI Platform Prediction から予測を提供するには、トレーニング済みの機械学習モデルを 1 つ以上のアーティファクトとしてエクスポートする必要があります。このガイドでは、AI Platform Prediction にデプロイするトレーニング済みモデルをエクスポートする方法をいくつか紹介します。
ここで紹介するモデルのエクスポート方法はそれぞれ、AI Platform Prediction 上でトレーニングを実施する場合にも、トレーニングを別の場所で実施して予測のみを AI Platform Prediction にデプロイして行う場合にも適用できます。
モデルのエクスポート後は、モデルのデプロイに関するガイドで、予測を行うモデルとバージョンのリソースを AI Platform Prediction で作成する方法の説明をご覧ください。
予測のカスタムコード
scikit-learn パイプラインやカスタム予測ルーチンをエクスポートする場合は、機械学習フレームワークで提供される予測ルーチンのほかに、予測時に実行されるカスタムコードを含めることもできます。これは、予測入力の前処理、予測結果の後処理、カスタム ロギングの追加を行う場合に使用できます。
モデルの最大サイズ
レガシー(MLS1)マシンタイプを使用している場合、AI Platform Prediction にデプロイするモデル アーティファクトのファイルサイズの合計は、500 MB 以下にする必要があります。Compute Engine(N1)マシンタイプを使用する場合、10 GB 以下にする必要があります。詳細は、オンライン予測のマシンタイプをご覧ください。
TensorFlow SavedModel をエクスポートする
TensorFlow を使用してモデルをトレーニングする場合、モデルを TensorFlow SavedModel ディレクトリとしてエクスポートします。AI Platform Prediction へのデプロイが可能な TensorFlow SavedModel をエクスポートする方法については、予測に使用する SavedModel をエクスポートするためのガイドをご覧ください。
TensorFlow モデルをカスタム予測ルーチンの一部としてデプロイする場合は、モデルを SavedModel としても、別のアーティファクトのセットとしてもエクスポートできます。詳しくは、カスタム予測ルーチンに関するガイドをご覧ください。
XGBoost ブースターのエクスポート
XGBoost を使用してモデルをトレーニングする場合は、次の 3 つの方法のいずれかでトレーニング済みモデルをエクスポートできます。
xgboost.Booster
のsave_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 Prediction のランタイム イメージに含まれているため、AI Platform Prediction のデプロイメントでは、予測時にこうしたトランスフォーマーを使用できます。
ただし、scikit-learn の FunctionTransformer
または TransformerMixin
のクラスを使用して、カスタム変換を組み込むこともできます。これを行う場合は、カスタムコードをソース配布パッケージとしてエクスポートして、AI Platform Prediction に提供できるようにする必要があります。
次の例では、カスタムコードをパイプラインで使用して、AI Platform Prediction にエクスポートしています。この例では、FunctionTransformer
と TransformerMixin
の両方を使用しています。一般に、基本的な変換には 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
を作成します。
この tar ファイルを model.joblib
ファイルまたは model.pkl
ファイルとともにデプロイする方法については、モデルのデプロイに関するガイドをご覧ください。
なお、my_module.py
は NumPy と scikit-learn を依存関係として使用します。これらの両ライブラリは AI Platform Prediction ランタイム イメージに含まれているので、tar ファイルに含める必要はありません。
カスタム パイプライン コードの使用に関する詳細なチュートリアルについては、scikit-learn パイプライン用のカスタムコードを使用するをご覧ください。
カスタム予測ルーチンのエクスポート
最大限の柔軟性を実現するには、カスタム予測ルーチンを作成してエクスポートします。カスタム予測ルーチンを使用すると、予測時に実行する Python コードや、予測時に使用するトレーニング アーティファクトを AI Platform Prediction に提供できます。
それらの使用方法については、カスタム予測ルーチンに関するガイドをご覧ください。
次のステップ
- エクスポートしたモデルを AI Platform Prediction にデプロイして予測を行う方法を学習する
- scikit-learn パイプライン用のカスタムコードの使用に関するチュートリアルを実施する
- カスタム予測ルーチンの作成方法を学習する