scikit-learn으로 온라인 예측 수행

이 샘플에서는 인구통계 소득 데이터세트를 기반으로 개인의 소득 수준을 예측하도록 모델을 학습시킵니다. 모델을 학습시키고 로컬로 저장한 후에는 AI Platform Prediction에 이를 배포하고 쿼리하여 온라인 예측을 수행할 수 있습니다.

AI Platform Prediction에서는 scikit-learn 파이프라인을 배포하고 제공할 수 있습니다. scikit-learn의 파이프라인 모듈을 사용하면 에스티메이터로 학습을 수행하기 전에 여러 데이터 변환을 적용할 수 있습니다. 이렇게 하면 데이터 처리의 여러 단계를 캡슐화하고 각 단계에서 동일한 학습 데이터를 사용할 수 있습니다.

이 가이드는 GitHub에서 Jupyter 메모장으로도 제공됩니다.

모델을 AI Platform Prediction으로 가져오는 방법

다음 5단계에 따라 AI Platform Prediction으로 모델을 가져온 후 예측을 수행할 수 있습니다.

  • 모델을 파일로 저장
  • 저장된 모델을 Cloud Storage에 업로드
  • AI Platform Prediction에서 모델 리소스 생성
  • 모델 버전을 만들고 저장된 모델 연결
  • 온라인 예측 수행

시작하기 전에

다음 단계에 따라 GCP 계정을 설정하고 AI Platform Prediction API를 활성화한 후 Cloud SDK를 설치하여 활성화합니다.

GCP 프로젝트 설정

  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

환경 설정

아래 옵션 중 하나를 선택하여 macOS에서 로컬로 또는 Cloud Shell의 원격 환경에서 환경을 설정합니다.

macOS 사용자는 아래의 MACOS 탭을 사용하여 환경을 설정하는 것이 좋습니다. CLOUD SHELL 탭에 표시된 Cloud Shell은 macOS, Linux, Windows에서 사용할 수 있습니다. Cloud Shell을 이용하면 AI Platform Prediction을 빠르게 사용해 볼 수 있지만 진행 중인 개발 작업에는 적합하지 않습니다.

macOS

  1. Python 설치 확인
    Python이 설치되어 있는지 확인하고 필요하면 설치합니다.

    python -V
  2. pip 설치 확인
    pip는 현재 버전의 Python에 포함되어 있는 Python의 패키지 관리자입니다. pip --version을 실행하여 pip가 이미 설치되어 있는지 확인합니다. 설치되어 있지 않으면 pip 설치 방법을 참조하세요.

    다음 명령어를 사용하여 pip를 업그레이드할 수 있습니다.

    pip install -U pip

    자세한 내용은 pip 문서를 참조하세요.

  3. virtualenv 설치
    virtualenv는 격리된 Python 환경을 만드는 도구입니다. virtualenv --version을 실행하여 virtualenv가 이미 설치되어 있는지 확인합니다. 설치되어 있지 않으면 virtualenv를 설치합니다.

    pip install --user --upgrade virtualenv

    이 가이드용으로 격리된 개발 환경을 만들려면 virtualenv에서 새 가상 환경을 만듭니다. 예를 들어 다음 명령어는 aip-env라는 환경을 활성화합니다.

    virtualenv aip-env
    source aip-env/bin/activate
  4. 이 튜토리얼에서는 나머지 명령어를 가상 환경 내에서 실행합니다.

    virtualenv 사용에 대한 자세한 내용을 알아보세요. virtualenv를 종료하려면 deactivate를 실행합니다.

Cloud Shell

  1. Google Cloud 콘솔을 엽니다.

    Google Cloud 콘솔

  2. 콘솔 창의 상단에서 Google Cloud Shell 활성화 버튼을 클릭합니다.

    Google Cloud Shell 활성화

    콘솔 하단의 새로운 프레임에 Cloud Shell 세션이 열리고 명령줄 프롬프트가 표시됩니다. 셸 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

    Cloud Shell 세션

    Cloud Shell 세션을 사용할 수 있습니다.

  3. 선택한 프로젝트를 사용하려면 gcloud 명령줄 도구를 구성합니다.

    gcloud config set project [selected-project-id]

    [selected-project-id]는 프로젝트 ID입니다. (괄호 생략)

프레임워크 설치

