예측 모델 내보내기

AI Platform Prediction에서 예측을 제공하려면 학습된 머신러닝 모델을 1개 이상의 아티팩트로 내보내야 합니다. 이 가이드에서는 AI Platform Prediction에서 학습된 모델을 내보내어 배포하는 여러 가지 방법을 설명합니다.

다음과 같은 모델 내보내기 방법은 AI Platform Prediction이나 다른 곳에서 학습을 수행한 후 AI Platform Prediction에 배포하여 예측을 제공하려는 경우에 사용할 수 있습니다.

모델을 내보낸 후 예측을 제공할 수 있도록 AI Platform Prediction에 모델버전 리소스를 만드는 방법을 알아보려면 모델 배포 가이드를 읽어보세요.

예측을 위한 커스텀 코드

scikit-learn 파이프라인 또는 커스텀 예측 루틴을 내보내면 머신러닝 프레임워크에서 제공하는 예측 루틴 이외에 예측 시 실행할 커스텀 코드를 포함할 수 있습니다. 이렇게 하면 예측 입력을 사전 처리하거나 예측 결과를 사후 처리하거나 커스텀 로깅을 추가할 수 있습니다.

최대 모델 크기

기존(MLS1) 머신 유형을 사용하는 경우 AI Platform 예측에 배포하는 모델 아티팩트의 전체 파일 크기는 500MB 이하여야 합니다. Compute Engine(N1) 머신 유형을 사용하는 경우에는 10GB 이하여야 합니다. 온라인 예측용 머신 유형에 대해 자세히 알아보세요.

TensorFlow 저장된 모델 내보내기

TensorFlow를 사용하여 모델을 학습시키는 경우 모델을 TensorFlow 저장된 모델 디렉터리로 내보냅니다. AI Platform Prediction에 배포할 수 있는 TensorFlow 저장된 모델을 내보내는 방법을 알아보려면 예측용 저장된 모델 내보내기 가이드를 참조하세요.

커스텀 예측 루틴의 일부로 TensorFlow 모델을 배포하려는 경우 저장된 모델 또는 다른 아티팩트 집합으로 내보낼 수 있습니다. 자세한 내용은 커스텀 예측 루틴 가이드를 참조하세요.

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 에스티메이터 내보내기

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 파이프라인 클래스는 여러 에스티메이터를 작성하는 데 유용합니다. 예를 들어 변환기를 사용하여 데이터를 사전 처리하고 변환된 데이터를 분류자에 전달할 수 있습니다. 다른 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
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 아티팩트만 내보내면 됩니다. scikit-learn이 AI Platform Prediction 런타임 이미지에 포함되어 있으므로 AI Platform Prediction 배포에서 예측 시 이와 같은 변환기를 사용할 수 있습니다.

하지만 scikit-learn의 FunctionTransformer 또는 TransformerMixin 클래스를 사용하여 커스텀 변환을 통합할 수도 있습니다. 이렇게 하려면 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

다음 변환을 사용하여 파이프라인을 학습시켜 내보내세요. 파이프라인을 내보내는 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를 만듭니다.

model.joblib 또는 model.pkl 파일과 함께 이 tar 파일을 배포하는 방법을 알아보려면 모델 배포 가이드를 읽어보세요.

my_module.py는 NumPy 및 scikit-learn을 종속 항목으로 사용합니다. 이 두 라이브러리는 AI Platform Prediction 런타임 이미지에 포함되어 있으므로 tar 파일에 포함할 필요가 없습니다.

커스텀 파이프라인 코드 사용에 대한 자세한 튜토리얼은 scikit-learn 파이프라인에 커스텀 코드 사용을 참조하세요.

커스텀 예측 루틴 내보내기

유연성을 최대화하기 위해 커스텀 예측 루틴을 만들어 내보낼 수 있습니다. 커스텀 예측 루틴을 사용하면 AI Platform Prediction에서 예측시 실행할 Python 코드와 예측 중에 사용할 학습 아티팩트도 제공할 수 있습니다.

사용법을 알아보려면 커스텀 예측 루틴 가이드를 읽어보세요.

다음 단계