GKE에서 Cloud TPU 애플리케이션 실행

이 가이드에서는 다음 방법을 설명합니다.

TPU VM 아키텍처에 대한 자세한 내용은 시스템 아키텍처를 참조하세요. 이 가이드는 TPU 노드 아키텍처에서만 사용될 수 있습니다.

GKE에서 Cloud TPU 애플리케이션을 실행할 때의 이점

Cloud TPU 학습 애플리케이션은 GKE 포드 내의 GKE 컨테이너에서 실행되도록 구성할 수 있습니다. 이 경우 다음과 같은 이점이 있습니다.

  • 간편한 설정과 관리: GKE는 TPU 수명 주기를 관리합니다. GKE에서 Cloud TPU 초기화 및 학습을 설정하면 작업 실패 복구를 포함하여 GKE에서 학습을 보다 쉽게 반복하고 관리합니다.

  • 최적화된 비용: 작업이 활성 상태인 동안 TPU에 대해서만 비용을 지불합니다. GKE는 포드의 리소스 요구사항에 따라 자동으로 TPU를 만들고 삭제합니다.

  • 유연한 사용: 다른 하드웨어 가속기(CPU, GPU 또는 TPU)를 요청하려면 포드 사양을 조금만 변경하면 됩니다.

    kind: Pod
    metadata:
      name: example-tpu
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.6.0. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.6.0"
    spec:
      containers:
      - name: example-container
        resources:
          limits:
            cloud-tpus.google.com/v2: 8
            # See the line above for TPU, or below for CPU / GPU.
            # cpu: 2
            # nvidia.com/gpu: 1
    
  • 확장성: GKE는 간편하게 수백 개의 GKE 포드와 Cloud TPU 노드로 확장할 수 있는 API(JobDeployment)를 제공합니다.

  • 내결함성: GKE의 Job API는 TensorFlow 체크포인트 메커니즘과 함께 실행 완료(run-to-completion) 시맨틱을 제공합니다. VM 인스턴스나 Cloud TPU 노드에서 오류가 발생하면 체크포인트의 최신 상태 읽기를 사용하여 학습 작업이 자동으로 다시 실행됩니다.

Cloud TPU 및 GKE 구성 요구사항 및 제한사항

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

  • 참고: Cloud TPU는 Windows Server 노드 풀에서 지원되지 않습니다.
  • Cloud TPU를 사용할 수 있는 영역에 GKE 클러스터와 노드 풀을 만들어야 합니다. 또한 GKE 클러스터와 동일한 리전에 학습 데이터와 모델을 저장할 Cloud Storage 버킷을 만들어야 합니다. 사용 가능한 영역 목록은 유형 및 영역 문서를 참조하세요.
  • 각 컨테이너는 최대 클라우드 TPU 한 개를 요청할 수 있지만 한 포드에 있는 여러 컨테이너는 각각 Cloud TPU를 요청할 수 있습니다.

시작하기 전에

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

    프로젝트 선택기로 이동

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

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

    프로젝트 선택기로 이동

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

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

  7. 콘솔에서 다음 API를 사용 설정합니다.

Cloud TPU 지원으로 새 클러스터 만들기