macOS

가상 환경 내에서 다음 명령어를 실행하여 AI Platform Prediction 런타임 버전 2.11에 사용되는 scikit-learn 및 pandas의 버전을 설치합니다.

(aip-env)$ pip install scikit-learn==1.0.2 pandas==1.3.5

앞의 명령어에 버전 번호를 제공하면 가상 환경의 종속 항목과 런타임 버전의 종속 항목을 일치시킬 수 있습니다. 이렇게 하면 AI Platform Prediction에서 코드를 실행할 때 예기치 못한 동작을 방지하는 데 도움이 됩니다.

설치 옵션 및 문제 해결 정보에 대한 자세한 내용은 각 프레임워크의 설치 안내를 참조하세요.

Cloud Shell

다음 명령어를 실행하여 scikit-learn과 pandas를 설치합니다.

pip install --user scikit-learn pandas

설치 옵션 및 문제해결 정보에 대한 자세한 내용은 각 프레임워크의 설치 안내를 참조하세요.

데이터 다운로드

이 샘플의 학습에 사용되는 인구통계 소득 데이터 세트UC Irvine Machine Learning Repository에서 호스팅합니다. 자세한 내용은 데이터 정보를 참조하세요.

  • 학습 파일은 adult.data입니다.
  • 평가 파일은 adult.test입니다.

모델 학습 및 저장

모델을 학습시키고 저장하려면 다음 단계를 따르세요.

  1. 데이터를 Pandas DataFrame에 로드하여 scikit-learn에서 사용할 수 있도록 준비합니다.
  2. scikit-learn에서 간단한 모델을 학습시킵니다.
  3. AI Platform Prediction에 업로드할 수 있는 파일로 모델을 저장합니다.

업로드할 학습된 모델이 이미 있으면 모델을 내보내는 방법을 참조하세요.

데이터 로드 및 변환

scikit-learn 에스티메이터를 내보내는 방법과 유사하게 scikit-learn 또는 pickle에 포함된 joblib 버전을 사용하여 Pipeline 객체를 내보낼 수 있습니다. 다음 예시에서는 파이프라인을 사용하여 개별 카테고리형 특성을 숫자 값으로 변환하고 변환된 값을 결합한 후 RandomForestClassifier를 사용하여 모델을 학습시킵니다.

from sklearn.externals import joblib
import json
import numpy as np
import os
import pandas as pd
import pickle
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer

# Define the format of your input data, including unused columns.
# These are the columns from the census data files.
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)

# Categorical columns are columns that need to be turned into a numerical value to be used by scikit-learn
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)


# Load the training census dataset
with open('./census_data/adult.data', 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)

# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
train_features = raw_training_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').as_matrix().tolist()


# Load the test census dataset
with open('./census_data/adult.test', 'r') as test_data:
    raw_testing_data = pd.read_csv(test_data, names=COLUMNS, skiprows=1)
# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
test_features = raw_testing_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
test_labels = (raw_testing_data['income-level'] == ' >50K.').as_matrix().tolist()


# Since the census data set has categorical features, we need to convert
# them to numerical values. We'll use a list of pipelines to convert each
# categorical column and then use FeatureUnion to combine them before calling
# the RandomForestClassifier.
categorical_pipelines = []

# Each categorical column needs to be extracted individually and converted to a numerical value.
# To do this, each categorical column will use a pipeline that extracts one feature column via
# SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
# A scores array (created below) will select and extract the feature column. The scores array is
# created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
for i, col in enumerate(COLUMNS[:-1]):
    if col in CATEGORICAL_COLUMNS:
        # Create a scores array to get the individual categorical column.
        # Example:
        #  data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
        #         'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
        #  scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        #
        # Returns: [['Sate-gov']]
        scores = []
        # Build the scores array
        for j in range(len(COLUMNS[:-1])):
            if i == j: # This column is the categorical column we want to extract.
                scores.append(1) # Set to 1 to select this column
            else: # Every other column should be ignored.
                scores.append(0)
        skb = SelectKBest(k=1)
        skb.scores_ = scores
        # Convert the categorical column to a numerical value
        lbn = LabelBinarizer()
        r = skb.transform(train_features)
        lbn.fit(r)
        # Create the pipeline to extract the categorical feature
        categorical_pipelines.append(
            ('categorical-{}'.format(i), Pipeline([
                ('SKB-{}'.format(i), skb),
                ('LBN-{}'.format(i), lbn)])))

