scikit-learn으로 커스텀 예측 루틴 만들기

Colab 로고 이 튜토리얼을 Colab에서 메모장으로 실행하기 GitHub 로고 GitHub에서 메모장 보기

개요

이 튜토리얼에서는 학습된 scikit-learn 모델을 AI Platform Prediction에 배포하고 커스텀 예측 루틴을 사용하여 예측을 수행하는 방법을 보여줍니다. 이를 통해 AI Platform Prediction에서 각 예측 요청에 응답하는 방법을 맞춤설정할 수 있습니다.

이 예시에서는 커스텀 예측 루틴을 사용해서 예측 입력을 확장하여 사전 처리하고 클래스 숫자를 라벨 문자열로 변환하여 예측 출력을 후처리합니다.

이 튜토리얼은 여러 단계에 따라 진행됩니다.

  • 간단한 scikit-learn 모델을 로컬로(이 메모장에서) 학습
  • 커스텀 예측 루틴을 만들어 AI Platform Prediction에 배포
  • 이 배포에서 예측 요청에 대응

데이터세트

이 튜토리얼에서는 머신러닝 기술을 시험하는 용도로 많이 사용되는 작은 데이터세트인 R.A. Fisher의 Iris 데이터세트를 사용합니다. 각 인스턴스에는 꽃의 다양한 측정치인 4개의 숫자 특성과 이를 세 가지 붓꽃 유형인 부채 붓꽃, 버시컬러 붓꽃, 버지니카 붓꽃 중 하나로 표시하는 타겟 라벨이 있습니다.

이 튜토리얼에서는 scikit-learn 라이브러리에 포함된 Iris 데이터 세트 복사본을 사용합니다.

목표

목표는 꽃의 측정치를 입력으로 사용하여 붓꽃의 유형을 예측하는 모델을 학습시키는 것입니다.

이 튜토리얼에서는 모델 자체의 설계보다는 AI Platform Prediction에서 이 모델을 사용하는 방법에 중점을 둡니다.

비용

이 튜토리얼에서는 비용이 청구될 수 있는 Google Cloud 구성요소를 사용합니다.

  • AI Platform Prediction
  • Cloud Storage

AI Platform Prediction 가격 책정Cloud Storage 가격 책정에 대해 알아보고 가격 계산기를 사용하여 예상 사용량을 기반으로 비용을 추정해 보세요.

시작하기 전에

AI Platform Prediction에서 모델을 학습시키고 배포하려면 먼저 다음과 같은 몇 가지 작업을 수행해야 합니다.

  • 로컬 개발 환경을 설정합니다.
  • 결제 및 필요한 API가 사용 설정된 Google Cloud 프로젝트를 설정합니다.
  • 학습 패키지와 학습된 모델을 저장할 Cloud Storage 버킷을 만듭니다.

로컬 개발 환경 설정

이 튜토리얼을 완료하려면 다음이 필요합니다.

  • Python 3
  • virtualenv
  • Google Cloud SDK

Python 개발 환경 설정에 대한 Google Cloud 가이드에서는 이러한 요구사항을 충족하는 절차를 상세하게 설명합니다. 다음 단계는 이 절차를 간략하게 설명한 것입니다.

  1. Python 3을 설치합니다.

  2. virtualenv를 설치하고 Python 3을 사용하는 가상 환경을 만듭니다.

  3. 이 환경을 활성화합니다.

  4. 다음 섹션의 단계를 완료하여 Google Cloud SDK를 설치합니다.

Google Cloud 프로젝트 설정

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

GCP 계정 인증