다음 안내를 따라 환경을 설정하고 gcloud CLI를 사용하여 Cloud TPU 지원으로 GKE 클러스터를 만듭니다.

  1. Cloud TPU와 함께 GKE를 실행하는 데 필요한 gcloud 구성요소를 설치합니다.

    $ gcloud components install kubectl 
  2. Google Cloud 프로젝트 ID를 사용하여 gcloud를 구성합니다.

    $ gcloud config set project project-name
    

    project-name을 Google Cloud 프로젝트의 이름으로 바꿉니다.

    새 Cloud Shell VM에서 이 명령어를 처음 실행하면 Authorize Cloud Shell 페이지가 표시됩니다. 페이지 하단에서 Authorize를 클릭하면 gcloud에서 사용자 인증 정보로 GCP API 호출을 수행할 수 있습니다.

  3. Cloud TPU 리소스를 사용할 영역을 사용하여 gcloud를 구성합니다. 이 예시에서는 us-central1-b를 사용하지만 지원되는 모든 영역에서 TPU를 사용할 수 있습니다.

    $ gcloud config set compute/zone us-central1-b
    
  4. gcloud container clusters create 명령어를 사용하여 Cloud TPU를 지원하는 GKE에서 클러스터를 만듭니다.

    $ gcloud container clusters create cluster-name \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    명령어 플래그 설명

    release-channel
    출시 채널은 클러스터의 자동 업그레이드를 관리할 수 있는 방법을 제공합니다. 새 클러스터를 만들 때 출시 채널을 선택할 수 있습니다. 클러스터는 해당 채널에서 제공되는 버전으로만 업그레이드됩니다.
    scopes
    클러스터의 모든 노드가 Cloud Storage 버킷에 액세스할 수 있도록 보장합니다. 이를 위해서는 클러스터와 스토리지 버킷이 같은 프로젝트에 있어야 합니다. 기본적으로 Kubernetes 포드는 배포되는 노드 범위를 상속합니다. 따라서 scopes=cloud-platform은 클러스터에서 실행 중인 모든 Kubernetes 포드에 cloud-platform 범위를 제공합니다. 포드 단위로 액세스를 제한하려면 GKE 가이드의 서비스 계정으로 인증을 참조하세요.
    enable-ip-alias
    클러스터가 별칭 IP 범위를 사용하고 있음을 나타냅니다. 이는 GKE에서 Cloud TPU를 사용하는 데 필요합니다.
    enable-tpu
    클러스터가 Cloud TPU를 지원해야 함을 나타냅니다.
    tpu-ipv4-cidr(선택사항, 위에서는 지정되지 않음)
    Cloud TPU에 사용할 CIDR 범위를 나타냅니다. IP_RANGEIP/20 양식으로 지정합니다(예: 10.100.0.0/20). 이 플래그를 지정하지 않으면 /20 크기의 CIDR 범위가 자동으로 할당되고 지정됩니다.

클러스터가 생성되면 다음과 유사한 메시지가 표시됩니다.

NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
cluster-name  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING

Kubernetes 포드 사양에서 Cloud TPU 요청

Kubernetes 포드 사양에서 다음을 수행합니다.

  • 같은 TensorFlow 버전을 사용하여 컨테이너에 모델을 빌드해야 합니다. 지원되는 버전을 참조하세요.

  • 컨테이너 사양에 있는 resource 필드의 limits 섹션에서 Cloud TPU 리소스를 지정합니다.

    Cloud TPU 리소스 단위는 Cloud TPU 코어 수입니다. 다음 표에는 유효한 리소스 요청 예시가 나와 있습니다. 유효한 TPU 리소스의 전체 목록은 TPU 유형 및 영역을 참조하세요.

    사용할 리소스가 Cloud TPU Pod인 경우에는 Cloud TPU Pod의 기본 할당량이 0이므로 할당량을 요청하세요.

    리소스 요청 Cloud TPU 유형
    cloud-tpus.google.com/v2: 8 Cloud TPU v2 기기(코어 8개)
    cloud-tpus.google.com/preemptible-v2: 8 선점형 Cloud TPU v2 기기(코어 8개)
    cloud-tpus.google.com/v3: 8 Cloud TPU v3 기기(코어 8개)
    cloud-tpus.google.com/preemptible-v3: 8 선점형 Cloud TPU v3 기기(코어 8개)
    cloud-tpus.google.com/v2: 32 v2-32 Cloud TPU Pod(코어 32개)
    cloud-tpus.google.com/v3: 32 v3-32 Cloud TPU Pod(코어 32개)

    포드 사양에서 리소스 및 제한을 지정하는 방법에 대한 자세한 내용은 Kubernetes 문서를 참조하세요.

다음에 표시된 샘플 포드 사양은 TensorFlow 2.6.0을 사용하는 선점형 Cloud TPU v2-8 TPU 하나를 요청합니다.

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

apiVersion: v1
kind: Pod
metadata:
  name: gke-tpu-pod
  annotations:
     # The Cloud TPUs that will be created for this Job will support
     # TensorFlow 2.6.0. This version MUST match the
     # TensorFlow version that your model is built on.
     tf-version.cloud-tpus.google.com: "2.6.0"