# Create pipeline to extract the numerical features
skb = SelectKBest(k=6)
# From COLUMNS use the features that are numerical
skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
categorical_pipelines.append(('numerical', skb))

# Combine all the features using FeatureUnion
preprocess = FeatureUnion(categorical_pipelines)

# Create the classifier
classifier = RandomForestClassifier()

# Transform the features and fit them to the classifier
classifier.fit(preprocess.transform(train_features), train_labels)

# Create the overall model as a single pipeline
pipeline = Pipeline([
    ('union', preprocess),
    ('classifier', classifier)
])

모델 내보내기

joblib 또는 Python pickle 라이브러리를 사용하여 모델을 내보냅니다.

joblib

from sklearn.externals import joblib

# Export the model to a file
joblib.dump(pipeline, 'model.joblib')

pickle

# Export the model to a file
with open('model.pkl', 'wb') as model_file:
  pickle.dump(pipeline, model_file)

모델 파일 이름 지정 요구사항

Cloud Storage에 업로드하는 저장된 모델 파일의 이름은 사용한 라이브러리에 따라 model.pkl 또는 model.joblib으로 지정해야 합니다. 이렇게 하면 AI Platform Prediction은 모델을 가져올 때 내보내기에 사용한 것과 동일한 패턴으로 모델을 재구성합니다.

모델 내보내기에 사용된 라이브러리 올바른 모델 이름
pickle model.pkl
sklearn.externals.joblib model.joblib

이후 모델을 반복할 때는 새로운 모델마다 전용 디렉터리를 갖도록 Cloud Storage 버킷을 구성하세요.

Cloud Storage에 모델 저장

이 가이드를 쉽게 따라하려면 AI Platform Prediction에 사용하는 것과 동일한 프로젝트에서 전용 Cloud Storage 버킷을 사용하는 것이 좋습니다.

다른 프로젝트에서 버킷을 사용 중인 경우 AI Platform Prediction 서비스 계정이 Cloud Storage에 있는 모델에 액세스할 수 있는지 확인해야 합니다. 적절한 권한이 없으면 AI Platform Prediction 모델 버전 생성 요청이 실패합니다. 스토리지 권한 부여에 대해 자세히 알아보세요.

Cloud Storage 버킷 설정

이 섹션에서는 새 버킷을 만드는 방법을 설명합니다. 기존 버킷을 사용할 수도 있지만 해당 버킷이 AI Platform 작업을 실행하려는 리전과 동일한 리전에 있어야 합니다. 또한 해당 버킷이 AI Platform Prediction을 실행하는 데 사용 중인 프로젝트에 속하지 않는 경우 명시적으로 AI Platform Prediction 서비스 계정에 액세스 권한을 부여해야 합니다.

  1. 새 버킷의 이름을 지정합니다. 이름은 Cloud Storage의 모든 버킷에서 중복되지 않아야 합니다.

    BUCKET_NAME="YOUR_BUCKET_NAME"

    예를 들어 프로젝트 이름에 -aiplatform을 추가하여 사용합니다.

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. 만든 버킷 이름을 확인합니다.

    echo $BUCKET_NAME
  3. 버킷 리전을 선택하고 REGION 환경 변수를 설정합니다.

    AI Platform Prediction 작업을 실행할 리전과 동일한 리전을 사용합니다. AI Platform Prediction 서비스에 사용 가능한 리전을 참조하세요.

    예를 들어 다음 코드는 REGION을 생성하고 us-central1로 설정합니다.

    REGION=us-central1
  4. 새 버킷을 만듭니다.

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

내보낸 모델 파일을 Cloud Storage로 업로드

다음 명령어를 실행하여 저장된 모델 파일을 Cloud Storage의 버킷에 업로드합니다.

gcloud storage cp ./model.joblib gs://your_bucket_name/model.joblib

예측을 위한 데이터 형식 지정

온라인 예측 요청을 전송하기 전에 AI Platform Prediction 예측 서비스에서 사용할 수 있도록 테스트 데이터의 형식을 지정해야 합니다. 입력 인스턴스의 형식은 모델에 필요한 형식과 일치해야 합니다.

gcloud