인증을 설정하려면 서비스 계정 키를 만들고 서비스 계정 키의 파일 경로에 해당하는 환경 변수를 설정해야 합니다.

  1. 서비스 계정을 만듭니다.

    1. Google Cloud 콘솔에서 서비스 계정 만들기 페이지로 이동합니다.

      서비스 계정 만들기로 이동

    2. 서비스 계정 이름 필드에 이름을 입력합니다.
    3. 선택사항: 서비스 계정 설명 필드에 설명을 입력합니다.
    4. 만들기를 클릭합니다.
    5. 역할 선택 필드를 클릭합니다. 모든 역할에서 AI Platform > AI Platform 관리자를 선택합니다.
    6. 다른 역할 추가를 클릭합니다.
    7. 역할 선택 필드를 클릭합니다. 모든 역할에서 스토리지 > 스토리지 객체 관리자를 선택합니다.

    8. 완료를 클릭하여 서비스 계정을 만듭니다.

      브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.

  2. 다음과 같이 인증을 위한 서비스 계정 키를 만듭니다.

    1. Google Cloud 콘솔에서 만든 서비스 계정의 이메일 주소를 클릭합니다.
    2. 를 클릭합니다.
    3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
    4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.
    5. 닫기를 클릭합니다.
  3. 환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 서비스 계정 키가 포함된 JSON 파일의 파일 경로로 설정합니다. 이 변수는 현재 셸 세션에만 적용되므로 새 세션을 연 경우 변수를 다시 설정합니다.

Cloud Storage 버킷 생성

커스텀 예측 루틴을 배포하려면 학습된 모델 아티팩트와 커스텀 코드를 Cloud Storage에 업로드해야 합니다.

Cloud Storage 버킷 이름을 환경 변수로 설정합니다. 이 이름은 모든 Cloud Storage 버킷에서 고유해야 합니다.

BUCKET_NAME="your-bucket-name"

AI Platform Prediction을 사용할 수 있는 리전을 선택하고 다른 환경 변수를 만듭니다.

REGION="us-central1"

이 리전에 Cloud Storage 버킷을 만들고 나중에 같은 리전을 학습 및 예측에 사용합니다. 버킷이 아직 없으면 다음 명령어를 실행하여 버킷을 만듭니다.

gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION

scikit-learn 모델 빌드 및 학습

원시 형식의 데이터로는 머신러닝 모델을 학습시킬 수 없는 경우가 많습니다. 학습이 가능하다 해도 학습에 사용하기 전에 데이터를 사전 처리하면 경우에 따라 모델을 개선할 수 있습니다.

예측 입력의 형식이 학습 데이터와 동일할 것으로 예상한다면 학습과 예측에 동일한 사전 처리를 적용하여 모델이 일관적인 예측을 하도록 해야 합니다.

이 섹션에서는 사전 처리 모듈을 만들고 이를 학습에 사용합니다. 그런 다음 나중에 커스텀 예측 루틴에서 사용하기 위해 학습 중 익힌 특성과 함께 사전 처리기를 내보냅니다.

로컬 학습을 위한 종속 항목 설치

로컬 학습을 위해서는 여러 가지 종속 항목이 필요합니다.

pip install numpy>=1.16.0 scikit-learn==0.20.2

전처리기 작성

각 숫자 특성 열의 평균 값이 0이고 표준 편차가 1이 되도록 학습 데이터를 조정하면 모델을 개선할 수 있습니다.

이 조정을 수행하기 위한 클래스가 포함된 preprocess.py를 만듭니다.

import numpy as np

class MySimpleScaler(object):
  def __init__(self):
    self._means = None
    self._stds = None

  def preprocess(self, data):
    if self._means is None: # during training only
      self._means = np.mean(data, axis=0)

    if self._stds is None: # during training only
      self._stds = np.std(data, axis=0)
      if not self._stds.all():
        raise ValueError('At least one column has standard deviation of 0.')

    return (data - self._means) / self._stds

MySimpleScaler 인스턴스는 첫 사용 시 특성 열의 평균과 표준 편차를 저장합니다. 그런 다음 이 요약 통계를 사용하여 이후에 입력된 데이터를 조정합니다.

