프로토타입에서 프로덕션으로: Vertex AI로 커스텀 모델 학습

1. 개요

이 실습에서는 Vertex AI를 사용하여 커스텀 학습 작업을 실행합니다.

이 실습은 프로토타입에서 프로덕션으로 동영상 시리즈 중 하나이며, Flowers 데이터 세트를 사용하여 이미지 분류 모델을 빌드합니다. 함께 제공되는 동영상을 시청하여 자세히 알아볼 수 있습니다.

.

학습 내용

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

  • Vertex AI Workbench 관리 노트북 만들기
  • Vertex AI UI에서 커스텀 학습 작업 구성 및 실행
  • Vertex AI Python SDK로 커스텀 학습 작업 구성 및 실행

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

2. Vertex AI 소개

이 실습에서는 Google Cloud에서 제공되는 최신 AI 제품을 사용합니다. Vertex AI는 Google Cloud 전반의 ML 제품을 원활한 개발 환경으로 통합합니다. 이전에는 AutoML로 학습된 모델과 커스텀 모델은 별도의 서비스를 통해 액세스할 수 있었습니다. 새 서비스는 다른 새로운 제품과 함께 두 가지 모두를 단일 API로 결합합니다. 기존 프로젝트를 Vertex AI로 이전할 수도 있습니다.

Vertex AI에는 엔드 투 엔드 ML 워크플로를 지원하는 다양한 제품이 포함되어 있습니다. 이 실습에서는 아래에 강조 표시된 학습Workbench 제품에 중점을 둡니다.

Vertex 제품 개요

3. 환경 설정

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

1단계: Compute Engine API 사용 설정

아직 사용 설정되지 않은 경우 Compute Engine으로 이동하고 사용 설정을 선택합니다.

2단계: Artifact Registry API 사용 설정

아직 사용 설정되지 않은 경우 Artifact Registry로 이동하여 사용 설정을 선택합니다. 이를 사용하여 커스텀 학습 작업을 위한 컨테이너를 생성합니다.

3단계: Vertex AI API 사용 설정

Cloud 콘솔의 Vertex AI 섹션으로 이동하고 Vertex AI API 사용 설정을 클릭합니다.

Vertex AI 대시보드

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

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

Vertex AI 메뉴

Notebooks API를 아직 사용 설정하지 않은 경우 사용 설정합니다.

Notebook_api

사용 설정했으면 관리형 노트북을 클릭합니다.

Notebooks_UI

그런 다음 새 노트북을 선택합니다.

new_notebook

노트북 이름을 지정하고 권한에서 서비스 계정을 선택합니다.

create_notebook

고급 설정을 선택합니다.

아직 사용 설정되지 않은 경우 보안에서 '터미널 사용 설정'을 선택합니다.

enable-terminal

다른 고급 설정은 모두 그대로 두면 됩니다.

그런 다음 만들기를 클릭합니다. 인스턴스를 프로비저닝하는 데 몇 분 정도 걸립니다.

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

open_jupyterlab

4. 학습 애플리케이션 코드 컨테이너화

학습 애플리케이션 코드를 Docker 컨테이너에 넣고 이 컨테이너를 Google Artifact Registry로 푸시하여 이 학습 작업을 Vertex AI에 제출합니다. 이 방식을 사용하면 모든 프레임워크로 빌드된 모델을 학습시킬 수 있습니다.

시작하려면 런처 메뉴에서 노트북 인스턴스의 터미널 창을 엽니다.

노트북에서 터미널 열기

1단계: Cloud Storage 버킷 만들기

이 학습 작업에서는 학습된 TensorFlow 모델을 Cloud Storage 버킷으로 내보냅니다. 또한 학습용 데이터를 Cloud Storage 버킷에 저장합니다.

터미널에서 다음을 실행하여 프로젝트의 env 변수를 정의하고 your-cloud-project를 프로젝트의 ID로 바꿉니다.

PROJECT_ID='your-cloud-project'

다음으로, 터미널에서 다음을 실행하여 프로젝트에 새 버킷을 만듭니다.

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

2단계: Cloud Storage 버킷에 데이터 복사

flowers 데이터 세트를 Cloud Storage로 가져와야 합니다. 시연을 위해 먼저 이 Workbench 인스턴스에 데이터 세트를 다운로드한 다음 버킷에 복사합니다.

