Mengekspor model untuk prediksi

Untuk menayangkan prediksi dari AI Platform Prediction, Anda harus mengekspor model machine learning terlatih sebagai satu atau beberapa artefak. Panduan ini menjelaskan berbagai cara untuk mengekspor model terlatih untuk di-deploy di AI Platform Prediction.

Metode ekspor model berikut berlaku baik jika Anda melakukan pelatihan di AI Platform Prediction atau melakukan pelatihan di tempat lain dan hanya ingin men-deploy ke AI Platform Prediction untuk menayangkan prediksi.

Setelah mengekspor model, baca panduan untuk men-deploy model guna mempelajari cara membuat resource model dan versi di AI Platform Prediction untuk menayangkan prediksi.

Kode kustom untuk prediksi

Jika mengekspor pipeline scikit-learn atau rutinitas prediksi kustom, Anda dapat menyertakan kode kustom untuk dijalankan pada waktu prediksi, tidak hanya rutinitas prediksi yang disediakan framework machine learning Anda. Anda dapat menggunakannya untuk memproses input prediksi, memproses hasil prediksi, atau menambahkan logging kustom.

Ukuran model maksimum

Ukuran file total artefak model yang Anda deploy ke AI Platform Prediction harus 500 MB atau kurang jika Anda menggunakan jenis mesin lama (MLS1). Ukurannya harus 10 GB atau kurang jika Anda menggunakan jenis mesin Compute Engine (N1). Pelajari lebih lanjut jenis mesin untuk prediksi online.

Mengekspor TensorFlow SavedModel

Jika Anda menggunakan TensorFlow untuk melatih model, ekspor model Anda sebagai direktori SavedModel TensorFlow. Untuk mempelajari cara mengekspor SavedModel TensorFlow yang dapat Anda deploy ke AI Platform Prediction, baca panduan untuk mengekspor SavedModel untuk prediksi.

Jika ingin men-deploy model TensorFlow sebagai bagian dari rutinitas prediksi kustom, Anda dapat mengekspornya sebagai SavedModel atau sebagai kumpulan artefak yang berbeda. Baca panduan untuk rutinitas prediksi kustom untuk mempelajari lebih lanjut.

Mengekspor booster XGBoost

Jika menggunakan XGBoost untuk melatih model, Anda dapat mengekspor model terlatih dengan salah satu dari tiga cara berikut:

  • Gunakan metode save_model xgboost.Booster untuk mengekspor file bernama model.bst.
  • Gunakan sklearn.externals.joblib untuk mengekspor file bernama model.joblib.
  • Gunakan modul pickle Python untuk mengekspor file bernama model.pkl.

Nama file artefak model Anda harus sama persis dengan salah satu opsi ini.

Contoh dengan tab berikut menunjukkan cara melatih dan mengekspor model dengan ketiga cara tersebut:

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)

Mengekspor estimator scikit-learn

Jika menggunakan scikit-learn untuk melatih model, Anda dapat mengekspornya dengan salah satu dari dua cara berikut:

  • Gunakan sklearn.externals.joblib untuk mengekspor file bernama model.joblib.
  • Gunakan modul pickle Python untuk mengekspor file bernama model.pkl.

Nama file artefak model Anda harus sama persis dengan salah satu opsi ini.

Contoh dengan tab berikut menunjukkan cara melatih dan mengekspor model dengan kedua cara tersebut:

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)

Mengekspor pipeline scikit-learn

Class Pipeline scikit-learn dapat membantu Anda menyusun beberapa estimator. Misalnya, Anda dapat menggunakan pengubah untuk memproses data sebelumnya dan meneruskan data yang diubah ke pengklasifikasi. Anda dapat mengekspor Pipeline dengan dua cara yang sama seperti saat mengekspor estimator scikit-learn lainnya:

  • Gunakan sklearn.externals.joblib untuk mengekspor file bernama model.joblib.
  • Gunakan modul pickle Python untuk mengekspor file bernama model.pkl.

Nama file artefak model Anda harus sama persis dengan salah satu opsi ini.

Contoh dengan tab berikut menunjukkan cara melatih dan mengekspor model dengan kedua cara tersebut:

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)

Mengekspor kode pipeline kustom

Jika Anda hanya menggunakan transformer dari paket sklearn untuk mem-build pipeline, cukup ekspor satu artefak model.joblib atau model.pkl. Deployment AI Platform Prediction Anda dapat menggunakan pengubah ini pada waktu prediksi karena scikit-learn disertakan dalam image runtime AI Platform Prediction.

Namun, Anda juga dapat menggunakan class FunctionTransformer atau TransformerMixin scikit-learn untuk menggabungkan transformasi kustom. Jika melakukannya, Anda harus mengekspor kode kustom sebagai paket distribusi sumber agar dapat memberikannya ke AI Platform Prediction.

Contoh berikut menunjukkan cara menggunakan kode kustom dalam pipeline dan mengekspornya untuk AI Platform Prediction. Contoh ini menggunakan FunctionTransformer dan TransformerMixin. Secara umum, FunctionTransformer mungkin lebih praktis untuk transformasi dasar, tetapi TransformerMixin memungkinkan Anda menentukan transformasi yang lebih kompleks yang menyimpan status serialisasi pada waktu pelatihan yang dapat digunakan selama prediksi.

Pertama, tulis kode berikut ke file bernama 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

Kemudian, latih dan ekspor pipeline menggunakan transformasi berikut. Alihkan tab berikut untuk melihat dua cara mengekspor pipeline:

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)

Terakhir, buat paket distribusi sumber .tar.gz yang berisi my_module. Untuk melakukannya, buat file setup.py berikut terlebih dahulu:

from setuptools import setup

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

Kemudian, jalankan python setup.py sdist --formats=gztar di shell untuk membuat dist/my_custom_code-0.1.tar.gz.

Baca panduan untuk men-deploy model guna mempelajari cara men-deploy file tar ini bersama dengan file model.joblib atau model.pkl Anda.

Perhatikan bahwa my_module.py menggunakan NumPy dan scikit-learn sebagai dependensi. Karena kedua library ini disertakan dalam image runtime AI Platform Prediction, Anda tidak perlu menyertakannya dalam file tar.

Untuk tutorial yang lebih mendalam tentang cara menggunakan kode pipeline kustom, lihat Menggunakan kode kustom untuk pipeline scikit-learn.

Mengekspor rutinitas prediksi kustom

Untuk fleksibilitas maksimum, buat dan ekspor rutinitas prediksi kustom. Rutinitas prediksi kustom memungkinkan Anda menyediakan AI Platform Prediction dengan kode Python yang ingin dijalankan pada waktu prediksi, serta artefak pelatihan yang ingin Anda gunakan selama prediksi.

Baca panduan untuk rutinitas prediksi kustom guna mempelajari cara menggunakannya.

Langkah selanjutnya