줄마다 각각의 입력 인스턴스가 있는 input.json 파일을 만듭니다. 다음 예시에서는 이전 단계에서 정의한 test_features 목록의 처음 10개 데이터 인스턴스를 사용합니다.

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"]
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"]
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"]
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"]
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"]
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"]
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"]
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"]
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"]
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]

입력 인스턴스의 형식은 모델에 필요한 형식과 일치해야 합니다. 이 예시에서 인구조사 모델에는 14개의 특성이 필요하므로 입력은 (num_instances, 14) 형태의 행렬이어야 합니다.

REST API

행마다 각각의 입력 인스턴스로 형식이 지정된 input.json 파일을 만듭니다. 다음 예시에서는 이전 단계에서 정의한 test_features 목록의 처음 10개 데이터 인스턴스를 사용합니다.

{
  "instances": [

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"],
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"],
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"],
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"],
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"],
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"],
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"],
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"],
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"],
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]
  ]
}

입력 인스턴스의 형식은 모델에 필요한 형식과 일치해야 합니다. 이 예시에서 인구조사 모델에는 14개의 특성이 필요하므로 입력은 (num_instances, 14) 형태의 행렬이어야 합니다.

자세한 내용은 온라인 예측 입력 형식 지정을 참조하세요.

로컬 예측을 사용하여 모델 테스트

AI Platform Prediction에 모델을 배포하기 전에 gcloud ai-platform local predict 명령어를 사용하여 모델이 예측을 수행하는 방식을 테스트할 수 있습니다. 이 명령어는 로컬 환경의 종속 항목을 사용하여 예측을 수행하고 gcloud ai-platform predict가 온라인 예측을 수행할 때 사용하는 것과 동일한 형식으로 결과를 반환합니다. 예측을 로컬에서 테스트하면 온라인 예측 요청에 대한 비용이 발생하기 전에 오류를 발견하는 데 도움이 됩니다.

--model-dir 인수에는 내보낸 머신러닝 모델을 포함하는 로컬 머신 또는 Cloud Storage의 디렉터리를 지정합니다. --framework 인수에는 tensorflow, scikit-learn 또는 xgboost를 지정합니다. 커스텀 예측 루틴에는 gcloud ai-platform local predict 명령어를 사용할 수 없습니다.

다음은 로컬 예측을 수행하는 방법을 보여주는 예시입니다.

gcloud ai-platform local predict --model-dir LOCAL_OR_CLOUD_STORAGE_PATH_TO_MODEL_DIRECTORY/ \
  --json-instances LOCAL_PATH_TO_PREDICTION_INPUT.JSON \
  --framework NAME_OF_FRAMEWORK

모델 및 버전 배포

AI Platform Prediction은 모델버전 리소스를 사용하여 학습된 모델을 구성합니다. AI Platform Prediction 모델은 머신러닝 모델 버전의 컨테이너입니다.

모델을 배포하려면 AI Platform Prediction에서 모델 리소스를 만들고 해당 모델의 한 버전을 만든 다음 모델 버전을 Cloud Storage에 저장된 모델 파일에 연결합니다.

모델 리소스 만들기

AI Platform Prediction은 모델 리소스를 사용하여 모델의 여러 버전을 구성합니다.

이때 이 모델에 속하는 모델 버전에 리전 엔드포인트와 전역 엔드포인트 중 무엇을 사용할지 결정해야 합니다. 대부분의 경우 리전 엔드포인트를 선택합니다. 기존(MLS1) 머신 유형에서만 사용할 수 있는 기능이 필요한 경우 전역 엔드포인트를 사용합니다.

또한 이 모델에 속한 모델 버전이 예측을 제공할 때 로그를 내보내도록 할지를 결정해야 합니다. 다음 예시에서는 로깅을 사용 설정하지 않습니다. 로깅을 사용 설정하는 방법을 알아보세요.

