Cloud TPU 및 GKE를 사용하여 ResNet 학습

이 가이드에서는 Cloud TPU와 GKE에서 TensorFlow ResNet-50 모델을 학습시키는 방법을 설명합니다.

즉, 이 가이드에서는 다음과 같은 단계를 통해 테스트 목적으로 제공된 가짜 데이터세트를 사용하여 모델을 실행합니다.

  • 모델 출력을 보관할 Cloud Storage 버킷을 만듭니다.
  • Cloud TPU 리소스를 관리할 GKE 클러스터를 만듭니다.
  • Cloud TPU에서 TensorFlow를 사용하여 ResNet-50을 학습시키는 데 필요한 리소스를 설명하는 Kubernetes 작업 사양을 다운로드합니다.
  • GKE 클러스터에서 작업을 실행하여 모델을 학습시킵니다.
  • 로그와 모델 출력을 확인합니다.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

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

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. GKE에서 Cloud TPU를 사용하면 프로젝트는 비용이 청구될 수 있는 Google Cloud 구성요소를 사용합니다. Cloud TPU 가격 책정GKE 가격 책정에서 예상 비용을 확인하고 안내를 따라 사용을 마친 리소스를 삭제합니다.

  5. Cloud Console에서 다음 API를 사용 설정합니다.

셸 선택 및 명령줄 도구 설치(필요한 경우)

Cloud Shell 또는 로컬 셸을 사용하여 이 가이드를 마칠 수 있습니다. Cloud Shell에는 gcloudkubectl 명령줄 도구가 사전 설치되어 있습니다. gcloud는 Google Cloud의 명령줄 인터페이스이며 kubectl은 Kubernetes 클러스터에 명령을 실행하기 위한 명령줄 인터페이스를 제공합니다.

로컬 셸을 사용하려는 경우 환경에 gcloudkubectl 명령줄 도구를 설치해야 합니다.

Cloud Shell

Cloud Shell을 시작하려면 다음 단계를 수행하세요.

  1. Google Cloud Console로 이동합니다.

  2. 콘솔의 오른쪽 상단 모서리에 있는 Cloud Shell 활성화 버튼을 클릭합니다.

Cloud Shell 세션이 콘솔 아래쪽 프레임 안에서 열립니다. 이 셸을 사용하여 gcloudkubectl 명령어를 실행합니다.

로컬 셸

gcloudkubectl을 설치하려면 다음 단계를 수행하세요.

  1. gcloud 명령줄 도구가 포함된 Google Cloud SDK를 설치합니다.

  2. 다음 명령어를 실행하여 kubectl 명령줄 도구를 설치합니다.

    $ gcloud components install kubectl
  3. Cloud TPU에 GKE를 실행하는 데 필요한 gcloud 구성요소를 설치합니다.

    $ gcloud components install

요구사항 및 제한사항

구성 정의 시 다음 사항에 유의하세요.

  • GKE 버전 1.13.4-gke.5 이상을 사용해야 합니다. 아래에 설명된 대로 gcloud container clusters create 명령어에 --cluster-version 매개변수를 추가하여 버전을 지정할 수 있습니다. 자세한 내용은 SDK 문서를 참조하세요.
  • TensorFlow 1.13 이상을 사용해야 합니다. resnet 구성과 같은 Kubernetes pod 사양에 TensorFlow 버전을 지정할 수 있습니다.
  • Cloud TPU를 사용할 수 있는 영역에 GKE 클러스터와 노드 풀을 만들어야 합니다. 또한 GKE 클러스터를 생성한 곳과 동일한 리전에 학습 데이터와 모델을 저장할 Cloud Storage 버킷을 생성해야 합니다. 사용 가능한 영역은 다음과 같습니다.

    미국

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256GiB us-central1-a
    v2-128 128 1TiB us-central1-a
    v2-256 256 2TiB us-central1-a
    v2-512 512 4TiB us-central1-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB us-central1-a
    us-central1-b
    us-central1-f

    유럽

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB europe-west4-a
    v2-32 32 256GiB europe-west4-a
    v2-128 128 1TiB europe-west4-a
    v2-256 256 2TiB europe-west4-a
    v2-512 512 4TiB europe-west4-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB europe-west4-a
    v3-32 32 512GiB europe-west4-a
    v3-64 64 1TiB europe-west4-a
    v3-128 128 2TiB europe-west4-a
    v3-256 256 4TiB europe-west4-a
    v3-512 512 8TiB europe-west4-a
    v3-1024 1024 16TiB europe-west4-a
    v3-2048 2048 32TiB europe-west4-a

    아시아 태평양

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB asia-east1-c
  • 각 컨테이너는 최대 클라우드 TPU 한 개를 요청할 수 있지만 한 pod에 있는 여러 컨테이너는 각각 Cloud TPU를 요청할 수 있습니다.
  • Cluster Autoscaler는 GKE 1.11.4-gke.12 이상에서 Cloud TPU를 지원합니다.

