为了从 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.Booster
的save_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.joblib
或 model.pkl
工件就足够了。AI Platform Prediction 部署可在预测时使用这些转换器,因为 scikit-learn 已包含在 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
然后,使用以下转换来训练和导出流水线。您可以在以下标签页之间切换,查看导出流水线的两种方法:
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.joblib
或 model.pkl
文件一起部署。
请注意,my_module.py
将 NumPy 和 scikit-learn 用作依赖项。由于这两个库都已包含在 AI Platform Prediction 运行时映像中,因此不需要在 tar 文件中包含它们。
如需深入学习有关如何使用自定义流水线代码的教程,请参阅使用 scikit-learn 流水线的自定义代码。
导出自定义预测例程
为了尽可能提高灵活性,请创建并导出自定义预测例程。通过自定义预测例程,您可以为 AI Platform Prediction 提供您希望在预测时运行的 Python 代码,以及您希望在预测期间使用的任何训练工件。
请参阅自定义预测例程指南,了解如何使用这些例程。
后续步骤
- 了解如何将导出的模型部署到 AI Platform Prediction 以执行预测。
- 学习有关如何在 scikit-learn 流水线中使用自定义代码的教程。
- 了解如何创建自定义预测例程。