콘솔

  1. Google Cloud 콘솔에서 AI Platform Prediction 모델 페이지를 엽니다.

    모델 페이지로 이동

  2. 모델 페이지 상단에 있는 새 모델 버튼을 클릭합니다. 그러면 모델 만들기 페이지로 이동합니다.

  3. 모델 이름 필드에 모델의 고유한 이름을 입력합니다.

  4. 리전 엔드포인트 사용 체크박스가 선택되어 있으면 AI Platform Prediction에서 리전 엔드포인트를 사용합니다. 전역 엔드포인트를 사용하려면 리전 엔드포인트 사용 체크박스를 선택 해제합니다.

  5. 리전 드롭다운 목록에서 예측 노드의 위치를 선택합니다. 사용 가능한 리전은 리전 엔드포인트 또는 전역 엔드포인트 중 어느 것을 사용하는지에 따라 다릅니다.

  6. 만들기를 클릭합니다.

  7. 모델 페이지로 돌아와 목록에 새 모델이 표시되는지 확인합니다.

gcloud

리전 엔드포인트

다음 명령어를 실행합니다.

gcloud ai-platform models create MODEL_NAME \
  --region=REGION

다음을 바꿉니다.

--region 플래그를 지정하지 않으면 gcloud CLI에서 리전 엔드포인트를 선택하거나 전역 엔드포인트에서 us-central을 사용하라는 메시지를 표시합니다.

또는 --region 플래그를 지정하지 않은 경우에도 gcloud CLI가 AI Platform Prediction에 대해 항상 해당하는 리전 엔드포인트를 사용하도록 ai_platform/region 속성을 특정 리전으로 설정할 수 있습니다. (이 구성은 gcloud ai-platform operations 명령어 그룹의 명령어에는 적용되지 않습니다.)

전역 엔드포인트

다음 명령어를 실행합니다.

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

다음을 바꿉니다.

--regions 플래그를 지정하지 않으면 gcloud CLI에서 리전 엔드포인트를 선택하거나 전역 엔드포인트에서 us-central1을 사용하라는 메시지를 표시합니다.

REST API

리전 엔드포인트

  1. 요청 본문에 모델 객체를 배치하여 요청의 형식을 지정합니다. 최소한 다음 샘플에서 MODEL_NAME을 바꿔 모델 이름을 지정합니다.

    {
      "name": "MODEL_NAME"
    }
    
  2. PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿔 다음 URL에서 REST API를 호출합니다.

    POST https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/
    

    다음을 바꿉니다.

    예를 들어 curl 명령어를 사용하여 다음 요청을 수행할 수 있습니다. 이 명령어는 Google Cloud CLI 설치와 연결된 사용자 인증 정보를 사용하여 요청을 승인합니다.

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "MODEL_NAME"}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models"
    

    API는 다음과 비슷한 응답을 반환합니다.

    {
      "name": "projects/PROJECT_ID/models/MODEL_NAME",
      "regions": [
        "REGION"
      ]
    }
    

전역 엔드포인트

  1. 요청 본문에 모델 객체를 배치하여 요청의 형식을 지정합니다. 최소한 다음 샘플에서 MODEL_NAME을 바꿔 모델 이름을 지정하고 REGION기존(MLS1) 머신 유형을 지원하는 리전으로 바꿔 리전을 지정합니다.

    {
      "name": "MODEL_NAME",
      "regions": ["REGION"]
    }
    
  2. PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿔 다음 URL에서 REST API를 호출합니다.

    POST https://ml.googleapis.com/v1/projects/PROJECT_ID/models/
    

    예를 들어 curl 명령어를 사용하여 다음 요청을 수행할 수 있습니다. 이 명령어는 Google Cloud CLI 설치와 연결된 사용자 인증 정보를 사용하여 요청을 승인합니다.

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "MODEL_NAME", "regions": ["REGION"]}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://ml.googleapis.com/v1/projects/PROJECT_ID/models"
    

    API는 다음과 비슷한 응답을 반환합니다.

    {
      "name": "projects/PROJECT_ID/models/MODEL_NAME",
      "regions": [
        "REGION"
      ]
    }
    

자세한 내용은 AI Platform Prediction 모델 API를 참조하세요.

모델 버전 만들기