데이터 및 스토리지 버킷 설정

이 가이드와 함께 제공되는 가짜 데이터 세트나 전체 ImageNet 데이터를 사용하여 모델을 학습시킬 수 있습니다. 어느 쪽이든 아래 설명대로 Cloud Storage 버킷을 설정해야 합니다.

가짜 데이터세트 또는 ImageNet 데이터세트 사용

아래 안내에서는 모델을 테스트하기 위해 임의로 생성된 가짜 데이터세트를 사용한다고 가정합니다. 또는 전체 ImageNet 데이터세트 사용 안내를 따릅니다.

가짜 데이터세트는 Cloud Storage의 다음 위치에 있습니다.

gs://cloud-tpu-test-datasets/fake_imagenet

허위 데이터세트는 Cloud TPU 사용 방법을 이해하고 엔드 투 엔드 성능의 유효성을 검사하는 용도로만 사용됩니다. 정확성 숫자와 저장된 모델은 의미가 없습니다.

Cloud Storage 버킷 만들기

머신러닝 모델의 학습 결과를 저장하려면 Cloud Storage 버킷이 필요합니다. 이 가이드와 함께 제공된 가짜 데이터세트가 아닌 실제 학습 데이터를 사용하기로 결정한 경우에는 데이터를 동일한 버킷에 저장할 수 있습니다.

  1. Cloud Console에서 Cloud Storage 페이지로 이동합니다.

    Cloud Storage 페이지로 이동

  2. 다음 옵션을 지정하여 새 버킷을 만듭니다.

    • 원하는 고유한 이름
    • 기본 스토리지 클래스: Standard
    • 위치: us-central1

    버킷 위치는 GKE 클러스터에 프로비저닝된 TPU 리소스와 같은 리전에 있어야 합니다.

Cloud TPU가 Cloud Storage 버킷에 액세스하도록 승인

Cloud TPU에 Cloud Storage 객체에 대한 읽기/쓰기 액세스 권한을 부여해야 합니다. 이렇게 하려면 Cloud TPU에서 사용하는 서비스 계정에 필수 액세스 권한을 부여해야 합니다. 가이드에 따라 스토리지 버킷에 대한 액세스 권한을 부여하세요.

GKE에서 클러스터 만들기

Cloud Console에서 또는 gcloud 명령줄 도구를 사용하여 GKE 클러스터를 만들 수 있습니다. 아래 옵션을 선택하면 관련 안내를 볼 수 있습니다.

콘솔

Cloud TPU를 지원하는 GKE 클러스터를 만들려면 다음 안내를 따르세요.

  1. Cloud Console에서 GKE 페이지로 이동합니다.

    GKE 페이지로 이동

  2. 클러스터 만들기를 클릭합니다.

  3. GKE 클러스터 페이지에서 클러스터의 이름을 지정합니다. 이름은 프로젝트와 영역 내에서 고유해야 합니다. 예를 들면 tpu-models-cluster입니다.

  4. Cloud TPU 리소스를 사용할 영역을 지정합니다. 예를 들어 us-central1-b 영역을 선택합니다.

    Cloud TPU가 제공되는 영역은 다음과 같습니다.

    미국

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256GiB us-central1-a
    v2-128 128 1TiB us-central1-a
    v2-256 256 2TiB us-central1-a
    v2-512 512 4TiB us-central1-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB us-central1-a
    us-central1-b
    us-central1-f

    유럽

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB europe-west4-a
    v2-32 32 256GiB europe-west4-a
    v2-128 128 1TiB europe-west4-a
    v2-256 256 2TiB europe-west4-a
    v2-512 512 4TiB europe-west4-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB europe-west4-a
    v3-32 32 512GiB europe-west4-a
    v3-64 64 1TiB europe-west4-a
    v3-128 128 2TiB europe-west4-a
    v3-256 256 4TiB europe-west4-a
    v3-512 512 8TiB europe-west4-a
    v3-1024 1024 16TiB europe-west4-a
    v3-2048 2048 32TiB europe-west4-a

    아시아 태평양

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB asia-east1-c
  5. 이전 단계에서 지정한 영역의 Cloud TPU 노드에 대해 충분한 할당량이 할당되었는지 확인합니다.

  6. Cloud TPU에 대한 지원을 허용하려면 클러스터 버전1.13.4-gke.5 이상으로 설정되어 있는지 확인합니다.

  7. 페이지 하단으로 스크롤하고 옵션 더보기를 클릭합니다.

  8. 액세스 범위모든 Cloud API에 대한 전체 액세스 허용으로 설정합니다. 이렇게 하면 클러스터의 모든 노드가 Cloud Storage 버킷에 액세스할 수 있습니다. 이를 위해서는 클러스터와 스토리지 버킷이 같은 프로젝트에 있어야 합니다. 포드에 기본적으로 배포되는 노드 범위가 상속됩니다. Pod 단위로 액세스를 제한하려면 GKE 가이드의 서비스 계정으로 인증을 참조하세요.

  9. 페이지 맨 아래에서 가용성, 네트워킹, 보안, 추가 기능을 클릭합니다. 그러면 같은 페이지에 창이 열립니다.

  10. VPC 네이티브(별칭 IP 사용)를 사용 설정합니다.

  11. Cloud TPU를 사용 설정합니다.

  12. 원하는 대로 클러스터의 나머지 옵션을 구성합니다. 기본값으로 그대로 두어도 됩니다.

  13. 만들기를 클릭합니다.

  14. 클러스터에 연결합니다. Console Kubernetes 클러스터 페이지에서 클러스터를 선택하고 연결 버튼을 클릭하면 됩니다. 그러면 이 새 클러스터에 kubectl을 연결하기 위해 Cloud shell에서 실행되는 gcloud 명령어가 표시됩니다.

