AI Platform Training에서 컨테이너 사용

이 가이드에서는 AI Platform Training에서 작업을 실행하도록 커스텀 컨테이너를 빌드하는 방법을 설명합니다.

컨테이너 사용 단계

다음은 커스텀 컨테이너를 사용한 학습을 위한 기본 프로세스를 보여주는 단계입니다.

  1. Google Cloud 프로젝트와 로컬 환경을 설정합니다.
  2. 커스텀 컨테이너를 만듭니다.
    1. AI Platform Training에서 사용할 컨테이너를 설정하고 학습 애플리케이션에 필요한 종속 항목을 포함하는 Dockerfile을 작성합니다.
    2. Docker 컨테이너를 로컬에서 빌드 및 테스트합니다.
  3. 컨테이너를 Container Registry로 내보냅니다.
  4. 커스텀 컨테이너에서 실행하는 학습 작업을 제출합니다.

초매개변수 미세 조정 또는 GPU를 사용하려면 약간의 조정이 필요하지만 기본 프로세스는 동일합니다.

시작하기 전에

Cloud Shell을 사용하거나 gcloud CLI가 설치된 다른 환경을 사용합니다.

다음 단계에 따라 GCP 계정을 설정하고, 필요한 API를 사용 설정하고, Cloud SDK를 설치 및 활성화합니다.

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

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API AI Platform Training & Prediction, Compute Engine and Container Registry 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API AI Platform Training & Prediction, Compute Engine and Container Registry 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  12. Docker를 설치합니다.

    Ubuntu나 Debian과 같은 Linux 기반 운영체제를 사용하는 경우 sudo를 사용하지 않고 Docker를 실행할 수 있도록 사용자 이름을 docker 그룹에 추가합니다.

    sudo usermod -a -G docker ${USER}

    사용자를 docker 그룹에 추가하고 나면 시스템을 다시 시작해야 할 수도 있습니다.

  13. Docker를 엽니다. Docker가 실행 중인지 확인하려면 다음 Docker 명령어를 실행합니다. 현재 시간과 날짜가 반환됩니다.
    docker run busybox date
  14. Docker의 사용자 인증 정보 도우미로 gcloud를 사용합니다.
    gcloud auth configure-docker
  15. 선택사항: GPU를 사용하여 컨테이너를 로컬에서 실행하려면 nvidia-docker를 설치합니다.

커스텀 컨테이너 만들기

커스텀 컨테이너를 만들려면 Dockerfile을 작성하여 학습 작업에 사용할 Docker 이미지를 설정해야 합니다. 그런 다음 이미지를 로컬에서 빌드 및 테스트합니다.

AI Platform Training용 Dockerfile 기본 사항

커스텀 컨테이너 생성 시 Dockerfile을 사용하여 이미지를 빌드하는 데 필요한 모든 명령어를 지정합니다.

이 섹션에서는 Dockerfile의 일반적인 예를 살펴봅니다. 각 커스텀 컨테이너 가이드 및 관련 샘플에서 특정 예시를 확인할 수 있습니다.

AI Platform Training에서 사용하려면 Dockerfile에 다음 작업을 처리하는 명령어가 포함되어 있어야 합니다.

  • 기본 이미지 선택
  • 추가 종속 항목 설치
  • 학습 코드를 이미지에 복사
  • AI Platform Training이 학습 코드를 호출하는 진입점 구성

필요에 따라 Dockerfile에 추가 논리를 포함할 수 있습니다. Dockerfiles 작성 방법 및 각 특정 명령어에 대한 자세한 내용을 보려면 Dockerfile 참조를 확인하세요.

Dockerfile 명령어 설명 예시
FROM image:tag 기본 이미지와 태그를 지정합니다.

태그가 있는 기본 이미지 예시:

  • pytorch/pytorch:latest
  • tensorflow/tensorflow:nightly
  • python:2.7.15-jessie
  • nvidia/cuda:9.0-cudnn7-runtime