이제 이전에 Cloud Storage에 업로드한 학습된 모델로 모델 버전을 만들 준비가 되었습니다. 버전을 만들 때 매개변수의 수를 지정할 수 있습니다. 다음 목록에서는 일반적인 매개변수에 대해 설명합니다. 이중 일부만 필요합니다.

  • name: AI Platform Prediction 모델 내에서 고유해야 합니다.
  • deploymentUri: Cloud Storage에서 모델 디렉터리의 경로입니다.

    • TensorFlow 모델을 배포하는 경우 이는 저장된 모델 디렉터리입니다.
    • scikit-learn 또는 XGBoost 모델을 배포하는 경우 이는 model.joblib, model.pkl 또는 model.bst 파일이 포함된 디렉터리입니다.
    • 커스텀 예측 루틴을 배포하는 경우 이는 모든 모델 아티팩트가 포함된 모델 디렉터리입니다. 이 디렉터리의 전체 크기는 500MB 이하여야 합니다.
  • framework: TENSORFLOW, SCIKIT_LEARN 또는 XGBOOST

  • runtimeVersion: 모델에 필요한 종속 항목에 기반을 둔 런타임 버전입니다. scikit-learn 모델 또는 XGBoost 모델을 배포하는 경우 이는 1.4 이상이어야 합니다. 일괄 예측에 모델 버전을 사용하려면 런타임 버전 2.1 이하를 사용해야 합니다.

  • pythonVersion: Python 3을 사용하여 내보낸 모델 파일과 호환되도록 '3.5'(런타임 버전 1.4~1.14의 경우) 또는 '3.7'(런타임 버전 1.15 이상의 경우)로 설정해야 합니다. 또한 런타임 버전 1.15 이하에서 사용하는 경우 '2.7'로 설정할 수도 있습니다.

  • machineType(선택사항): AI Platform 예측이 예측을 제공하는 노드에 사용하는 가상 머신의 유형입니다. 머신 유형에 대해 자세히 알아보세요. 설정하지 않으면 리전 엔드포인트의 기본값은 n1-standard-2이고 전역 엔드포인트의 기본값은 mls1-c1-m2입니다.

덜 일반적인 매개변수와 함께 각 매개변수에 대한 자세한 내용은 버전 리소스의 API 참조에서 확인하세요.

또한 리전 엔드포인트에서 모델을 만든 경우 같은 리전 엔드포인트에서 버전을 만들어야 합니다.

콘솔

  1. Google Cloud 콘솔에서 AI Platform Prediction 모델 페이지를 엽니다.

    모델 페이지로 이동

  2. 모델 페이지에서 버전을 만드는 데 사용할 모델 리소스 이름을 선택합니다. 그러면 모델 세부정보 페이지로 이동합니다.

  3. 모델 세부정보 페이지 상단의 새 버전 버튼을 클릭합니다. 그러면 버전 만들기 페이지로 이동합니다.

  4. 이름 필드에 버전 이름을 입력합니다. 필요에 따라 설명 필드에 버전에 대한 설명을 입력합니다.

  5. 드롭다운 상자에 모델을 학습시킨 방법에 대한 다음 정보를 입력합니다.

    • 모델 학습에 사용된 Python 버전을 선택합니다.
    • 프레임워크프레임워크 버전을 선택합니다.
    • ML 런타임 버전을 선택합니다. AI Platform Prediction 런타임 버전에 대해 자세히 알아보세요.
  6. 온라인 예측을 실행할 머신 유형을 선택합니다.

  7. 모델 URI 필드에 모델 파일을 업로드한 Cloud Storage 버킷 위치를 입력합니다. 찾아보기 버튼을 사용하여 올바른 경로를 찾을 수도 있습니다.

    모델 파일 자체의 경로가 아니라 파일이 들어 있는 디렉터리의 경로를 지정해야 합니다. 예를 들어 gs://your_bucket_name/model-dir/saved_model.pb 또는 gs://your_bucket_name/model-dir/model.pkl 대신 gs://your_bucket_name/model-dir/을 사용합니다.

  8. 온라인 예측 배포의 확장 옵션을 선택합니다.

    • '자동 확장'을 선택하면 선택사항인 최소 노드 수 필드가 표시됩니다. 서비스가 축소되었을 때도 항상 실행되도록 할 최소 노드 수를 입력하면 됩니다.

    • '수동 확장'을 선택한 경우 항상 실행 상태로 유지할 노드 수를 입력해야 합니다.

    확장 옵션이 머신 유형에 따라 어떻게 다른지 알아보세요.

    예측 비용 가격에 대해 자세히 알아보세요.

  9. 모델 버전 만들기를 완료하려면 저장을 클릭합니다.