gcloud

아래의 안내를 따라 gcloud 명령줄 도구를 사용하여 환경을 설정하고 Cloud TPU를 지원하는 GKE 클러스터를 만듭니다.

  1. Google Cloud 프로젝트를 지정합니다.

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

    여기서 YOUR-CLOUD-PROJECT는 Google Cloud 프로젝트의 이름입니다.

  2. Cloud TPU 리소스를 사용할 영역을 지정합니다. 이 예시에서는 us-central1-b 영역을 사용합니다.

    $ gcloud config set compute/zone us-central1-b
    

    Cloud TPU가 제공되는 영역은 다음과 같습니다.

    미국

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256GiB us-central1-a
    v2-128 128 1TiB us-central1-a
    v2-256 256 2TiB us-central1-a
    v2-512 512 4TiB us-central1-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB us-central1-a
    us-central1-b
    us-central1-f

    유럽

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB europe-west4-a
    v2-32 32 256GiB europe-west4-a
    v2-128 128 1TiB europe-west4-a
    v2-256 256 2TiB europe-west4-a
    v2-512 512 4TiB europe-west4-a
    TPU 유형(v3) TPU v3 코어 총 TPU 메모리 사용 가능한 영역
    v3-8 8 128GiB europe-west4-a
    v3-32 32 512GiB europe-west4-a
    v3-64 64 1TiB europe-west4-a
    v3-128 128 2TiB europe-west4-a
    v3-256 256 4TiB europe-west4-a
    v3-512 512 8TiB europe-west4-a
    v3-1024 1024 16TiB europe-west4-a
    v3-2048 2048 32TiB europe-west4-a

    아시아 태평양

    TPU 유형(v2) TPU v2 코어 총 TPU 메모리 리전/영역
    v2-8 8 64GiB asia-east1-c
  3. gcloud container clusters 명령어를 사용하여 Cloud TPU를 지원하는 GKE에서 클러스터를 만듭니다. GKE 클러스터와 해당 노드 풀은 위의 환경 변수 섹션에 설명된 대로 Cloud TPU를 사용할 수 있는 영역에 만들어야 합니다. 다음 명령어는 tpu-models-cluster 클러스터를 만듭니다.

    $ gcloud container clusters create tpu-models-cluster \
      --cluster-version=1.16 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    위의 명령어에서 각 항목의 의미는 다음과 같습니다.

    • --cluster-version=1.16은 클러스터가 최신 Kubernetes 1.16 버전을 사용할 것임을 나타냅니다. 버전 1.13.4-gke.5 이상을 사용해야 합니다.
    • --scopes=cloud-platform은 클러스터의 모든 노드가 위의 YOUR-CLOUD-PROJECT로 정의된 Google Cloud의 Cloud Storage 버킷에 액세스할 수 있도록 합니다. 이를 위해 클러스터와 저장소 버킷이 같은 프로젝트에 있어야 합니다. Pod에 기본적으로 배포되는 노드 범위가 상속됩니다. 따라서 --scopes=cloud-platform은 클러스터에서 실행중인 모든 Pod에 cloud-platform 범위를 제공합니다. Pod 단위로 액세스를 제한하려면 GKE 가이드의 서비스 계정으로 인증을 참조하세요.
    • --enable-ip-alias는 클러스터가 별칭 IP 범위를 사용함을 나타냅니다. 이는 GKE에서 Cloud TPU를 사용하는 데 필요합니다.
    • --enable-tpu는 클러스터가 Cloud TPU를 지원해야 함을 나타냅니다.

      명령어 실행이 끝나면 다음과 비슷한 확인 메시지가 나타납니다.

      kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.10.4-gke.2 35.232.204.86 n1-standard-2 1.10.4-gke.2 3 RUNNING

