Skip to content

Instantly share code, notes, and snippets.

@kairos03
Last active March 20, 2023 07:22
Show Gist options
  • Save kairos03/d40d5d9a3fc97e3ee83c4d4f863434db to your computer and use it in GitHub Desktop.
Save kairos03/d40d5d9a3fc97e3ee83c4d4f863434db to your computer and use it in GitHub Desktop.
GCP AI-Platform에서 딥러닝 학습하기

시작하기 전에

본 글에서는 Google Cloud Platform을 통해서 딥러닝 모델을 학습하는 방법을 다룹니다.

  1. Tensorflow를 이용하여 간단한 Fashion-MNIST 예측 모델을 만들어서 학습 시켜봅니다.
  2. AI-Platform에서 제공해주는 Hyperparameter Tuning을 사용해봅니다.

이 글은 다음 독자들을 위한 글입니다.

  • 머신러닝, 혹은 딥러닝 모델을 학습해 보신분.
  • GCP AI-Platform을 통한 모델 학습이 처음이신 분.

GCP AI-Platform의 공식 문서공식 코드를 상당수 참고하였습니다.

주의! 본 튜토리얼을 진행시 과금이 이루어 질 수 있습니다.

GCP 준비하기

  1. 다음 링크를 따라가 구글 클라우드 플랫폼을 설정합니다.
  2. 학습 데이터와 애플리케이션이 저장될 수 있도록 Cloud Storage 버킷을 설정합니다.

예제 코드 준비하기

다음 링크에서 예제코드를 다운받습니다.

git clone https://github.com/GoogleCloudPlatform/cloudml-samples.git

본 튜토리얼에서 사용할 예제 파일 있는 곳으로 이동합니다.

cd cloudml-samples/tensorflow/standard/mnist

선호하시는 python 가상환경을 설정해주세요.

python -m virtualenv myvirtualenv
source myvirtualenv/bin/activate
conda create --name myvirtualenv python=2.7
source activate myvirtualenv

Dependency를 설치합니다.

pip install --upgrade -r requirements.txt

코드 구조 살펴보기

AI-Platform에서 학습을 시키기 위해서는 학습 코드를 파이썬 패키지 형태로 저장해야 합니다. 다양한 형태의 패키지를 만들수 있지만 예시 구조와 비슷하게 구성하면 더 쉽게 따라할 수 있습니다. 일반적으로 사용되는 패키지 구조는 다음과 같습니다.

  • setup.py 파일이 포함된 기본 프로젝트 디렉토리를 사용합니다.
  • trainer라는 하위 디렉토리를 사용하여 기본 애플리케이션 모듈을 저장합니다.
  • 기본 애플리케이션 모듈 task.py의 이름을 지정합니다.
  • 이외의 애플리케이션을 구현하는데 필요한 코드를 하위 디렉토리에 생성합니다.
  • 모든 하위 디렉토리에는 __init__.py 파일이 위치합니다. 이는 Setuptools에서 패키징할 코드가 있는 디렉토리를 식별하는 데 사용되며 비어 있을 수도 있습니다.

AI Platform 샘플에서 trainer 디렉토리에는 일반적으로 다음과 같은 소스 파일이 포함됩니다.

  • task.py에는 학습 작업을 관리하는 애플리케이션 로직이 포함됩니다.
  • model.py에는 모델의 로직인 텐서플로우 그래프 코드가 포함됩니다.
  • util.py가 존재하는 경우 여기에는 학습 애플리케이션을 실행하는 코드가 포함되어 있습니다.

image

패키지 의존성 관리하기

AI-Platform은 패키지 형태로 설치 실행되기 때문에 의존성 관리가 필연적입니다. 의존성은 setup.pyREQUIRED_PACKAGES에 추가하면 됩니다.

참고: 다음 글은 파이썬 패키지의 의존성 관리에 관한 글입니다.

Dataset 준비

Fashion-MNIST는 Zalando's article images을 모아 놓은 Fashion 데이터셋으로 60,000장의 학습 데이터셋과 10,000장의 테스트 데이터 셋으로 이루어저 있습니다. 각 데이터는 28x28 크기의 grayscale 이미지로 총 10개의 클래스로 구분됩니다.

데이터를 다운받고 GCP에서 사용할 수 있도록 Cloud Storage에 업로드 합니다. 다운로드

mkdir data && cd data
curl -O https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
curl -O https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
curl -O https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
curl -O https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
cd ..

업로드, your-bucket-name을 수정해 주세요.

export BUCKET_NAME="your-bucket-name"
gsutil mb gs://$BUCKET_NAME
gsutil cp -r data/train-labels-idx1-ubyte.gz gs://$BUCKET_NAME/train-labels-idx1-ubyte.gz
gsutil cp -r data/train-images-idx3-ubyte.gz gs://$BUCKET_NAME/train-images-idx3-ubyte.gz
gsutil cp -r data/train-labels-idx1-ubyte.gz gs://$BUCKET_NAME/t10k-images-idx3-ubyte.gz
gsutil cp -r data/train-images-idx3-ubyte.gz gs://$BUCKET_NAME/t10k-labels-idx1-ubyte.gz

Training

AI-Platform에서 돌려보기 전에 local에서 학습을 돌려 볼 수 있습니다.

local

  • Configuration:
MNIST_DATA=data
DATE=`date '+%Y%m%d_%H%M%S'`
export JOB_DIR=mnist_$DATE
rm -rf $JOB_DIR
export TRAIN_FILE=$MNIST_DATA/train-images-idx3-ubyte.gz
export TRAIN_LABELS_FILE=$MNIST_DATA/train-labels-idx1-ubyte.gz
export TEST_FILE=$MNIST_DATA/train-images-idx3-ubyte.gz
export TEST_LABELS_FILE=$MNIST_DATA/train-labels-idx1-ubyte.gz
rm -rf $JOB_DIR
  • Test locally:
python -m trainer.task \
    --train-file=$TRAIN_FILE \
    --train-labels-file=$TRAIN_LABELS_FILE \
    --test-file=$TEST_FILE \
    --test-labels-file=$TEST_LABELS_FILE \
    --job-dir=$JOB_DIR

AI-Platform

이제 AI-Platform에서 학습을 돌려봅시다!
GCloud 명령어를 이용하면 두가지 방식으로 학습을 시킬 수 있습니다.
local에서 코드가 돌아가는지 테스트를 해볼 수 있고, AI-Platform에서 학습을 돌릴 수 있습니다.

local test trining with AI-Platform

  • GCloud Configuration:
export BUCKET_NAME="your-bucket-name"
export JOB_NAME="mnist_keras_$(date +%Y%m%d_%H%M%S)"
export JOB_DIR=gs://$BUCKET_NAME/$JOB_NAME
export TRAIN_FILE=gs://cloud-samples-data/ml-engine/mnist/train-images-idx3-ubyte.gz
export TRAIN_LABELS_FILE=gs://cloud-samples-data/ml-engine/mnist/train-labels-idx1-ubyte.gz
export TEST_FILE=gs://cloud-samples-data/ml-engine/mnist/t10k-images-idx3-ubyte.gz
export TEST_LABELS_FILE=gs://cloud-samples-data/ml-engine/mnist/t10k-labels-idx1-ubyte.gz
  • GCloud Command를 이용해서 local에서 작업 수행 해 보기
gcloud ai-platform local train --module-name=trainer.task --package-path=trainer -- \
    --train-file=$TRAIN_FILE \
    --train-labels=$TRAIN_LABELS_FILE \
    --test-file=$TEST_FILE \
    --test-labels-file=$TEST_LABELS_FILE \
    --job-dir=$JOB_DIR

Remote Training with AI-Platform

참고: 학습 데이터를 로컬 파일 시스템에 다운로드한 경우 TRAIN_FILE, TRAIN_LABELS_FILE, TEST_FILE 및 TEST_LABELS_FILE 환경 변수를 재설정하여 GCS 위치를 참조하게 바꾸어야 합니다. 데이터가 GCS에 있어야 클라우드 기반 학습을 진행할 수 있습니다.

  • GCloud Configuration:
DATE=`date '+%Y%m%d_%H%M%S'`
export BUCKET_NAME="your-bucket-name"
export JOB_NAME=mnist_$DATE
export JOB_PATH="my_job_path"
export GCS_JOB_DIR=gs://$BUCKET_NAME/$JOB_PATH/$JOB_NAME
echo $GCS_JOB_DIR
export TRAIN_FILE=gs://cloud-samples-data/ml-engine/mnist/train-images-idx3-ubyte.gz
export TRAIN_LABELS_FILE=gs://cloud-samples-data/ml-engine/mnist/train-labels-idx1-ubyte.gz
export TEST_FILE=gs://cloud-samples-data/ml-engine/mnist/t10k-images-idx3-ubyte.gz
export TEST_LABELS_FILE=gs://cloud-samples-data/ml-engine/mnist/t10k-labels-idx1-ubyte.gz
export REGION=us-central1
  • GCloud Command를 이용해서 local에서 작업 수행 해 보기
gcloud ai-platform jobs submit training $JOB_NAME --stream-logs --runtime-version 1.14 \
    --job-dir=$GCS_JOB_DIR \
    --package-path=trainer \
    --module-name trainer.task \
    --region $REGION -- \
    --train-file=$TRAIN_FILE \
    --train-labels=$TRAIN_LABELS_FILE \
    --test-file=$TEST_FILE \
    --test-labels-file=$TEST_LABELS_FILE

학습 로그는 GCP Console > AI-Platform > 작업(JOBS)에서도 확인 할 수 있습니다.

Machine Type

딥러닝을 학습 시키다보면 학습하려는 데이터가 매우많고 모델 크기가 커서 학습이 오래 걸릴수 있습니다.
이를 위해 AI-Platform에서는 다양한 형태의 머신 타입을 지원합니다. 자신의 데이터 크기, 모델 크기에 따라 원하는 머신타입을 사용하여 학습을 진행 하실 수 있습니다.

머신타입을 지정하는 방법은 두가지 방식이있습니다.

  • 사전 정의된 타입
  • 커스텀 타입

사전 정의된 타입을 사용하기 위해서는 --scale-tier 옵션을 사용하면 됩니다.
위 예제에 이어서 적용해 보겠습니다.

gcloud ai-platform jobs submit training $JOB_NAME --stream-logs --runtime-version 1.14 \
    --scale-tier basic \
    --job-dir=$GCS_JOB_DIR \
    --package-path=trainer \
    --module-name trainer.task \
    --region $REGION -- \
    --train-file=$TRAIN_FILE \
    --train-labels=$TRAIN_LABELS_FILE \
    --test-file=$TEST_FILE \
    --test-labels-file=$TEST_LABELS_FILE

커스텀 타입은 config.yaml 파일을 작성하여 지정합니다.
다음 파일을 프로젝트 최상위 디렉토리에 만들어 주세요.

# config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3

GCloud Command에서 --configconfig.yaml 파일을 지정해 줍니다.

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \ 
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

자세한 머신 유형 및 확장 등급은 링크를 참고해 주세요.

Hyperparameter Tuning

TODO

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment