Vertex Pipelines에서 커스텀 모델 학습 실행

1. 개요

이 실습에서는 Vertex Pipelines에서 Kubeflow Pipelines SDK를 사용하여 커스텀 모델 학습 작업을 실행하는 방법을 배웁니다.

학습 내용

다음 작업을 수행하는 방법을 배우게 됩니다.

  • Kubeflow Pipelines SDK를 사용하여 확장 가능한 ML 파이프라인 빌드
  • Vertex AI 관리형 데이터 세트를 사용하고 파이프라인 내의 Vertex AI Training에서 실행되는 커스텀 scikit-learn 모델 학습 작업 생성 및 컨테이너화
  • Vertex Pipelines에서 일괄 예측 작업 실행
  • google_cloud_pipeline_components 라이브러리를 통해 제공되는 Vertex AI 서비스와 상호작용하기 위해 사전 빌드된 구성요소를 사용합니다.

Google Cloud에서 이 실습을 진행하는 데 드는 총 비용은 약 $5입니다.

2. Vertex AI 소개

이 실습에서는 Google Cloud의 엔드 투 엔드 관리형 ML 플랫폼인 Vertex AI를 사용합니다. Vertex AI는 Google Cloud 전반에서 Google의 ML 제품을 원활한 개발 환경에 통합합니다. 모델 학습 및 배포 서비스 외에도 Vertex AI에는 Vertex AI Pipelines(이 실습의 핵심), Model Monitoring, Feature Store를 비롯한 다양한 MLOps 제품이 포함되어 있습니다. 아래 다이어그램에서 Vertex AI 제품을 모두 확인할 수 있습니다.

Vertex 제품 개요

의견이 있는 경우 지원 페이지를 참조하세요.

ML 파이프라인이 유용한 이유

자세히 알아보기 전에 먼저 파이프라인을 사용하려는 이유를 생각해 보겠습니다. 데이터 처리, 모델 학습, 초매개변수 조정, 평가, 모델 배포가 포함된 ML 워크플로를 빌드한다고 상상해 보세요. 각 단계에는 다양한 종속 항목이 있을 수 있어 전체 워크플로를 모놀리식으로 처리하면 관리가 힘들 수 있습니다. ML 프로세스를 확장하기 시작할 때 팀원이 워크플로를 실행하고 코드 개발에 참여하도록 팀원과 ML 워크플로를 공유하려는 경우를 생각해 보겠습니다. 신뢰할 수 있고 재현 가능한 프로세스가 없으면 이 작업이 어려워질 수 있습니다. 파이프라인을 사용하면 ML 프로세스의 각 단계는 자체 컨테이너가 됩니다. 이를 통해 단계를 독립적으로 개발하고 재현 가능한 방식으로 각 단계의 입력 및 출력을 추적할 수 있습니다. 새로운 학습 데이터가 제공될 때 파이프라인 실행을 시작하는 것과 같이 Cloud 환경의 다른 이벤트를 기반으로 파이프라인 실행을 예약하거나 트리거할 수도 있습니다.

요약: 파이프라인은 ML 워크플로를 능률화하고 재현하는 데 도움이 됩니다.

3. 클라우드 환경 설정

이 Codelab을 실행하려면 결제가 사용 설정된 Google Cloud Platform 프로젝트가 필요합니다. 프로젝트를 만들려면 여기의 안내를 따르세요.

1단계: Cloud Shell 시작

이 실습에서는 Google 클라우드에서 실행되는 가상 머신이 호스팅하는 명령어 인터프리터인 Cloud Shell 세션에서 작업합니다. 이 섹션은 사용자의 컴퓨터에서 로컬로 쉽게 실행할 수도 있지만, Cloud Shell을 사용하면 모든 사람이 일관되고 재현 가능한 환경에 액세스할 수 있습니다. 실습을 마치고 로컬 컴퓨터에서 이 섹션을 다시 시도하셔도 됩니다.

Cloud Shell 승인

Cloud Shell 활성화

Cloud 콘솔의 오른쪽 상단에서 아래 버튼을 클릭하여 Cloud Shell을 활성화합니다.

Cloud Shell 활성화