spec:
  restartPolicy: Never
  containers:
  - name: gke-tpu-container
    # The official TensorFlow 2.6.0 image.
    # https://hub.docker.com/r/tensorflow/tensorflow
    image: tensorflow/tensorflow:2.6.0
    command:
    - python
    - -c
    - |
      import tensorflow as tf
      print("Tensorflow version " + tf.__version__)

      tpu = tf.distribute.cluster_resolver.TPUClusterResolver('$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS)')
      print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])

      tf.config.experimental_connect_to_cluster(tpu)
      tf.tpu.experimental.initialize_tpu_system(tpu)
      strategy = tf.distribute.TPUStrategy(tpu)

      @tf.function
      def add_fn(x,y):
          z = x + y
          return z

      x = tf.constant(1.)
      y = tf.constant(1.)
      z = strategy.run(add_fn, args=(x,y))
      print(z)
    resources:
      limits:
        # Request a single Preemptible v2-8 Cloud TPU device to train the model.
        cloud-tpus.google.com/preemptible-v2: 8

작업 만들기

GKE 클러스터에서 작업을 만들고 kubectl을 설치하려면 다음 단계를 따르세요.

  1. 텍스트 편집기를 사용하여 포드 사양 example-job.yaml을 만들고 복사하여 위에 표시된 포드 사양에 붙여넣습니다.

  2. 작업을 실행합니다.

    $ kubectl create -f example-job.yaml
    
    pod "gke-tpu-pod" created

    이 명령어는 포드를 자동으로 예약하는 작업을 만듭니다.

  3. GKE 포드가 예약되었고 Cloud TPU 노드가 프로비저닝되었는지 확인합니다. Cloud TPU 노드를 요청하는 GKE 포드가 실행되기 전에 5분 동안 대기중일 수 있습니다. GKE 포드가 예약될 때까지 다음과 비슷한 출력이 표시됩니다.

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

    약 5분 후에 다음과 같은 내용이 표시됩니다.

    NAME          READY     STATUS              RESTARTS   AGE
    gke-tpu-pod   0/1       Pending             0          21s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       ContainerCreating   0          2m18s
    gke-tpu-pod   1/1       Running             0          2m48s
    gke-tpu-pod   0/1       Completed           0          3m8s
    

    'kubectl get' 명령어를 종료하려면 Ctrl-C를 사용해야 합니다.

    다음 kubectl 명령어를 사용하여 각 GKE 포드에 대한 로그 정보를 인쇄하고 자세한 정보를 검색할 수 있습니다. 예를 들어 GKE 포드의 로그 출력을 확인하려면 다음을 사용합니다.

    $ kubectl logs gke-tpu-pod
    다음과 비슷한 출력이 표시됩니다.
    2021-09-24 18:55:25.400699: I tensorflow/core/platform/cpu_feature_guard.cc:142]
    This TensorFlow binary is optimized with oneAPI Deep Neural Network Library
    (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
    To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
    2021-09-24 18:55:25.405947: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:25.406058: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.091729: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:28.091896: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.092579: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:427]
    Started server with target: grpc://localhost:32769
    Tensorflow version 2.6.0
    Running on TPU  ['10.0.16.2:8470']
    PerReplica:{
      0: tf.Tensor(2.0, shape=(), dtype=float32),
      1: tf.Tensor(2.0, shape=(), dtype=float32),
      2: tf.Tensor(2.0, shape=(), dtype=float32),
      3: tf.Tensor(2.0, shape=(), dtype=float32),
      4: tf.Tensor(2.0, shape=(), dtype=float32),
      5: tf.Tensor(2.0, shape=(), dtype=float32),
      6: tf.Tensor(2.0, shape=(), dtype=float32),
      7: tf.Tensor(2.0, shape=(), dtype=float32)
    }
    

    GKE 포드에 대한 자세한 설명을 보려면 다음을 사용합니다.

    $ kubectl describe pod gke-tpu-pod
    

    자세한 내용은 애플리케이션 점검 및 디버깅을 참조하세요.

Docker 이미지에서 모델 빌드 및 컨테이너화

이 프로세스에 대한 자세한 내용은 자체 모델 빌드 및 컨테이너화를 참조하세요.

기존 클러스터에서 Cloud TPU 지원 사용 설정

기존 GKE 클러스터에서 Cloud TPU 지원을 사용 설정하려면 Google Cloud CLI에서 다음 단계를 수행합니다.

  1. Cloud TPU 지원 사용 설정:

    gcloud beta container clusters update cluster-name --enable-tpu
    

    cluster-name을 클러스터 이름으로 바꿉니다.

  2. kubeconfig 항목을 업데이트합니다.

    gcloud container clusters get-credentials cluster-name
    