gcloud

  1. 환경 변수를 설정하여 모델 바이너리가 있는 Cloud Storage 디렉터리 경로, 모델 이름, 버전 이름, 선택한 프레임워크를 저장합니다.

    gcloud CLI를 사용하여 버전을 만드는 경우 밑줄과 대문자로 이루어진 프레임워크 이름(예: SCIKIT_LEARN) 또는 하이픈과 소문자로 이루어진 프레임워크 이름(예: scikit-learn)을 지정할 수 있습니다. 두 옵션 모두 동일한 동작으로 이어집니다.

    [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    MODEL_DIR="gs://your_bucket_name/"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    MODEL_NAME="[YOUR-MODEL-NAME]"
    FRAMEWORK="[YOUR-FRAMEWORK_NAME]"
    

  2. 버전을 만듭니다.

    gcloud ai-platform versions create $VERSION_NAME \
      --model=$MODEL_NAME \
      --origin=$MODEL_DIR \
      --runtime-version=2.11 \
      --framework=$FRAMEWORK \
      --python-version=3.7 \
      --region=REGION \
      --machine-type=MACHINE_TYPE
    

    다음을 바꿉니다.

    • REGION: 모델을 만든 리전 엔드포인트의 리전입니다. 전역 엔드포인트에서 모델을 만든 경우 --region 플래그를 생략합니다.

    • MACHINE_TYPE: 예측 노드에서 사용할 수 있는 컴퓨팅 리소스를 결정하는 머신 유형입니다.

    버전을 만드는 데 몇 분 정도 걸립니다. 준비되면 다음 출력이 표시됩니다.

    Creating version (this might take a few minutes)......done.
  3. 새 버전에 대한 정보를 가져옵니다.

    gcloud ai-platform versions describe $VERSION_NAME \
      --model=$MODEL_NAME
    

    다음과 비슷한 출력이 표시됩니다.

    createTime: '2018-02-28T16:30:45Z'
    deploymentUri: gs://your_bucket_name
    framework: [YOUR-FRAMEWORK-NAME]
    machineType: mls1-c1-m2
    name: projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]
    pythonVersion: '3.7'
    runtimeVersion: '2.11'
    state: READY

REST API

  1. 버전 객체를 포함하도록 요청 본문 형식을 지정합니다. 이 예시에서는 버전 name, deploymentUri, runtimeVersion, framework, machineType을 지정합니다. [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    {
      "name": "[YOUR-VERSION-NAME]",
      "deploymentUri": "gs://your_bucket_name/",
      "runtimeVersion": "2.11",
      "framework": "[YOUR_FRAMEWORK_NAME]",
      "pythonVersion": "3.7",
      "machineType": "[YOUR_MACHINE_TYPE]"
    }
    
  2. 다음 경로에서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꾸고 REST API를 호출합니다.

    POST https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions
    

    REGION모델을 만든 리전 엔드포인트의 리전으로 바꿉니다. 전역 엔드포인트에서 모델을 만든 경우 ml.googleapis.com을 사용합니다.

    예를 들어 curl 명령어를 사용하여 다음 요청을 수행할 수 있습니다.

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name/", "runtimeVersion": "2.11", "framework": "[YOUR_FRAMEWORK_NAME]", "pythonVersion": "3.7", "machineType": "[YOUR_MACHINE_TYPE]"}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://REGION-ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions"
    

    버전을 만드는 데 몇 분 정도 걸립니다. 준비가 되면 다음과 비슷한 출력이 표시됩니다.

    {
      "name": "projects/[YOUR-PROJECT-ID]/operations/create_[YOUR-MODEL-NAME]_[YOUR-VERSION-NAME]-[TIMESTAMP]",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.ml.v1.OperationMetadata",
        "createTime": "2018-07-07T02:51:50Z",
        "operationType": "CREATE_VERSION",
        "modelName": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]",
        "version": {
          "name": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]",
          "deploymentUri": "gs://your_bucket_name",
          "createTime": "2018-07-07T02:51:49Z",
          "runtimeVersion": "2.11",
          "framework": "[YOUR_FRAMEWORK_NAME]",
          "machineType": "[YOUR_MACHINE_TYPE]",
          "pythonVersion": "3.7"
        }
      }
    }
    

온라인 예측 요청 전송

버전이 성공적으로 생성되면 AI Platform Prediction에서는 예측 요청을 제공할 수 있는 새 서버를 시작합니다.

