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.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 에스티메이터 내보내기
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에 내보내는 방법을 보여줍니다. 예시에서는 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
를 만듭니다.
model.joblib
또는 model.pkl
파일과 함께 이 tar 파일을 배포하는 방법을 알아보려면 모델 배포 가이드를 읽어보세요.
my_module.py
는 NumPy 및 scikit-learn을 종속 항목으로 사용합니다. 이 두 라이브러리는 AI Platform Prediction 런타임 이미지에 포함되어 있으므로 tar 파일에 포함할 필요가 없습니다.
커스텀 파이프라인 코드 사용에 대한 자세한 튜토리얼은 scikit-learn 파이프라인에 커스텀 코드 사용을 참조하세요.
커스텀 예측 루틴 내보내기
유연성을 최대화하기 위해 커스텀 예측 루틴을 만들어 내보낼 수 있습니다. 커스텀 예측 루틴을 사용하면 AI Platform Prediction에서 예측시 실행할 Python 코드와 예측 중에 사용할 학습 아티팩트도 제공할 수 있습니다.
사용법을 알아보려면 커스텀 예측 루틴 가이드를 읽어보세요.
다음 단계
- AI Platform Prediction에 내보낸 모델을 배포하여 예측을 제공하는 방법 알아보기
- scikit-learn 파이프라인에 커스텀 코드 사용 튜토리얼 살펴보기
- 커스텀 예측 루틴을 만드는 방법 알아보기