이전에 Cloud Shell을 시작한 적이 없는 경우 기능을 설명하는 중간 화면 (스크롤해야 볼 수 있는 부분)이 표시됩니다. 이 경우 계속을 클릭하세요 (다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.

Cloud Shell 설정

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

Cloud Shell 초기화

가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.

gcloud auth list

명령어 결과에 다음과 같이 표시됩니다.

Cloud Shell 출력

Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.

gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

Cloud Shell에는 현재 Cloud 프로젝트의 이름이 포함된 GOOGLE_CLOUD_PROJECT를 비롯한 몇 가지 환경 변수가 있습니다. 이 실습의 다양한 위치에서 이를 사용할 것입니다. 다음을 실행하여 환경 변수를 확인할 수 있습니다.

echo $GOOGLE_CLOUD_PROJECT

2단계: API 사용 설정

이후 단계에서는 이러한 서비스가 필요한 위치와 이유를 설명하겠지만, 지금은 이 명령어를 실행하여 프로젝트에 Compute Engine, Container Registry, Vertex AI 서비스에 대한 액세스 권한을 부여해 보겠습니다.

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

그러면 다음과 비슷한 성공 메시지가 표시될 것입니다.

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3단계: Cloud Storage 버킷 만들기

Vertex AI에서 학습 작업을 실행하려면 저장된 모델 애셋을 저장할 스토리지 버킷이 필요합니다. 버킷은 리전을 기반으로 해야 합니다. 여기서는 us-central를 사용하고 있지만 다른 리전을 사용해도 됩니다. 단, 실습 전체에서 이 리전을 교체하면 됩니다. 이미 버킷이 있는 경우 이 단계를 건너뛸 수 있습니다.

Cloud Shell 터미널에서 다음 명령어를 실행하여 버킷을 만듭니다.

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

다음으로 컴퓨팅 서비스 계정에 이 버킷에 대한 액세스 권한을 부여합니다. 이렇게 하면 이 버킷에 파일을 쓰는 데 필요한 권한이 Vertex Pipelines에 부여됩니다. 다음 명령어를 실행하여 이 권한을 추가합니다.

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

4단계: Vertex AI Workbench 인스턴스 만들기

Cloud 콘솔의 Vertex AI 섹션에서 'Workbench'를 클릭합니다.

Vertex AI 메뉴

여기에서 사용자 관리형 노트북 내에서 새 노트북을 클릭합니다.

새 노트북 만들기

그런 다음 GPU 없는 TensorFlow Enterprise 2.3 (LTS 포함) 인스턴스 유형을 선택합니다.

TFE 인스턴스

기본 옵션을 사용한 다음 만들기를 클릭합니다.

5단계: Google 노트 열기

인스턴스가 생성되면 JupyterLab 열기를 선택합니다.

노트북 열기

4. Vertex Pipelines 설정

Vertex Pipeline을 사용하려면 몇 가지 추가 라이브러리를 설치해야 합니다.

  • Kubeflow Pipelines: 파이프라인을 빌드하는 데 사용할 SDK입니다. Vertex Pipelines는 Kubeflow Pipelines 또는 TFX로 빌드된 파이프라인의 실행을 지원합니다.
  • Google Cloud 파이프라인 구성요소: 이 라이브러리는 파이프라인 단계에서 Vertex AI 서비스와 더 쉽게 상호작용할 수 있도록 사전 빌드된 구성요소를 제공합니다.

1단계: Python 노트북 만들기 및 라이브러리 설치

먼저 노트북 인스턴스의 런처 메뉴 (노트북 왼쪽 상단의 + 아이콘을 클릭하여 액세스할 수 있음)에서 Python 3을 선택하여 노트북을 만듭니다.

Python3 노트북 만들기

노트북 인스턴스의 왼쪽 상단에 있는 + 기호를 클릭하여 런처 메뉴에 액세스할 수 있습니다.

이 실습에서 사용할 두 서비스를 모두 설치하려면 먼저 노트북 셀에 사용자 플래그를 설정한 다음

USER_FLAG = "--user"

노트북에서 다음을 실행합니다.

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

다음 패키지를 설치한 후 커널을 다시 시작해야 합니다.

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

마지막으로 패키지를 올바르게 설치했는지 확인하세요. KFP SDK 버전은 1.8 이상이어야 합니다.

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

2단계: 프로젝트 ID 및 버킷 설정

이 실습 전체에서 Cloud 프로젝트 ID와 이전에 만든 버킷을 참조합니다. 다음으로 각각에 대한 변수를 만들어 보겠습니다.

프로젝트 ID를 모르는 경우 다음을 실행하여 프로젝트 ID를 확인할 수 있습니다.

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

그렇지 않은 경우 여기에서 설정하세요.

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

그런 다음 버킷 이름을 저장할 변수를 만듭니다. 이 실습에서 변수를 만든 경우 다음이 작동합니다. 그렇지 않으면 수동으로 이를 설정해야 합니다.

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

3단계: 라이브러리 가져오기

다음을 추가하여 이 Codelab 전체에서 사용할 라이브러리를 가져옵니다.

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

4단계: 상수 정의

파이프라인을 빌드하기 전 마지막으로 해야 할 일은 상수 변수를 정의하는 것입니다. PIPELINE_ROOT은 파이프라인에서 만든 아티팩트가 기록될 Cloud Storage 경로입니다. 여기서는 us-central1을 리전으로 사용하지만 버킷을 만들 때 다른 리전을 사용한 경우 아래 코드에서 REGION 변수를 업데이트하세요.

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

위의 코드를 실행한 후에는 파이프라인의 루트 디렉터리가 표시되어야 합니다. 이는 파이프라인의 아티팩트가 작성될 Cloud Storage 위치이며 gs://YOUR-BUCKET-NAME/pipeline_root/ 형식입니다.

5. 커스텀 모델 학습 작업 구성

파이프라인을 설정하기 전에 커스텀 모델 학습 작업을 위한 코드를 작성해야 합니다. 모델을 학습시키기 위해 KOKLU, M. 및 OZKAN, I.A.의 UCI 머신러닝 드라이빈 데이터 세트를 사용합니다. (2020년), 'Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques.' into Computers and Electronics in Agriculture, 174, 105507. DOI

첫 번째 파이프라인 단계에서는 이 Bean 데이터 버전이 포함된 BigQuery 테이블을 사용하여 Vertex AI에서 관리형 데이터 세트를 만듭니다. 데이터 세트는 학습 작업에 입력으로 전달됩니다. 학습 코드에서는 환경 변수에 액세스하여 이 관리형 데이터 세트에 액세스할 수 있습니다.

커스텀 학습 작업을 설정하는 방법은 다음과 같습니다.

  • scikit-learn DecisionTreeClassifier 모델을 작성하여 데이터에서 콩 유형 분류
  • 학습 코드를 Docker 컨테이너에 패키징하고 Container Registry로 푸시하기

그러면 파이프라인에서 바로 Vertex AI Training 작업을 시작할 수 있습니다. 그럼 시작해 볼까요?

1단계: Docker 컨테이너에 학습 코드 정의

Notebooks 인스턴스에서 런처를 열고 터미널을 선택합니다.

터미널 열기

그런 다음 다음을 실행하여 컨테이너화된 코드를 추가할 디렉터리를 설정합니다.

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

이러한 명령어를 실행하면 왼쪽에 traincontainer/라는 디렉터리가 생성됩니다. 새로고침 아이콘을 클릭해야 할 수도 있습니다. traincontainer/ 디렉터리에 다음이 표시됩니다.

+ Dockerfile
+ trainer/
    + train.py

코드를 컨테이너화하는 첫 번째 단계는 Dockerfile을 만드는 것입니다. Dockerfile에는 이미지를 실행하는 데 필요한 모든 명령어가 포함됩니다. 사용 중인 모든 라이브러리를 설치하고 학습 코드의 진입점을 설정합니다. 방금 만든 Dockerfile을 열고 다음을 추가합니다.

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

노트북 인스턴스에서 파일을 수정할 때 파일을 저장하려면 ctrl+s를 사용하면 됩니다.

그런 다음 train.py 파일을 엽니다. 여기에 학습 코드를 추가할 것입니다. 다음을 train.py에 복사합니다. 이렇게 하면 관리형 데이터 세트에서 데이터를 가져와 Pandas DataFrame에 넣고 scikit-learn 모델을 학습시키고 학습된 모델을 Cloud Storage에 업로드합니다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

그런 다음 노트북으로 돌아가서 다음을 실행하여 위 스크립트의 YOUR_GCS_BUCKET을 Cloud Storage 버킷 이름으로 바꿉니다.

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

원하는 경우 이 작업을 직접 수행할 수도 있습니다. 이 경우 스크립트를 업데이트할 때 버킷 이름에 gs://를 포함하지 마세요.

이제 학습 코드가 Docker 컨테이너에 추가되었으므로 클라우드에서 학습을 실행할 준비가 되었습니다.

2단계: Container Registry로 컨테이너 푸시

학습 코드가 완성되었으니 이 코드를 Google Container Registry로 푸시해 보겠습니다. 나중에 파이프라인의 학습 구성요소를 구성할 때 이 컨테이너에 Vertex Pipelines를 지정합니다.

터미널로 돌아가서 traincontainer/ 디렉터리의 루트에서 Container Registry에 있는 컨테이너 이미지의 URI가 포함된 변수를 정의합니다.

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

그런 다음 다음을 실행하여 컨테이너를 빌드합니다.

docker build ./ -t $IMAGE_URI

마지막으로 컨테이너를 Container Registry로 푸시합니다.

docker push $IMAGE_URI

Cloud 콘솔의 Container Registry 섹션으로 이동하여 컨테이너가 있는지 확인합니다. 표시되는 방식은 다음과 같습니다.

Container Registry

6. 일괄 예측 작업 구성

파이프라인의 마지막 단계에서는 일괄 예측 작업을 실행합니다. 이 작업을 수행하려면 예측을 가져올 예시가 포함된 CSV 파일을 Cloud Storage에 제공해야 합니다. 이 CSV 파일을 노트북에 만들고 gsutil 명령줄 도구를 사용하여 Cloud Storage에 복사합니다.

Cloud Storage에 일괄 예측 예시 복사

다음 파일에는 Bean 데이터 세트의 각 클래스의 3가지 예가 포함되어 있습니다. 아래 예시에는 Class 열이 포함되어 있지 않습니다. 모델이 예측하기 때문입니다. 다음을 실행하여 노트북에서 이 CSV 파일을 로컬로 만듭니다.

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

그런 다음 파일을 Cloud Storage 버킷에 복사합니다.

!gsutil cp batch_examples.csv $BUCKET_NAME

파이프라인을 정의할 때 다음 단계에서 이 파일을 참조합니다.

7. 사전 빌드된 구성요소로 파이프라인 빌드하기

이제 학습 코드가 클라우드에 있으므로 파이프라인에서 호출할 준비가 되었습니다. 정의할 파이프라인은 이전에 설치한 google_cloud_pipeline_components 라이브러리에서 사전 빌드된 세 가지 구성요소를 사용합니다. 이러한 사전 정의된 구성요소는 파이프라인 설정을 위해 작성해야 하는 코드를 단순화하며, 모델 학습 및 일괄 예측과 같은 Vertex AI 서비스를 사용할 수 있게 해줍니다.

3단계 파이프라인의 작업은 다음과 같습니다.

  • Vertex AI에서 관리형 데이터 세트 만들기
  • 설정한 커스텀 컨테이너를 사용하여 Vertx AI에서 학습 작업 실행
  • 학습된 scikit-learn 분류 모델에서 일괄 예측 작업 실행

1단계: 파이프라인 정의

사전 빌드된 구성요소를 사용하고 있으므로 파이프라인 정의에서 전체 파이프라인을 설정할 수 있습니다. 노트북 셀에 다음을 추가합니다.

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

2단계: 파이프라인 컴파일 및 실행

파이프라인이 정의되었으므로 파이프라인을 컴파일할 준비가 되었습니다. 다음과 같이 파이프라인을 실행하는 데 사용할 JSON 파일을 생성합니다.

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

다음으로 TIMESTAMP 변수를 만듭니다. 이 매개변수는 작업 ID에 사용합니다.

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

그런 다음 몇 가지 프로젝트별 매개변수를 전달하여 파이프라인 작업을 정의합니다.

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

마지막으로 작업을 실행하여 새 파이프라인 실행을 만듭니다.

pipeline_job.submit()

이 셀을 실행하면 콘솔에서 실행된 파이프라인을 볼 수 있는 링크가 포함된 로그가 표시됩니다.

파이프라인 작업 로그

해당 링크로 이동합니다. 파이프라인 대시보드를 열어서 액세스할 수도 있습니다. 완료되면 파이프라인이 다음과 같이 표시됩니다.

인트로 파이프라인 완료됨

이 파이프라인을 실행하는 데는 5~10분이 걸리지만 완료되기 전에 다음 단계로 계속 진행할 수 있습니다. 이제 각 파이프라인 단계에서 발생하는 상황을 자세히 살펴보겠습니다.

8. 파이프라인 실행 이해

파이프라인 3단계를 각각 자세히 살펴보겠습니다.

파이프라인 1단계: 관리형 데이터 세트 만들기

파이프라인의 첫 번째 단계에서는 Vertex AI에서 관리형 데이터 세트를 만듭니다. 콘솔의 파이프라인 섹션에서 다음 데이터 세트 링크를 클릭하면

파이프라인에서 데이터 세트로 연결

Vertex AI에 데이터 세트가 표시됩니다. 여기에는 데이터 세트의 여러 열에 대한 정보와 함께 BigQuery의 데이터 소스 링크가 포함되어 있습니다. 관리형 데이터 세트를 Vertex AI에 업로드하면 이를 사용하여 AutoML 또는 커스텀 모델을 학습시킬 수 있습니다.

관리형 데이터 세트를 사용하는 커스텀 모델 작업의 경우 Vertex AI는 특수한 환경 변수를 학습 작업에 전달하고 데이터를 학습 및 테스트 세트로 분할하는 작업을 처리합니다. 다음 파이프라인 단계에서 이를 사용합니다.

파이프라인 2단계: Vertex AI Training에서 모델 학습

커스텀 학습 작업이 실행되는 동안 클릭하여 Vertex Pipelines 콘솔에서 직접 로그를 볼 수 있습니다.

커스텀 학습 로그

Vertex AI 학습 대시보드에서도 커스텀 학습 작업에 대한 세부정보를 확인할 수 있습니다. 학습 작업이 완료되면 Vertex AI에 모델 리소스가 생성됩니다. 그런 다음 온라인 예측을 위해 이 모델을 엔드포인트에 배포하거나 일괄 예측 작업을 만들 수 있습니다. 일괄 예측 작업은 다음 파이프라인 단계에서 수행합니다.

파이프라인 3단계: 모델에서 일괄 예측 작업 실행

마지막으로 파이프라인은 CSV 파일을 통해 전달한 예시에 대한 예측을 가져옵니다. 일괄 예측 작업이 완료되면 Vertex AI는 Cloud Storage에서 지정한 위치에 CSV 파일을 작성합니다. 이 파이프라인 단계의 실행이 시작되면 Vertex AI 콘솔의 일괄 예측 섹션으로 이동하여 생성된 작업을 확인할 수 있습니다.

완료되면 작업을 클릭하여 일괄 예측의 Cloud Storage URL을 확인합니다.

일괄 예측 작업

이 링크를 클릭하여 예측 결과를 찾을 수 있는 Cloud Storage 디렉터리로 이동한 후 클릭하여 prediction.results 파일 중 하나를 다운로드합니다. 파일에 다음과 같은 행이 표시됩니다.

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

여기에는 모델이 예측한 클래스와 함께 특정 인스턴스의 특성 값이 포함됩니다. 이 예에서 모델은 이를 'HOROZ'라고 인식합니다. 있습니다.

이로써 실습을 완료하셨습니다.

🎉 수고하셨습니다. 🎉

Vertex AI를 사용하여 다음을 수행하는 방법을 배웠습니다.

  • Kubeflow Pipelines SDK를 사용하여 커스텀 구성요소로 엔드 투 엔드 파이프라인 빌드
  • Vertex Pipelines에서 파이프라인을 실행하고 SDK로 파이프라인 실행을 시작하세요.
  • 콘솔에서 Vertex Pipelines 그래프 보기 및 분석
  • 사전 빌드된 파이프라인 구성요소를 사용하여 파이프라인에 Vertex AI 서비스 추가하기
  • 반복되는 파이프라인 작업 예약

Vertex의 다른 부분에 대해 자세히 알아보려면 문서를 확인하세요.

9. 삭제

요금이 청구되지 않도록 이 실습을 통해 만든 리소스를 삭제하는 것이 좋습니다.

1단계: Notebooks 인스턴스 중지 또는 삭제

이 실습에서 만든 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다. 인스턴스를 완전히 삭제하려면 삭제를 선택합니다.

인스턴스 중지

2단계: Cloud Storage 버킷 삭제

스토리지 버킷을 삭제하려면 Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 버킷을 선택하고 '삭제'를 클릭합니다.

스토리지 삭제