커스텀 CIDR 범위 설정

기본적으로 GKE는 클러스터가 프로비저닝한 TPU에 /20 크기의 CIDR 블록을 할당합니다. 다음 명령어를 실행하여 Cloud TPU의 커스텀 CIDR 범위를 지정할 수 있습니다.

gcloud beta container clusters update cluster-name \
  --enable-tpu \
  --tpu-ipv4-cidr 10.100.0.0/20

다음을 바꿉니다.

  • cluster-name: 기존 클러스터의 이름입니다.
  • 10.100.0.0/20: 커스텀 CIDR 범위입니다.

공유 VPC에서 기존 CIDR 범위 사용

이 섹션은 공유 VPC 네트워크에서 클러스터를 배포하고 기존 CIDR 범위를 사용해야 하는 사용자를 대상으로 합니다. 사용 사례가 아니면 이 섹션을 건너뛰세요.

다음 명령어는 기존 CIDR 범위를 사용하여 클러스터를 만드는 방법을 보여줍니다.

gcloud beta container clusters create cluster-name \
  --enable-tpu \
  --project TENANT_PROJECT \
  --zone=us-ZONE \
  --enable-ip-alias \
  --network projects/HOST_PROJECT/global/networks/HOST_NETWORK \
  --subnetwork projects/HOST_PROJECT/regions/REGION/subnetworks/SUBNETWORK \
  --services-secondary-range-name SERVICES_SECONDARY_RANGE \
  --enable-tpu \
  --enable-tpu-service-networking

다음을 바꿉니다.

  • cluster-name: 기존 클러스터의 이름입니다.
  • TENANT_PROJECT: 프로젝트 이름입니다.
  • HOST_PROJECT: 호스트 프로젝트 이름입니다.
  • HOST_NETWORK: 정규화된 호스트 네트워크 이름입니다.
  • HOST_PROJECT: 정규화된 서브네트워크 이름입니다.
  • SERVICES_SECONDARY_RANGE: 기존 서비스 네트워킹 범위입니다.

이러한 플래그에 대한 자세한 내용은 gcloud beta container clusters create 명령어 참조 가이드를 참조하세요.

클러스터에서 Cloud TPU 사용 중지

기존 GKE 클러스터에서 Cloud TPU 지원을 중지하려면 Google Cloud CLI에서 다음 단계를 수행합니다.

  1. Cloud TPU를 사용 중인 워크로드가 없는지 확인합니다.

    $ kubectl get tpu
    
  2. 클러스터에서 Cloud TPU 지원을 사용 중지합니다.

    $ gcloud beta container clusters update cluster-name --no-enable-tpu
    

    cluster-name을 클러스터 이름으로 바꿉니다.

    이 작업은 영역 클러스터의 경우 약 5분이 소요되며, 리전 클러스터의 경우 클러스터의 리전에 따라 약 15분이 소요됩니다.

  3. 작업이 오류 없이 완료되면 클러스터에서 프로비저닝된 TPU가 제거되었는지 확인할 수 있습니다.

    $ gcloud compute tpus list
    

    Cloud TPU에서 만든 TPU 이름의 형식은 다음과 같습니다.

    $ gke-cluster-name-cluster-id-tpu-tpu-id
    

    다음을 바꿉니다.

    • cluster-name: 기존 클러스터의 이름입니다.
    • cluster-id: 기존 클러스터의 ID입니다.
    • tpu-id: Cloud TPU의 ID입니다.

    TPU가 표시되면 다음을 실행하여 수동으로 삭제할 수 있습니다.

    $ gcloud compute tpus delete gke-cluster-name-cluster-id-tpu-tpu-id
    

삭제

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

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

  1. GKE 클러스터를 삭제하려면 다음 명령어를 실행합니다. 이때 cluster-name를 클러스터 이름으로 바꾸고 project-name`을 Google Cloud 프로젝트 이름으로 바꿉니다.

    $ gcloud container clusters delete cluster-name \
    --project=project-name --zone=us-central1-b
    
  2. 데이터 검토를 마쳤으면 gsutil 명령어를 사용하여 생성된 Cloud Storage 버킷을 삭제합니다. bucket-name을 Cloud Storage 버킷 이름으로 바꿉니다.

    $ gsutil rm -r gs://bucket-name