데이터를 다운로드하고 압축을 풉니다.

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

그런 다음 방금 만든 버킷에 복사합니다. 전체 디렉터리를 복사하기 위해 -r을 추가하고 작업 속도를 높여줄 다중 처리 복사를 수행하기 위해 -m을 추가합니다.

gsutil -m cp -r flower_photos $BUCKET

3단계: 학습 코드 작성

flowers라는 새 디렉터리를 만들고 여기로 디렉터리를 변경합니다.

mkdir flowers
cd flowers

다음을 실행하여 학습 코드 디렉터리와 코드를 추가할 Python 파일을 만듭니다.

mkdir trainer
touch trainer/task.py

이제 flowers/ 디렉터리에 다음이 포함됩니다.

+ trainer/
    + task.py

학습 애플리케이션 코드를 구성하는 방법에 대한 자세한 내용은 문서를 확인하세요.

다음으로, 방금 만든 task.py 파일을 열고 아래의 코드를 복사합니다.

{your-gcs-bucket}은 방금 만든 Cloud Storage 버킷의 이름으로 바꿔야 합니다.

Vertex AI Training의 학습 작업은 Cloud Storage FUSE 도구를 통해 로컬 파일 시스템의 파일처럼 Cloud Storage의 데이터에 액세스할 수 있습니다. 커스텀 학습 작업을 시작하면 모든 Cloud Storage 버킷을 하위 디렉터리로 포함하는 /gcs 디렉터리가 확인됩니다. 그래서 학습 코드의 데이터 경로가 /gcs로 시작되는 것입니다.

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''

  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset

def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

4단계: Dockerfile 만들기

코드를 컨테이너화하려면 Dockerfile을 만들어야 합니다. Dockerfile에는 이미지를 실행하는 데 필요한 모든 명령어가 포함됩니다. 필요한 모든 라이브러리를 설치하고 학습 코드의 진입점을 설정합니다.

터미널에서 flowers 디렉터리의 루트에 빈 Dockerfile을 만듭니다.

touch Dockerfile

이제 flowers/ 디렉터리에 다음이 포함됩니다.

+ Dockerfile
+ trainer/
    + task.py

Dockerfile을 열고 다음을 복사합니다.

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

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

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

이 파일의 명령을 살펴보겠습니다.

FROM 명령은 생성할 이미지의 기반이 될 상위 이미지인 기본 이미지를 지정합니다. Deep Learning Container TensorFlow Enterprise 2.8 GPU Docker 이미지를 기본 이미지로 사용합니다. Google Cloud의 Deep Learning Containers에는 많은 수의 일반적인 ML 및 데이터 과학 프레임워크가 사전 설치된 상태로 제공됩니다.

WORKDIR 명령은 후속 지침이 실행되는 이미지의 디렉터리를 지정합니다.

COPY 명령은 트레이너 코드를 Docker 이미지에 복사합니다. 이 예시에서는 트레이너 디렉터리에 Python 파일 하나만 있지만 보다 현실적인 예시의 경우 추가 파일이 있을 수 있습니다. 데이터 전처리를 수행하는 data.py, 모델 코드만 포함된 model.py 등이 있을 수 있습니다. 더 복잡한 학습 코드는 Python 프로젝트 패키징에 대한 Python 문서를 확인하세요.

라이브러리를 추가하려면 RUN 명령을 사용하여 pip 설치를 수행하면 됩니다(예: RUN pip install -r requirements.txt). 그러나 여기서는 예시에 추가로 필요한 것이 없습니다.

마지막으로 ENTRYPOINT 명령은 트레이너를 호출하기 위한 진입점을 설정합니다. 이는 학습 작업을 시작할 때 실행됩니다. 이 경우에는 task.py 파일을 실행합니다.

여기에서 Vertex AI 학습용 Dockerfile 작성에 대해 자세히 알아볼 수 있습니다.

4단계: 컨테이너 빌드

Workbench 노트북의 터미널에서 다음을 실행하여 프로젝트의 env 변수를 정의합니다. your-cloud-project는 프로젝트의 ID로 바꿔야 합니다.

PROJECT_ID='your-cloud-project'

Artifact Registry에서 저장소 만들기

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

Google Artifact Registry에서 컨테이너 이미지의 URI로 변수를 정의합니다.

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

Docker 구성

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