이 섹션에서는 다음을 설명합니다.

  1. 더 작은 데이터세트로 요청을 전송하여 gcloud로 모델을 테스트하는 방법
  2. Python 클라이언트 라이브러리를 사용하여 전체 테스트 데이터세트에 대규모 요청을 전송하고 처음 10개의 결과를 보는 방법

gcloud

이 섹션에서는 이전 단계에서 만든 input.json 파일을 사용하여 예측 요청을 전송하는 방법에 대해 설명합니다.

  1. 모델 이름, 버전 이름, 입력 파일 이름에 대한 환경 변수를 설정합니다. [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    MODEL_NAME="[YOUR-MODEL-NAME]"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    INPUT_FILE="input.json"
    
  2. 예측 요청을 전송합니다.

    gcloud ai-platform predict --model $MODEL_NAME --version \
      $VERSION_NAME --json-instances $INPUT_FILE
    

    예측 결과는 개인의 소득이 연간 $50,000보다 클 것으로 예상되면 True, 그렇지 않으면 False를 반환합니다. 예를 들어 처음 10개의 결과는 다음과 비슷하게 표시됩니다.

    [False, False, False, True, False, False, False, False, False, False]
    

REST API

이 섹션에서는 이전 단계에서 만든 input.json 파일을 사용하여 예측 요청을 전송하는 방법에 대해 설명합니다.

예측 요청을 전송합니다.

curl -X POST -H "Content-Type: application/json" -d @input.json \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
"https://ml.googleapis.com/v1/projects/${PROJECT_ID}/models/${MODEL_NAME}/versions/${VERSION_NAME}:predict"

예측 결과는 개인의 소득이 연간 $50,000보다 클 것으로 예상되면 True, 그렇지 않으면 False를 반환합니다. 예측 결과는 Console에 부울 값 목록으로 표시됩니다. 예를 들어 처음 10개의 결과는 다음과 유사하게 표시됩니다.

{"predictions": [false, false, false, true, false, false, false, false, false, false]}

Python

이 샘플에서는 Python 클라이언트 라이브러리를 사용하여 전체 인구통계 데이터세트에 대한 예측 요청을 전송하고 처음 10개의 결과를 출력합니다. Python 클라이언트 라이브러리 사용 방법에 대해 자세히 알아보세요.

[VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

import googleapiclient.discovery

# Fill in your PROJECT_ID, VERSION_NAME and MODEL_NAME before running
# this code.

PROJECT_ID = [YOUR PROJECT_ID HERE]
VERSION_NAME = [YOUR VERSION_NAME HERE]
MODEL_NAME = [YOUR MODEL_NAME HERE]

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

# Due to the size of the data, it needs to be split in 2
first_half = test_features[:int(len(test_features)/2)]
second_half = test_features[int(len(test_features)/2):]

complete_results = []
for data in [first_half, second_half]:
    responses = service.projects().predict(
        name=name,
        body={'instances': data}
    ).execute()

    if 'error' in responses:
        print(response['error'])
    else:
        complete_results.extend(responses['predictions'])

# Print the first 10 responses
for i, response in enumerate(complete_results[:10]):
    print('Prediction: {}\tLabel: {}'.format(response, test_labels[i]))

예측 결과는 개인의 소득이 연간 $50,000보다 클 것으로 예상되면 True, 그렇지 않으면 False를 반환합니다. 예를 들어 처음 10개의 결과는 다음과 비슷하게 표시됩니다.

Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False

AI Platform Prediction API 예측 요청 세부정보에서 각 입력 매개변수에 대한 자세한 내용을 알아보세요.

데이터 정보

이 샘플의 학습에 사용되는 인구통계 소득 데이터 세트UC Irvine Machine Learning Repository에서 호스팅합니다.

인구조사 데이터 제공: Lichman, M. (2013). UCI Machine Learning Repository http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science. 이 데이터 세트는 데이터 세트 출처(http://archive.ics.uci.edu/ml)에서 제공하는 약관을 따르는 모든 사용자에게 공개되며 Google의 어떠한 명시적 또는 묵시적인 보증 없이 '있는 그대로' 제공됩니다. Google은 데이터세트 사용으로 인한 직간접적인 손해를 책임지지 않습니다.

다음 단계