AI Platform Training에서 scikit-learn을 사용한 학습

AI Platform Training 서비스는 모델 학습을 위해 클라우드의 컴퓨팅 리소스를 관리합니다. 이 페이지에서는 AI Platform Training을 사용한 scikit-learn 모델 학습 프로세스에 대해 설명합니다.

이 가이드에서는 인구통계 소득 데이터 세트를 기반으로 개인의 소득 수준을 예측하도록 간단한 모델을 학습시킵니다. 학습 애플리케이션을 로컬에서 만들어서 Cloud Storage로 업로드하고 학습 작업을 제출합니다. AI Platform Training 서비스는 Cloud Storage 버킷에 출력을 기록하고 Logging에 로그를 생성합니다.

이 콘텐츠는 GitHub에서 Jupyter 메모장으로도 제공됩니다.

AI Platform Training에서 모델을 학습시키는 방법

AI Platform Training에서 모델 학습은 다음 세 단계로 수행됩니다.

  • Python 모델 파일 만들기
    • AI Platform Training이 사용할 수 있도록 Cloud Storage에서 데이터를 다운로드하는 코드 추가
    • AI Platform Training에서 모델 학습이 완료된 후 모델을 내보내고 Cloud Storage에 저장하는 코드 추가
  • 학습 애플리케이션 패키지 준비
  • 학습 작업 제출

시작하기 전에

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

GCP 프로젝트 설정

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. AI Platform Training & Prediction and Compute Engine API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화

환경 설정

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

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

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 Console을 엽니다.

    Google Cloud Console

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

    Google Cloud Shell 활성화

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

    Cloud Shell 세션

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

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

    gcloud config set project [selected-project-id]

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

프레임워크 설치

macOS

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

(aip-env)$ pip install scikit-learn==0.24.0 pandas==1.1.5

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

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

Cloud Shell

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

pip install --user scikit-learn pandas

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

Cloud Storage 버킷 설정

학습 코드 및 종속 항목을 저장하려면 Cloud Storage 버킷이 필요합니다. 이 가이드를 쉽게 따라하려면 AI Platform Training에 사용하는 것과 동일한 프로젝트에서 전용 Cloud Storage 버킷을 사용하는 것이 좋습니다.

다른 프로젝트에서 버킷을 사용 중인 경우 AI Platform Training 서비스 계정이 Cloud Storage에 있는 학습 코드 및 종속 항목에 액세스할 수 있는지 확인해야 합니다. 적절한 권한이 없으면 학습 작업이 실패합니다. 스토리지에 대한 권한을 부여하는 방법을 참조하세요.

학습 작업 실행하는 데 사용 중인 리전의 버킷을 사용하거나 설정해야 합니다. AI Platform Training 서비스에 사용 가능한 리전을 참조하세요.

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

  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 Training 작업을 실행할 리전과 동일한 리전을 사용합니다. AI Platform Training 서비스에 사용 가능한 리전을 참조하세요.

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

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

    gsutil mb -l $REGION gs://$BUCKET_NAME

데이터 정보

이 샘플에서 학습에 사용하는 인구조사 소득 데이터 세트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은 데이터세트 사용으로 인한 직간접적인 손해를 책임지지 않습니다.

편의를 위해 공개 Cloud Storage 버킷 gs://cloud-samples-data/ai-platform/sklearn/census_data/에 이 데이터를 호스팅했으며 Python 학습 파일 내에서 다운로드할 수 있습니다.

Python 모델 파일 만들기

이 섹션의 모든 학습 코드는 GitHub(train.py)에서 찾을 수 있습니다.

이 섹션의 나머지 부분에는 학습 코드의 역할에 대한 설명이 나와 있습니다.

설정

Python, Cloud SDK, scikit-learn에서 다음 라이브러리를 가져옵니다. Cloud Storage 버킷 이름의 변수를 설정합니다.

import datetime
import pandas as pd

from google.cloud import storage

from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer

# TODO: REPLACE 'YOUR_BUCKET_NAME' with your GCS Bucket name.
BUCKET_NAME = 'YOUR_BUCKET_NAME'

Cloud Storage에서 데이터 다운로드

일반적인 개발 프로세스에서는 데이터를 AI Platform Training이 액세스할 수 있도록 Cloud Storage에 업로드합니다. 이 가이드의 데이터는 공개 버킷 gs://cloud-samples-data/ai-platform/sklearn/census_data/에서 호스팅됩니다.