WORKDIR /path/to/directory 후속 명령을 실행할 이미지의 디렉터리를 지정합니다. /root
RUN pip install pkg1 pkg2 pkg3 pip를 사용하여 추가 패키지를 설치합니다.

참고: 기본 이미지에 pip가 없으면 다른 패키지를 설치하기 전에 먼저 설치할 명령어를 포함해야 합니다.

패키지 예시:

  • google-cloud-storage
  • cloudml-hypertune
  • pandas
COPY src/foo.py dest/foo.py 학습 애플리케이션용 코드를 이미지에 복사합니다. 학습 애플리케이션 구조에 따라 파일 여러 개가 포함될 수 있습니다.

학습 애플리케이션의 파일 이름 예시:

  • model.py
  • task.py
  • data_utils.py
ENTRYPOINT ["exec", "file"] 학습 코드를 실행할 진입점을 설정합니다. ["python", "task.py"]

Dockerfile의 논리는 필요에 따라 다를 수 있지만 일반적으로 다음과 유사합니다.

# Specifies base image and tag
FROM image:tag
WORKDIR /root

# Installs additional packages
RUN pip install pkg1 pkg2 pkg3

# Downloads training data
RUN curl https://example-url/path-to-data/data-filename --output /root/data-filename

# Copies the trainer code to the docker image.
COPY your-path-to/model.py /root/model.py
COPY your-path-to/task.py /root/task.py

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

Docker 컨테이너를 로컬에서 빌드 및 테스트

  1. 환경 변수를 사용하여 올바른 이미지 URI를 만든 후 Docker 이미지를 빌드합니다. -t 플래그는 원하는 IMAGE_REPO_NAMEIMAGE_TAG로 이미지의 이름과 태그를 지정합니다. 이미지에 다른 이름과 태그를 선택할 수 있습니다.

    export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    export IMAGE_REPO_NAME=example_custom_container_image
    export IMAGE_TAG=example_image_tag
    export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    docker build -f Dockerfile -t $IMAGE_URI ./
    
  2. 로컬에서 실행하여 이미지를 확인합니다. --epochs 플래그가 트레이너 스크립트에 전달됩니다.

    docker run $IMAGE_URI --epochs 1
    

컨테이너를 Container Registry로 내보내기

로컬 실행이 작동하면 프로젝트의 Container Registry로 컨테이너를 내보낼 수 있습니다.

컨테이너를 Container Registry로 내보냅니다. 아직 실행하지 않았다면 먼저 gcloud auth configure-docker를 실행합니다.

docker push $IMAGE_URI

Container Registry 권한 관리

AI Platform Training에서 학습을 실행하는 데 사용하는 동일한 프로젝트 내에서 Container Registry 이미지를 사용하는 경우 이 가이드의 설명처럼 권한을 추가로 구성할 필요가 없으므로 다음 단계로 넘어가면 됩니다.

Container Registry에 대한 액세스 제어는 백그라운드에서 Cloud Storage 버킷을 기반으로 하므로 Container Registry 권한 구성은 Cloud Storage 권한 구성과 매우 유사합니다.

다른 프로젝트의 Container Registry에서 이미지를 가져오려면 AI Platform Training 서비스 계정에서 다른 프로젝트의 이미지에 액세스할 수 있도록 해야 합니다.

  • Container Registry 권한에 대한 기본 Cloud Storage 버킷을 찾습니다.
  • AI Platform Training 서비스 계정에 storage.objects.getstorage.objects.list 권한이 포함된 역할(예: 스토리지 객체 뷰어)을 부여합니다.

AI Platform Training 작업을 제출하는 데 사용 중인 것과 다른 프로젝트로 Docker 이미지를 내보내려면 Container Registry 저장소가 있는 프로젝트의 AI Platform Training 서비스 계정에 이미지 가져오기 액세스 권한을 부여해야 합니다. 서비스 계정은 service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com 형식이며 IAM 콘솔에서 확인할 수 있습니다.

다음 명령어는 AI Platform Training 서비스 계정을 별도의 Container Registry 프로젝트에 추가합니다.