이로써 학습 분포의 특성을 저장하고 예측 시 동일한 사전 처리에 이를 사용할 수 있습니다.

모델 학습

이제 preprocess.MySimpleScaler를 사용하여 붓꽃 데이터를 사전 처리한 후 scikit-learn을 사용하여 모델을 학습시킵니다.

마지막으로 학습된 모델을 joblib(.joblib) 파일로 내보내고 MySimpleScaler 인스턴스를 피클(.pkl) 파일로 내보냅니다.

import pickle

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib

from preprocess import MySimpleScaler

iris = load_iris()
scaler = MySimpleScaler()
X = scaler.preprocess(iris.data)
y = iris.target

model = RandomForestClassifier()
model.fit(X, y)

joblib.dump(model, 'model.joblib')
with open ('preprocessor.pkl', 'wb') as f:
  pickle.dump(scaler, f)

커스텀 예측 루틴 배포

학습된 모델에서 예측을 수행하기 위해 커스텀 예측 루틴을 배포하려면 다음 안내를 따르세요.

  • 요청을 처리할 커스텀 예측자 생성
  • 예측자와 사전 처리 모듈을 패키징
  • 모델 아티팩트와 커스텀 코드를 Cloud Storage로 업로드
  • 커스텀 예측 루틴을 AI Platform Prediction에 배포

커스텀 예측자 만들기

커스텀 예측 루틴을 배포하려면 예측자 인터페이스를 구현하는 클래스를 만들어야 합니다. 이는 AI Platform Prediction에 모델을 로드하는 방법과 예측 요청을 처리하는 방법을 알려줍니다.

predictor.py에 다음 코드를 작성합니다.

import os
import pickle

import numpy as np
from sklearn.datasets import load_iris
from sklearn.externals import joblib

class MyPredictor(object):
  def __init__(self, model, preprocessor):
    self._model = model
    self._preprocessor = preprocessor
    self._class_names = load_iris().target_names

  def predict(self, instances, **kwargs):
    inputs = np.asarray(instances)
    preprocessed_inputs = self._preprocessor.preprocess(inputs)
    if kwargs.get('probabilities'):
      probabilities = self._model.predict_proba(preprocessed_inputs)
      return probabilities.tolist()
    else:
      outputs = self._model.predict(preprocessed_inputs)
      return [self._class_names[class_num] for class_num in outputs]

  @classmethod
  def from_path(cls, model_dir):
    model_path = os.path.join(model_dir, 'model.joblib')
    model = joblib.load(model_path)

    preprocessor_path = os.path.join(model_dir, 'preprocessor.pkl')
    with open(preprocessor_path, 'rb') as f:
      preprocessor = pickle.load(f)

    return cls(model, preprocessor)

학습 중 정의한 사전 처리기를 사용하는 것 외에, 이 예측자는 예측 출력을 클래스 색인(0, 1, 2)에서 라벨 문자열(꽃 유형의 이름)로 변환하는 후처리 단계를 수행합니다.

그러나 예측자는 값이 Trueprobabilities 키워드 인수를 받는 경우 가능성 배열을 대신 반환하여 3개의 클래스 각각이 올바른 라벨(모델에 따라)일 가능성을 나타냅니다. 이 튜토리얼의 마지막 부분에서는 예측 중에 이 키워드 인수를 제공하는 방법을 보여줍니다.

커스텀 코드 패키징

predictor.pypreprocess.py.tar.gz 소스 배포 패키지로 패키징하고 이 패키지를 AI Platform Prediction에 제공하여 커스텀 코드로 예측을 수행할 수 있도록 해야 합니다.

다음 setup.py를 작성하여 패키지를 정의합니다.

from setuptools import setup

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

그런 후에 다음 명령어를 실행하여 dist/my_custom_code-0.1.tar.gz를 만듭니다.

python setup.py sdist --formats=gztar

모델 아티팩트와 커스텀 코드를 Cloud Storage로 업로드

