본 글에서는 Google Cloud Platform을 통해서 딥러닝 모델을 학습하는 방법을 다룹니다.
- Tensorflow를 이용하여 간단한 Fashion-MNIST 예측 모델을 만들어서 학습 시켜봅니다.
- AI-Platform에서 제공해주는 Hyperparameter Tuning을 사용해봅니다.
이 글은 다음 독자들을 위한 글입니다.
- 머신러닝, 혹은 딥러닝 모델을 학습해 보신분.
- GCP AI-Platform을 통한 모델 학습이 처음이신 분.
GCP AI-Platform의 공식 문서와 공식 코드를 상당수 참고하였습니다.
주의! 본 튜토리얼을 진행시 과금이 이루어 질 수 있습니다.
- 다음 링크를 따라가 구글 클라우드 플랫폼을 설정합니다.
- 학습 데이터와 애플리케이션이 저장될 수 있도록 Cloud Storage 버킷을 설정합니다.
다음 링크에서 예제코드를 다운받습니다.
git clone https://github.com/GoogleCloudPlatform/cloudml-samples.git
본 튜토리얼에서 사용할 예제 파일 있는 곳으로 이동합니다.
cd cloudml-samples/tensorflow/standard/mnist
선호하시는 python 가상환경을 설정해주세요.
- Virtualenv 설치
python -m virtualenv myvirtualenv
source myvirtualenv/bin/activate
- Miniconda 설치
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가 존재하는 경우 여기에는 학습 애플리케이션을 실행하는 코드가 포함되어 있습니다.
AI-Platform은 패키지 형태로 설치 실행되기 때문에 의존성 관리가 필연적입니다.
의존성은 setup.py
의 REQUIRED_PACKAGES
에 추가하면 됩니다.
참고: 다음 글은 파이썬 패키지의 의존성 관리에 관한 글입니다.
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
AI-Platform에서 돌려보기 전에 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에서 학습을 돌려봅시다!
GCloud 명령어를 이용하면 두가지 방식으로 학습을 시킬 수 있습니다.
local에서 코드가 돌아가는지 테스트를 해볼 수 있고, 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
참고: 학습 데이터를 로컬 파일 시스템에 다운로드한 경우 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)
에서도 확인 할 수 있습니다.
딥러닝을 학습 시키다보면 학습하려는 데이터가 매우많고 모델 크기가 커서 학습이 오래 걸릴수 있습니다.
이를 위해 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에서 --config
에 config.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
자세한 머신 유형 및 확장 등급은 링크를 참고해 주세요.
TODO