export GCR_PROJ_ID=[YOUR-PROJECT-ID-FOR-GCR]
export CMLE_PROJ_NUM=[YOUR-PROJECT-NUMBER-FOR-CMLE-JOB-SUBMISSION]
export \
SVC_ACCT=service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com

gcloud projects add-iam-policy-binding $GCR_PROJ_ID \
    --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent

Container Registry에 대한 액세스 제어를 구성하는 방법을 자세히 알아보세요.

학습 작업 제출

gcloud CLI를 사용하여 AI Platform Training에 학습 작업을 제출합니다. --master-image-uri 플래그를 사용하여 URI를 Docker 이미지로 전달합니다.

export BUCKET_NAME=custom_containers
export MODEL_DIR=example_model_$(date +%Y%m%d_%H%M%S)

gcloud ai-platform jobs submit training $JOB_NAME \
  --region $REGION \
  --master-image-uri $IMAGE_URI \
  -- \
  --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
  --epochs=10

커스텀 컨테이너로 초매개변수 미세 조정

커스텀 컨테이너로 초매개변수를 미세 조정하려면 다음과 같은 조정이 필요합니다.

초매개변수 미세 조정과 커스텀 컨테이너를 사용한 학습 예시를 참조하세요.

커스텀 컨테이너와 함께 GPU 사용

GPU 학습을 위해서는 커스텀 컨테이너가 몇 가지 특수한 요구사항을 충족해야 합니다. CPU를 사용한 학습에 사용하는 Docker 이미지와 다른 Docker 이미지를 빌드해야 합니다.

  • 컨테이너에 CUDA 도구와 cuDNN을 사전 설치합니다. 이를 처리하는 권장 방법은 nvidia/cuda 이미지를 기본 이미지로 사용하는 것입니다. CUDA 도구와 cuDNN이 사전 설치되어 있고 관련 환경 변수를 올바르게 설정하는 데 유용하기 때문입니다.

    학습 구성에서 NVIDIA A100 GPU를 사용하는 경우 컨테이너는 CUDA 11 이상을 사용해야 합니다.

  • wget, curl, pip, 학습 애플리케이션에 필요한 기타 종속 항목을 추가로 설치합니다.

GPU를 사용한 학습을 위한 Dockerfile 예시를 참조하세요.

커스텀 컨테이너와 함께 TPU 사용

TensorFlow를 사용한 분산 학습을 수행하는 경우 작업자 VM에서 TPU를 사용하면 됩니다. 이렇게 하려면 학습 작업을 제출할 때 TPU를 사용하도록 학습 작업을 구성하고 tpuTfVersion 필드를 지정해야 합니다.

커스텀 컨테이너를 사용한 분산 학습

커스텀 컨테이너로 분산 학습 작업을 실행하는 경우, 마스터, 작업자, 매개변수 서버로 사용할 이미지를 하나만 지정할 수 있습니다. 또한 마스터, 작업자, 매개변수 서버에 대해 서로 다른 이미지를 빌드하고 지정할 수도 있습니다. 이 경우 세 가지 이미지 모두에서 종속 항목이 같을 수 있으며 각 이미지 내에서 서로 다른 코드 논리를 실행할 수 있습니다.

코드에서 TF_CONFIGCLUSTER_SPEC 환경 변수를 사용할 수 있습니다. 이런 환경 변수는 클러스터의 전체 구조를 나타내며, AI Platform Training은 학습 클러스터의 각 노드에서 이 환경 변수를 자동으로 채웁니다. CLUSTER_SPEC에 대해 자세히 알아보세요.

작업을 제출할 때 TrainingInput 객체 내에서 또는 gcloud ai-platform submit training의 해당 플래그를 통해 이미지를 지정할 수 있습니다.