작업을 위해 모델을 배포하려면 AI Platform Prediction에서 Cloud Storage의 다음 파일에 액세스할 수 있어야 합니다.

  • model.joblib(모델 아티팩트)
  • preprocessor.pkl(모델 아티팩트)
  • my_custom_code-0.1.tar.gz(커스텀 코드)

모델 아티팩트는 예측자가 from_path 클래스 메서드에서 model_dir 인수로 액세스할 수 있는 모델 디렉터리에 함께 저장되어야 합니다. 커스텀 코드는 같은 디렉터리에 위치할 필요가 없습니다. 다음 명령어를 실행하여 파일을 업로드합니다.

gcloud storage cp ./dist/my_custom_code-0.1.tar.gz gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz
gcloud storage cp model.joblib preprocessor.pkl gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/

커스텀 예측 루틴 배포

커스텀 예측 루틴을 배포하려면 모델 리소스와 버전 리소스를 만듭니다. 먼저 리소스 이름으로 환경 변수를 정의합니다.

MODEL_NAME='IrisPredictor'
VERSION_NAME='v1'

그런 다음 모델을 만듭니다.

gcloud ai-platform models create $MODEL_NAME \
  --regions $REGION

그 다음 버전을 만듭니다. 이 단계에서 Cloud Storage에 업로드한 아티팩트와 커스텀 코드의 경로를 제공합니다.

gcloud components install beta

gcloud beta ai-platform versions create $VERSION_NAME \
  --model $MODEL_NAME \
  --runtime-version 1.13 \
  --python-version 3.5 \
  --origin gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/ \
  --package-uris gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz \
  --prediction-class predictor.MyPredictor

커스텀 예측 루틴을 배포할 때 지정해야 하는 옵션에 대해 자세히 알아보세요.

온라인 예측 수행

온라인 예측 요청을 전송하여 배포를 시험합니다. 먼저 Python용 Google API 클라이언트 라이브러리를 설치합니다.

pip install --upgrade google-api-python-client

그런 다음 아래 Python 코드를 실행하여 두 가지 붓꽃 데이터 인스턴스를 배포된 버전으로 전송합니다.

import googleapiclient.discovery

instances = [
  [6.7, 3.1, 4.7, 1.5],
  [4.6, 3.1, 1.5, 0.2],
]

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}/versions/{}'.format(PROJECT_ID, MODEL_NAME, VERSION_NAME)

response = service.projects().predict(
    name=name,
    body={'instances': instances}
).execute()

if 'error' in response:
    raise RuntimeError(response['error'])
else:
  print(response['predictions'])
['versicolor', 'setosa']

키워드 인수 보내기

커스텀 예측 루틴으로 예측 요청을 보낼 때 요청 본문에 추가 필드를 제공할 수 있습니다. 예측자의 predict 메서드는 이를 **kwargs 사전의 필드로 수신합니다.

다음 코드는 이전과 같은 요청을 보내지만 이번에는 요청 본문에 probabilities 필드를 추가합니다.

response = service.projects().predict(
    name=name,
    body={'instances': instances, 'probabilities': True}
).execute()

if 'error' in response:
    raise RuntimeError(response['error'])
else:
  print(response['predictions'])
[[0.0, 1.0, 0.0], [1.0, 0.0, 0.0]]

삭제

이 프로젝트에 사용된 모든 GCP 리소스를 삭제하려면 튜토리얼에 사용한 GCP 프로젝트를 삭제하면 됩니다.

또는 다음 명령어를 실행하여 개별 리소스를 삭제할 수 있습니다.

# Delete version resource
gcloud ai-platform versions delete $VERSION_NAME --quiet --model $MODEL_NAME

# Delete model resource
gcloud ai-platform models delete $MODEL_NAME --quiet

# Delete Cloud Storage objects that were created
gcloud storage rm gs://$BUCKET_NAME/custom_prediction_routine_tutorial --recursive

다음 단계