아래 코드는 학습 데이터세트 adult.data를 다운로드합니다. 평가 데이터는 adult.test에서 제공되지만 이 가이드에서 사용되지 않습니다.

# Public bucket holding the census data
bucket = storage.Client().bucket('cloud-samples-data')

# Path to the data inside the public bucket
blob = bucket.blob('ai-platform/sklearn/census_data/adult.data')
# Download the data
blob.download_to_filename('adult.data')

모델 코드 추가

모델 학습 코드는 다음과 같은 몇 가지 기본 단계를 수행합니다.

  • 데이터 정의 및 로드
  • 카테고리형 특성을 숫자 특성으로 변환
  • scikit-learn 파이프라인을 사용하여 숫자 특성 추출
  • 모델을 내보내고 Cloud Storage에 저장

데이터 정의 및 로드

# 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('./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).values.tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').values.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: [['State-gov']]
        # Build the scores array.
        scores = [0] * len(COLUMNS[:-1])
        # This column is the categorical column we want to extract.
        scores[i] = 1
        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)])))

scikit-learn 파이프라인을 사용하여 숫자 특성 추출

# 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)
])

모델을 내보내고 Cloud Storage에 저장

AI Platform Training에 사용 중인 프로젝트에 Cloud Storage 버킷이 있는 경우 AI Platform Training이 버킷에서 데이터를 읽고 쓸 수 있습니다. 그렇지 않은 경우 AI Platform Training을 실행하는 데 사용 중인 프로젝트가 Cloud Storage 버킷에 액세스할 수 있는지 확인해야 합니다. 스토리지에 대한 권한을 부여하는 방법을 참조하세요.

AI Platform Prediction에서 온라인 예측 요청에 사용하려는 모델 파일의 이름을 model.pkl 또는 model.joblib로 지정해야 합니다.

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

# Upload the model to GCS
bucket = storage.Client().bucket(BUCKET_NAME)
blob = bucket.blob('{}/{}'.format(
    datetime.datetime.now().strftime('census_%Y%m%d_%H%M%S'),
    model))
blob.upload_from_filename(model)

Cloud Storage에 모델 파일 업로드 확인(선택사항)

명령줄에서 대상 모델 폴더의 콘텐츠를 보고 모델 파일이 Cloud Storage에 업로드되었는지 확인합니다. 버킷 이름에 대한 환경 변수(BUCKET_ID)를 설정하지 않은 경우 설정합니다.

gsutil ls gs://$BUCKET_ID/census_*

출력은 다음과 비슷하게 표시됩니다.

gs://[YOUR-PROJECT-ID]/census_[DATE]_[TIME]/model.joblib

학습 애플리케이션 패키지 만들기

학습 애플리케이션 패키지를 만드는 가장 쉽고 권장되는 방법은 학습 작업을 제출할 때 gcloud를 사용하여 애플리케이션을 패키징하고 업로드하는 것입니다. 이 방법을 사용하면 파일 두 개만 사용하여 매우 간단한 파일 구조를 만들 수 있습니다. 이 가이드에서는 학습 애플리케이션 패키지의 파일 구조가 다음과 비슷하게 표시됩니다.

census_training/
    __init__.py
    train.py
  1. 디렉터리를 로컬에서 만듭니다.

    mkdir census_training
    
  2. __init__.py라는 빈 파일을 만듭니다.

    touch census_training/__init__.py
    
  3. 학습 코드를 Python 파일 하나에 저장하고 해당 파일을 census_training 디렉터리 내에 저장합니다. train.py의 예시 코드를 참조하세요. cURL을 사용하여 파일을 다운로드하고 저장할 수 있습니다.

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/sklearn/notebooks/census_training/train.py > census_training/train.py
    

학습 애플리케이션 패키징에 대해 자세히 알아보세요.

학습 작업 제출

이 섹션에서는 gcloud ai-platform jobs submit training을 사용하여 학습 작업을 제출합니다.

학습 작업 매개변수 지정

학습 작업 요청의 각 매개변수에 다음과 같은 환경 변수를 설정합니다.

  • PROJECT_ID - Google Cloud 프로젝트와 일치하는 PROJECT_ID를 사용합니다.
  • BUCKET_ID - Cloud Storage 버킷 이름입니다.
  • JOB_NAME - 작업에 사용할 이름입니다(대소문자가 혼합된 문자, 숫자, 밑줄만 사용, 문자로 시작). 이 경우는 census_training_$(date +"%Y%m%d_%H%M%S")입니다.
  • JOB_DIR - 학습 작업의 출력 파일에 사용할 Cloud Storage 위치의 경로입니다. 예를 들면 gs://$BUCKET_ID/scikit_learn_job_dir입니다.
  • TRAINING_PACKAGE_PATH - 학습 애플리케이션의 루트 디렉터리에 대한 로컬 경로입니다. 이 경우는 ./census_training/입니다.
  • MAIN_TRAINER_MODULE - AI Platform Training 서비스가 실행할 파일을 지정합니다. 형식은 [YOUR_FOLDER_NAME.YOUR_PYTHON_FILE_NAME]입니다. 이 경우는 census_training.train입니다.
  • REGION - 학습 작업을 실행하는 데 사용할 리전의 이름입니다. AI Platform Training 서비스에 사용 가능한 리전 중 하나를 사용합니다. Cloud Storage 버킷이 동일한 리전에 있는지 확인합니다.
  • RUNTIME_VERSION - scikit-learn을 지원하는 AI Platform Training 런타임 버전을 지정해야 합니다. 이 예시에서는 2.4입니다.
  • PYTHON_VERSION - 작업에 사용할 Python 버전입니다. 이 가이드에서는 Python 3.7을 지정합니다.
  • SCALE_TIER - 학습 작업을 실행할 머신의 사전 정의된 클러스터 사양입니다. 이 경우는 BASIC입니다. 커스텀 확장 등급을 사용하여 고유한 학습용 클러스터 구성을 정의할 수도 있습니다.

편의를 위해 아래에 이 가이드의 환경 변수가 있습니다. [VALUES-IN-BRACKETS]를 적절한 값으로 바꿉니다.

PROJECT_ID=[YOUR-PROJECT-ID]
BUCKET_ID=[YOUR-BUCKET-ID]
JOB_NAME=census_training_$(date +"%Y%m%d_%H%M%S")
JOB_DIR=gs://$BUCKET_ID/scikit_learn_job_dir
TRAINING_PACKAGE_PATH="[YOUR-LOCAL-PATH-TO-TRAINING-PACKAGE]/census_training/"
MAIN_TRAINER_MODULE=census_training.train
REGION=us-central1
RUNTIME_VERSION=2.4
PYTHON_VERSION=3.7
SCALE_TIER=BASIC

요청을 제출합니다.

gcloud ai-platform jobs submit training $JOB_NAME \
  --job-dir $JOB_DIR \
  --package-path $TRAINING_PACKAGE_PATH \
  --module-name $MAIN_TRAINER_MODULE \
  --region $REGION \
  --runtime-version=$RUNTIME_VERSION \
  --python-version=$PYTHON_VERSION \
  --scale-tier $SCALE_TIER

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

Job [census_training_[DATE]_[TIME]] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ai-platform jobs describe census_training_[DATE]_[TIME]

or continue streaming the logs with the command

  $ gcloud ai-platform jobs stream-logs census_training_[DATE]_[TIME]
jobId: census_training_[DATE]_[TIME]
state: QUEUED

학습 로그 보기(선택사항)

AI Platform Training은 모든 stdoutstderr 스트림과 로깅 구문을 캡처합니다. 이러한 로그는 Logging에 저장되며 실행 중 및 실행 후에 볼 수 있습니다.

학습 작업에 대한 로그를 보려면 다음 단계를 따르세요.

Console

  1. AI Platform Training 작업 페이지를 엽니다.

    Cloud Console에서 작업 열기

  2. 검사할 학습 작업 이름을 선택합니다. 이렇게 하면 선택한 학습 작업의 작업 세부정보 페이지로 이동합니다.

  3. 작업 세부정보에서 로그 보기 링크를 선택합니다. 이렇게 하면 선택한 학습 작업의 로그를 검색 및 필터링할 수 있는 로깅 Logging 페이지로 이동합니다.

gcloud

gcloud ai-platform jobs stream-logs를 사용하여 터미널에서 로그를 확인할 수 있습니다.

gcloud ai-platform jobs stream-logs $JOB_NAME

다음 단계