导出模型以进行预测

为了从 AI Platform Prediction 执行预测,您必须将经过训练的机器学习模型导出为一个或多个工件。本指南介绍了几种不同的方法,以导出经过训练的模型,并将导出的文件部署到 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 训练模型,则可以通过以下三种方式之一导出经过训练的模型:

  • 使用 xgboost.Boostersave_model 方法导出名为 model.bst 的文件。
  • 使用 sklearn.externals.joblib 导出名为 model.joblib 的文件。
  • 使用 Python 的 pickle 模块导出名为 model.pkl 的文件。

模型工件的文件名必须与其中一个选项完全匹配。

以下标签式示例演示了如何分别使用这三种方式来训练和导出模型:

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 训练模型,则可以通过以下两种方式之一导出模型:

  • 使用 sklearn.externals.joblib 导出名为 model.joblib 的文件。
  • 使用 Python 的 pickle 模块导出名为 model.pkl 的文件。

模型工件的文件名必须与其中一个选项完全匹配。

以下标签式示例分别演示了如何使用这两种方式来训练和导出模型:

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 流水线类可以帮助您组合多个 Estimator。例如,您可以使用转换器预处理数据,然后将转换后的数据传递给分类器。您可以使用与导出其他 scikit-learn Estimator 同样的两种方式导出流水线:

  • 使用 sklearn.externals.joblib 导出名为 model.joblib 的文件。
  • 使用 Python 的 pickle 模块导出名为 model.pkl 的文件。

模型工件的文件名必须与其中一个选项完全匹配。

以下标签式示例分别演示了如何使用这两种方式来训练和导出模型:

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 软件包中的转换器构建流水线,只要导出单个 model.joblibmodel.pkl 工件就足够了。AI Platform Prediction 部署可在预测时使用这些转换器,因为 scikit-learn 已包含在 AI Platform Prediction 运行时映像中

不过,您还可以使用 scikit-learn 的 FunctionTransformerTransformerMixin 类整合自定义转换。如果是这样,您需要将自定义代码导出为源分发软件包,以便将其提供给 AI Platform Prediction。

以下示例展示了如何在流水线中使用自定义代码以及如何为 AI Platform Prediction 导出自定义代码。该示例同时使用了 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

然后,使用以下转换来训练和导出流水线。您可以在以下标签页之间切换,查看导出流水线的两种方法:

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'])

然后在 shell 中运行 python setup.py sdist --formats=gztar 以创建 dist/my_custom_code-0.1.tar.gz

请参阅部署模型指南,了解如何将此 tar 文件与 model.joblibmodel.pkl 文件一起部署。

请注意,my_module.py 将 NumPy 和 scikit-learn 用作依赖项。由于这两个库都已包含在 AI Platform Prediction 运行时映像中,因此不需要在 tar 文件中包含它们。

如需深入学习有关如何使用自定义流水线代码的教程,请参阅使用 scikit-learn 流水线的自定义代码

导出自定义预测例程

为了尽可能提高灵活性,请创建并导出自定义预测例程。通过自定义预测例程,您可以为 AI Platform Prediction 提供您希望在预测时运行的 Python 代码,以及您希望在预测期间使用的任何训练工件。

请参阅自定义预测例程指南,了解如何使用这些例程。

后续步骤