그런 다음 flower 디렉터리의 루트에서 다음을 실행하여 컨테이너를 빌드합니다.

docker build ./ -t $IMAGE_URI

마지막으로 Artifact Registry로 푸시합니다.

docker push $IMAGE_URI

컨테이너가 Artifact Registry로 푸시되었으므로 이제 학습 작업을 시작할 준비가 되었습니다.

5. Vertex AI에서 커스텀 학습 작업 실행

이 실습에서는 Google Artifact Registry의 커스텀 컨테이너를 통한 커스텀 학습을 사용하지만 사전 빌드된 컨테이너로 학습 작업을 실행할 수도 있습니다.

시작하려면 Cloud 콘솔의 Vertex 섹션에서 학습 섹션으로 이동합니다.

학습 메뉴

1단계: 학습 작업 구성

만들기를 클릭하여 학습 작업을 위한 매개변수를 입력합니다.

create_training

  • 데이터 세트에서 관리형 데이터 세트 없음을 선택합니다.
  • 그런 다음 학습 방법으로 커스텀 학습(고급)을 선택하고 계속을 클릭합니다.
  • 새 모델 학습을 선택한 다음 모델 이름flowers-model(또는 원하는 모델 이름)을 입력합니다.
  • 계속을 클릭합니다.

컨테이너 설정 단계에서 커스텀 컨테이너를 선택합니다.

커스텀 컨테이너 옵션

첫 번째 상자(컨테이너 이미지)에 이전 섹션의 IMAGE_URI 변수 값을 입력합니다. 사용자 고유의 프로젝트 ID가 포함된 us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest여야 합니다. 나머지 필드는 비워 두고 계속을 클릭합니다.

계속을 다시 클릭하여 초매개변수 단계를 건너뜁니다.

2단계: 컴퓨팅 클러스터 구성

작업자 풀 0을 다음과 같이 구성합니다.

worker_pool_0

지금은 6단계를 건너뛰고 이 시리즈의 다음 실습에서 예측 컨테이너를 구성합니다.

학습 시작을 클릭하여 학습 작업을 시작합니다. 콘솔의 학습 섹션에서 학습 파이프라인 탭에 새로 실행한 작업이 표시됩니다.

학습 작업

🎉 수고하셨습니다. 🎉

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

  • 커스텀 컨테이너에서 제공되는 학습 코드에 대한 커스텀 학습 작업을 시작합니다. 이 예에서는 TensorFlow 모델을 사용했지만 커스텀 또는 기본 제공되는 컨테이너를 사용하여 모든 프레임워크로 빌드된 모델을 학습시킬 수 있습니다.

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

6. [선택사항] Vertex AI Python SDK 사용

이전 섹션에서는 UI를 통해 학습 작업을 시작하는 방법을 알아보았습니다. 이 섹션에서는 Vertex AI Python SDK를 사용하여 학습 작업을 제출하는 다른 방법을 살펴볼 것입니다.

노트북 인스턴스로 돌아가서 런처에서 TensorFlow 2 노트북을 만듭니다.

new_notebook

Vertex AI SDK를 가져옵니다.

from google.cloud import aiplatform

그런 다음 CustomContainerTrainingJob을 만듭니다. container_uri{PROJECT_ID}는 프로젝트 이름으로 바꾸고 staging_bucket{BUCKET}은 이전에 만든 버킷으로 바꿔야 합니다.

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

그런 다음 작업을 실행합니다.

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

시연을 위해 이 작업은 이전 섹션보다 더 큰 머신에서 실행되도록 구성되었습니다. 또한 GPU로 실행합니다. machine-type, accelerator_type 또는 accelerator_count를 지정하지 않으면 기본적으로 n1-standard-4에서 작업이 실행됩니다.

콘솔의 학습 섹션에서 커스텀 작업 탭에 학습 작업이 표시됩니다.

7. 정리

Vertex AI Workbench 관리 노트북에는 유휴 상태 종료 기능이 있으므로 인스턴스 종료에 대해 걱정할 필요가 없습니다. 인스턴스를 수동으로 종료하려면 콘솔의 Vertex AI Workbench 섹션에서 '중지' 버튼을 클릭합니다. 노트북을 완전히 삭제하려면 '삭제' 버튼을 클릭합니다.

인스턴스 중지

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

스토리지 삭제