ResNet-50 모델 실행

이제 Cloud TPU와 GKE를 사용하여 ResNet-50 모델을 실행할 수 있는 모든 여건이 갖춰졌습니다.

  1. resnet_k8s.yaml 파일에 작업 사양을 만듭니다.

    • GitHub에서 준비된 작업 사양을 다운로드하거나 복사합니다.
    • 작업 사양에서 <my-model-bucket>을 이전에 생성한 Cloud Storage 버킷의 이름으로 변경합니다.

    작업 사양은 gcr.io/tensorflow/tpu-modelsDocker 컨테이너에서 사용할 수 있는 TensorFlow TPU 모델을 참조합니다. 이는 Container Registry의 위치입니다.

  2. GKE 클러스터에서 작업을 만듭니다.

    $ kubectl create -f resnet_k8s.yaml
    job "resnet-tpu" created
  3. 작업이 예약될 때까지 기다립니다.

    $ kubectl get pods -w
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    Cloud TPU 노드 수명은 요청한 포드에 바인딩됩니다. Cloud TPU는 포드가 예약되면 요청 시 생성되고 포드가 삭제되면 재활용됩니다.

    포드 예약이 완료되는 데 약 5분 정도 소요됩니다.

    5분이 경과하면 다음과 같은 내용이 표시됩니다.

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
  4. Pod 로그에서 작업 진행 상태를 확인합니다.

    $ kubectl logs resnet-tpu-cmvlf

    Cloud Console의 GKE 워크로드 대시보드에서 출력을 확인할 수도 있습니다.

    첫 번째 항목이 로그에 표시되는데 시간이 좀 걸립니다. 다음과 같은 내용이 표시될 수 있습니다.

    I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn.
    I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook.
    I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn.
    I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker
    I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized.
    I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op.
    I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op.
    I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system
    I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller
    I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller.
    I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller
    I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller.
    I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<my-model-bucket>/resnet/model.ckpt.
    I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061
    I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56
    I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
    
  5. gs://<my-model-bucket>/resnet/model.ckpt에서 학습된 모델을 봅니다. Cloud Console의 Cloud Storage 브라우저 페이지에서 버킷을 확인할 수 있습니다.

삭제

GKE에서 Cloud TPU 작업을 마쳤으면 Google Cloud 계정에 추가 비용이 발생하지 않도록 리소스를 삭제합니다.

콘솔

GKE 클러스터를 삭제합니다.

  1. Cloud Console에서 GKE 페이지로 이동합니다.

    GKE 페이지로 이동

  2. 삭제할 클러스터 옆에 있는 체크박스를 선택합니다.

  3. 삭제를 클릭합니다.

데이터 검토가 끝났으면 이 가이드에서 만든 Cloud Storage 버킷을 삭제합니다.

  1. Cloud Console에서 Cloud Storage 페이지로 이동합니다.

    Cloud Storage 페이지로 이동

  2. 삭제할 버킷 옆에 있는 체크박스를 선택합니다.

  3. 삭제를 클릭합니다.

무료 스토리지 한도와 기타 가격 정보는 Cloud Storage 가격 책정 가이드를 참조하세요.

gcloud

이 세션을 위한 프로젝트 및 영역을 설정하지 않았으면 지금 설정합니다. 이 설명서 앞부분의 안내를 참조하세요. 그런 다음 이 삭제 절차를 따릅니다.

  1. 다음 명령어를 실행하여 GKE 클러스터 tpu-models-cluster를 삭제하고 YOUR-PROJECT을 Google Cloud 프로젝트 이름으로 바꿉니다.

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. 데이터 검토를 마쳤으면 gsutil 명령어를 사용하여 이 가이드에서 만든 Cloud Storage 버킷을 삭제합니다. YOUR-BUCKET을 Cloud Storage 버킷 이름으로 바꿉니다.

    $ gsutil rm -r gs://YOUR-BUCKET
    

    무료 스토리지 한도와 기타 가격 정보는 Cloud Storage 가격 책정 가이드를 참조하세요.

다음 단계

  • 텐서보드의 TPU 도구를 살펴보세요.
  • 다음 작업 사양 중 하나를 사용하여 더 많은 모델 및 데이터세트 검색 작업을 실행하세요.

    • GKE에 COCO 데이터세트를 다운로드하고 사전 처리합니다.
    • GKE에 ImageNet을 다운로드하고 사전 처리합니다.
    • Cloud TPU와 GKE를 사용하여 AmoebaNet-D을 학습시킵니다.
    • Cloud TPU와 GKE를 사용하여 Inception v3을 학습시킵니다.
    • Cloud TPU와 GKE를 사용하여 RetinaNet을 학습시킵니다.
  • 추가 TPU 샘플을 사용해 시험해 보세요.