이 예시에서는 각 유형의 머신(마스터, 작업자, 매개변수 서버)마다 별도의 Dockerfile 3개를 이미 정의했다고 가정합니다. 그런 다음 이미지의 이름을 지정하고 빌드하고 테스트하고 Container Registry에 내보냅니다. 마지막으로, 클러스터의 머신 구성과 함께 서로 다른 이미지를 지정하는 학습 작업을 제출합니다.

아직 실행하지 않았다면 먼저 gcloud auth configure-docker를 실행합니다.

export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
export BUCKET_NAME=custom_containers
export MASTER_IMAGE_REPO_NAME=master_image_name
export MASTER_IMAGE_TAG=master_tag
export MASTER_IMAGE_URI=gcr.io/$PROJECT_ID/$MASTER_IMAGE_REPO_NAME:$MASTER_IMAGE_TAG
export WORKER_IMAGE_REPO_NAME=worker_image_name
export WORKER_IMAGE_TAG=worker_tag
export WORKER_IMAGE_URI=gcr.io/$PROJECT_ID/$WORKER_IMAGE_REPO_NAME:$WORKER_IMAGE_TAG
export PS_IMAGE_REPO_NAME=ps_image_name
export PS_IMAGE_TAG=ps_tag
export PS_IMAGE_URI=gcr.io/$PROJECT_ID/$PS_IMAGE_REPO_NAME:$PS_IMAGE_TAG
export MODEL_DIR=distributed_example_$(date +%Y%m%d_%H%M%S)
export REGION=us-central1
export JOB_NAME=distributed_container_job_$(date +%Y%m%d_%H%M%S)

docker build -f Dockerfile-master -t $MASTER_IMAGE_URI ./
docker build -f Dockerfile-worker -t $WORKER_IMAGE_URI ./
docker build -f Dockerfile-ps -t $PS_IMAGE_URI ./

docker run $MASTER_IMAGE_URI --epochs 1
docker run $WORKER_IMAGE_URI --epochs 1
docker run $PS_IMAGE_URI --epochs 1

docker push $MASTER_IMAGE_URI
docker push $WORKER_IMAGE_URI
docker push $PS_IMAGE_URI

gcloud ai-platform jobs submit training $JOB_NAME \
  --region $REGION \
  --master-machine-type complex_model_m \
  --master-image-uri $MASTER_IMAGE_URI \
  --worker-machine-type complex_model_m \
  --worker-image-uri $WORKER_IMAGE_URI \
  --worker-count 9 \
  --parameter-server-machine-type large_model \
  --parameter-server-image-uri $PS_IMAGE_URI \
  --parameter-server-count 3 \
  -- \
  --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
  --epochs=10

커스텀 컨테이너의 기본 사용자 인증 정보

커스텀 컨테이너로 학습 작업을 실행하면 기본적으로 애플리케이션이 Cloud ML 서비스 에이전트 ID로 실행됩니다. Google Cloud Console의 IAM 페이지에서 프로젝트에 대한 Cloud ML 서비스 에이전트의 서비스 계정 ID를 찾을 수 있습니다. 이 ID의 형식은 다음과 같습니다.

service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com

PROJECT_NUMBER를 Google Cloud 프로젝트의 프로젝트 번호로 바꿉니다.

AI Platform Training은 TensorFlow tfds, Google Cloud 클라이언트 라이브러리 또는 애플리케이션 기본 사용자 인증 정보 전략을 사용하는 기타 도구를 사용하는 경우 Cloud ML 서비스 에이전트 사용자 인증 정보를 사용하여 인증 및 승인을 자동으로 설정합니다.

그러나 커스텀 컨테이너 작업이 다른 방식으로 Google Cloud에 액세스하도록 하려면 추가 구성을 수행해야 할 수 있습니다. 예를 들어 gsutil을 사용하여 Cloud Storage에서 데이터를 복사하고 boto 라이브러리를 사용하여 구성 파일에서 사용자 인증 정보를 로드하는 경우, gsutil이 기본 Cloud ML 서비스 에이전트 사용자 인증 정보를 사용하도록 Dockerfile에 명령어를 추가합니다.

RUN echo '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg

다음 단계