GKE Standard에 TPU 워크로드 배포


이 페이지에서는 Google Kubernetes Engine(GKE)에서 Cloud TPU 가속기(TPU)를 사용하는 워크로드를 요청하고 배포하는 방법을 보여줍니다.

GKE에서 TPU 워크로드를 구성하고 배포하기 전에 다음 개념을 잘 알고 있어야 합니다.

  1. Cloud TPU 소개
  2. Cloud TPU 시스템 아키텍처
  3. GKE의 TPU 정보

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

GKE의 TPU 가용성

GKE를 사용하여 TPU로 노드 풀을 만들고 관리합니다. 이러한 맞춤형 가속기를 사용하여 대규모 AI 모델 학습, 조정, 추론을 수행할 수 있습니다.

GKE에서 지원되는 TPU 버전 목록을 참조하세요.

TPU 구성 계획

머신러닝 모델과 필요한 메모리 양을 기반으로 TPU 구성을 계획합니다. 다음은 TPU 구성을 계획할 때 관련된 단계입니다.

  1. TPU 버전 및 토폴로지 선택
  2. 사용할 노드 풀 유형 선택

주문형 또는 Spot VM의 할당량이 충분한지 확인

주문형 또는 스팟 VM으로 TPU 노드 풀을 만드는 경우 사용하려는 리전에서 사용 가능한 TPU 할당량이 충분해야 합니다.

TPU 예약을 소비하는 TPU 노드 풀을 만드는 경우에는 TPU 할당량이 필요하지 않습니다.1 예약된 TPU의 경우 이 섹션을 건너뛰어도 무방합니다.

GKE에서 주문형 또는 Spot TPU 노드 풀을 만들려면 Compute Engine API 할당량이 필요합니다. Compute Engine API 할당량(compute.googleapis.com)은 Cloud TPU API로 TPU를 만들 때 필요한 Cloud TPU API 할당량(tpu.googleapis.com)과 다릅니다.

TPU용 Compute Engine API 할당량의 한도 및 현재 사용량을 확인하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔의 할당량 페이지로 이동합니다.

    할당량으로 이동

  2. 필터 상자에서 다음을 수행합니다,

    1. 서비스 속성을 선택하고 Compute Engine API를 입력한 다음 Enter 키를 누릅니다.

    2. 유형 속성을 선택하고 할당량을 선택합니다.

    3. 이름 속성을 선택하고 TPU 버전 및 머신 유형에 따라 할당량 이름을 입력합니다. 예를 들어 머신 유형이 ct5lp-로 시작하는 주문형 TPU v5e 노드를 만들려면 TPU v5 Lite PodSlice chips를 입력합니다.

      TPU 버전 머신 유형이 다음으로 시작함 온디맨드 인스턴스의 할당량 이름 Spot2 인스턴스의 할당량 이름
      TPU v4 ct4p- TPU v4 PodSlice chips Preemptible TPU v4 PodSlice chips
      TPU v5e ct5l- TPU v5 Lite Device chips Preemptible TPU v5 Lite Device chips
      TPU v5e ct5lp- TPU v5 Lite PodSlice chips Preemptible TPU v5 Lite PodSlice chips
      TPU v5p ct5p- TPU v5p chips Preemptible TPU v5p chips

    4. 측정기준(예: 위치) 속성을 선택하고 region:을 입력한 다음 GKE에서 TPU를 생성할 리전의 이름을 입력합니다. 예를 들어 us-west4-a 영역에 TPU 노드를 만들려면 region:us-west4를 입력합니다. TPU 할당량은 리전 기준이므로 동일한 리전 내의 모든 영역에서 동일한 TPU 할당량을 사용합니다.

입력한 필터와 일치하는 할당량이 없으면 원하는 리전에 대해 지정된 할당량이 프로젝트에 부여되지 않으므로 TPU 할당량 상향을 요청해야 합니다.

  1. TPU 노드 풀을 만들 때는 --reservation--reservation-affinity=specific 플래그를 사용하여 예약 인스턴스를 만듭니다. TPU 예약은 약정을 구매할 때 사용할 수 있습니다.

  2. TPU 노드 풀을 만들 때는 --spot 플래그를 사용하여 Spot 인스턴스를 만듭니다.

예약 가용성 확인

예약된 TPU 노드 풀, 즉 예약을 소비하는 TPU 노드 풀을 만드는 경우에는 TPU 할당량이 필요하지 않습니다. 하지만 노드 풀이 생성될 때 예약에 사용 가능하거나 사용되지 않는 칩이 충분해야 합니다.

프로젝트 내에 존재하는 예약을 보려면 예약 목록을 확인합니다.

TPU 예약 내에서 사용 가능한 칩 수를 확인하려면 예약 세부정보를 확인합니다.

클러스터 만들기

사용 가능한 TPU가 있는 리전에서 표준 모드로 GKE 클러스터를 만듭니다. Kubernetes 제어 영역의 고가용성을 제공하는 리전 클러스터를 사용하는 것이 좋습니다. Google Cloud CLI 또는 Google Cloud 콘솔을 사용할 수 있습니다.

gcloud container clusters create CLUSTER_NAME \
  --location LOCATION \
  --cluster-version VERSION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • LOCATION: TPU 용량을 사용할 수 있는 리전입니다.
  • VERSION: 사용하려는 머신 유형을 지원해야 하는 GKE 버전입니다. 기본 GKE 버전은 대상 TPU에 대한 가용성이 없을 수 있습니다. TPU 머신 유형에 사용 가능한 최소 GKE 버전을 알아보려면 GKE의 TPU 가용성을 참조하세요.

노드 풀 만들기

단일 호스트 TPU 슬라이스

Google Cloud CLI, Terraform 또는 Google Cloud 콘솔을 사용하여 단일 호스트 TPU 슬라이스 노드 풀을 만들 수 있습니다.

gcloud

gcloud container node-pools create POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_ZONES \
    --machine-type=MACHINE_TYPE \
    [--num-nodes=NUM_NODES \]
    [--spot \]
    [--enable-autoscaling \]
    [--reservation-affinity=specific \
    --reservation=RESERVATION_NAME \]
    [--total-min-nodes TOTAL_MIN_NODES \]
    [--total-max-nodes TOTAL_MAX_NODES \]
    [--location-policy=ANY]

다음을 바꿉니다.

  • POOL_NAME: 새 노드 풀의 이름.
  • LOCATION: 사용할 TPU 버전에 따른 영역의 이름

    • TPU v4의 경우 us-central2-b를 사용합니다.
    • ct5l-로 시작하는 TPU v5e 머신 유형의 경우 us-central1-a 또는 europe-west4-b를 사용합니다.
    • ct5lp-로 시작하는 TPU v5e 머신 유형의 경우 us-west1-c, us-west4-a, us-west4-b, us-central1-a, us-east1-c, us-east5-b, europe-west4-a를 사용합니다.
    • TPU v5p의 경우 us-east1-d, us-east5-a 또는 us-east5-c를 사용합니다.

    자세한 내용은 GKE의 TPU 가용성을 참조하세요.

  • CLUSTER_NAME: 클러스터의 이름

  • NODE_ZONE: GKE가 노드 풀을 만드는 하나 이상의 영역 쉼표로 구분된 목록

  • MACHINE_TYPE: 노드에 사용할 머신 유형. TPU 호환 머신 유형에 대한 자세한 내용은 TPU 구성 매핑의 표를 사용하세요.

선택적으로 다음 플래그를 사용할 수도 있습니다.

  • NUM_NODES: 각 영역의 노드 풀에 있는 초기 노드 수. 이 플래그를 생략하면 기본값은 3입니다. --enable-autoscaling 플래그를 사용하여 노드 풀에 자동 확장이 사용 설정된 경우 자동 확장 처리는 워크로드에서 요구하는 즉시 추가 노드를 프로비저닝하므로 NUM_NODES0으로 설정하는 것이 좋습니다. .
  • RESERVATION_NAME: 노드 풀을 만들 때 GKE가 사용하는 예약의 이름. 이 플래그를 생략하면 GKE가 사용 가능한 TPU를 사용합니다. TPU 예약에 대한 자세한 내용은 TPU 예약을 참조하세요.
  • --enable-autoscaling: 자동 확장이 사용 설정된 노드 풀을 만듭니다.
    • TOTAL_MIN_NODES: 노드 풀에 있는 모든 노드의 최소 수. 자동 확장도 지정하지 않는 한 이 필드를 생략합니다.
    • TOTAL_MAX_NODES: 노드 풀에 있는 모든 노드의 최대 수. 자동 확장도 지정하지 않는 한 이 필드를 생략합니다.
  • --spot: 노드 풀의 노드에 Spot VM을 사용하도록 노드 풀을 설정합니다. 노드 풀을 만든 후에는 변경할 수 없습니다.

Terraform

  1. google 제공업체 버전 4.84.0 이상을 사용해야 합니다.
  2. Terraform 구성에 다음 블록을 추가합니다.
resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
  provider           = google
  project            = PROJECT_ID
  cluster            = CLUSTER_NAME
  name               = POOL_NAME
  location           = CLUSTER_LOCATION
  node_locations     = [NODE_ZONES]
  initial_node_count = NUM_NODES
  autoscaling {
    total_min_node_count = TOTAL_MIN_NODES
    total_max_node_count = TOTAL_MAX_NODES
    location_policy      = "ANY"
  }

  node_config {
    machine_type = MACHINE_TYPE
    reservation_affinity {
      consume_reservation_type = "SPECIFIC_RESERVATION"
      key = "compute.googleapis.com/reservation-name"
      values = [RESERVATION_LABEL_VALUES]
    }
    spot = true
  }
}

다음을 바꿉니다.

  • NODE_POOL_RESOURCE_NAME: Terraform 템플릿의 노드 풀 리소스 이름
  • PROJECT_ID: 프로젝트 ID
  • CLUSTER_NAME: 기존 클러스터의 이름
  • POOL_NAME: 만들 노드 풀의 이름
  • CLUSTER_LOCATION: 클러스터의 컴퓨팅 영역. TPU 버전을 사용할 수 있는 리전을 지정합니다. 자세한 내용은 TPU 버전 및 토폴로지 선택을 참조하세요.
  • NODE_ZONES: GKE가 노드 풀을 만드는 하나 이상의 영역을 쉼표로 구분한 목록
  • NUM_NODES: 각 노드 풀의 영역에 있는 노드 풀의 초기 노드 수. 생략할 경우 기본값은 3입니다. 자동 확장 템플릿을 사용하여 노드 풀에 대해 자동 확장이 사용 설정된 경우 워크로드에서 요구하는 즉시 GKE에서 추가 TPU 노드를 프로비저닝하므로 NUM_NODES0으로 설정하는 것이 좋습니다.
  • MACHINE_TYPE: 사용할 TPU 머신 유형. TPU 호환 머신 유형을 보려면 TPU 구성 매핑의 표를 사용하세요.

선택적으로 다음 변수를 사용할 수도 있습니다.

  • autoscaling: 자동 확장이 사용 설정된 노드 풀을 만듭니다. 단일 호스트 TPU 슬라이스의 경우 GKE는 TOTAL_MIN_NODESTOTAL_MAX_NODES 값 사이에서 확장됩니다.
    • TOTAL_MIN_NODES: 노드 풀에 있는 모든 노드의 최소 수. 자동 확장도 지정하지 않는 한 이 필드는 선택사항입니다.
    • TOTAL_MAX_NODES: 노드 풀에 있는 모든 노드의 최대 수. 자동 확장도 지정하지 않는 한 이 필드는 선택사항입니다.
  • RESERVATION_NAME: TPU 예약을 사용하는 경우 노드 풀을 만들 때 사용할 예약 리소스의 라벨 목록. reservation_affinity 필드에 RESERVATION_LABEL_VALUES를 채우는 방법에 대한 자세한 내용은 Terraform 제공업체를 참조하세요.
  • spot: TPU 노드에 Spot VM을 사용하도록 노드 풀을 설정합니다. 노드 풀을 만든 후에는 변경할 수 없습니다. 자세한 내용은 스팟 VM을 참조하세요.

콘솔

TPU가 포함된 노드 풀을 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 노드 풀 추가를 클릭합니다.

  4. 노드 풀 세부정보 섹션에서 노드 위치 지정 체크박스를 선택합니다.

  5. 사용할 TPU 버전에 따라 영역을 선택합니다.

    • TPU v4의 경우 us-central2-b를 사용합니다.
    • ct5l-로 시작하는 TPU v5e 머신 유형의 경우 us-central1-a 또는 europe-west4-b를 사용합니다.
    • ct5lp-로 시작하는 TPU v5e 머신 유형의 경우 us-west1-c, us-west4-a, us-west4-b, us-central1-a, us-east1-c, us-east5-b, europe-west4-a를 사용합니다.
    • TPU v5p의 경우 us-east1-d, us-east5-a 또는 us-east5-c를 사용합니다.
  6. 탐색창에서 노드를 클릭합니다.

  7. 머신 구성 섹션에서 TPU를 선택합니다.

  8. 시리즈 드롭다운 메뉴에서 다음 중 하나를 선택합니다.

    • CT4P: TPU v4
    • CT5LP: TPU v5e
    • CT5P: TPU v5p
  9. 머신 유형 드롭다운 메뉴에서 노드에 사용할 머신 이름을 선택합니다. TPU 구성 매핑 표를 사용하여 단일 호스트 TPU 노드 풀을 만드는 머신 유형 및 TPU 토폴로지를 정의하는 방법을 알아보세요.

  10. TPU 토폴로지 드롭다운 메뉴에서 TPU 슬라이스의 물리적 토폴로지를 선택합니다.

  11. 필요한 변경사항 대화상자에서 변경을 클릭합니다.

  12. 부팅 디스크 유형표준 영구 디스크 또는 SSD 영구 디스크인지 확인합니다.

  13. 선택적으로 노드 풀의 노드에 Spot VM을 사용하려면 스팟 VM에서 노드 사용 설정 체크박스를 선택합니다.

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

멀티 호스트 TPU 슬라이스

Google Cloud CLI, Terraform 또는 Google Cloud 콘솔을 사용하여 멀티 호스트 TPU 슬라이스 노드 풀을 만들 수 있습니다.

gcloud

gcloud container node-pools create POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_ZONE \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    [--spot \]
    [--enable-autoscaling \
      --max-nodes MAX_NODES]
    [--reservation-affinity=specific \
    --reservation=RESERVATION_NAME]

다음을 바꿉니다.

  • POOL_NAME: 새 노드 풀의 이름.
  • LOCATION: 사용할 TPU 버전에 따른 영역의 이름

    • TPU v4의 경우 us-central2-b를 사용합니다.
    • ct5l-로 시작하는 TPU v5e 머신 유형은 멀티 호스트가 아닙니다.
    • ct5lp-로 시작하는 TPU v5e 머신 유형의 경우 us-west1-c, us-west4-a, us-west4-b, us-central1-a, us-east1-c, us-east5-b, europe-west4-a를 사용합니다.
    • ct5p-로 시작하는 TPU v5p 머신 유형의 경우 us-east1-d, us-east5-a, us-east5-c를 사용합니다.

    자세한 내용은 GKE의 TPU 가용성을 참조하세요.

  • CLUSTER_NAME: 클러스터의 이름

  • NODE_ZONE: GKE가 노드 풀을 만드는 하나 이상의 영역 쉼표로 구분된 목록

  • MACHINE_TYPE: 노드에 사용할 머신 유형. 사용 가능한 머신 유형에 대해 자세히 알아보려면 TPU 구성 매핑을 참조하세요.

  • TPU_TOPOLOGY: TPU 슬라이스의 물리적 토폴로지. 토폴로지 형식은 다음과 같이 TPU 버전에 따라 달라집니다.

    • TPU v4 또는 v5p: 3-튜플({A}x{B}x{C})로 토폴로지를 정의합니다(예: 4x4x4).
    • TPU v5e: 2-튜플({A}x{B})로 토폴로지를 정의합니다(예: 2x2).

    자세한 내용은 토폴로지를 참조하세요.

  • NUM_NODES: 노드 풀의 노드 수. 0이거나, TPU_TOPOLOGY에 정의된 값의 곱({A}x{B}x{C})을 각 VM의 칩 수로 나눈 값이어야 합니다. 멀티 호스트 TPU v4 및 TPU v5e의 경우 각 VM의 칩 수는 4개입니다. 따라서 TPU_TOPOLOGY2x4x4(각 VM에 4개의 칩이 포함된 TPU v4)인 경우 NUM_NODES는 8과 동일한 32/4입니다.

선택적으로 다음 플래그를 사용할 수도 있습니다.

  • RESERVATION_NAME: 노드 풀을 만들 때 GKE가 사용하는 예약의 이름. 이 플래그를 생략하면 GKE가 사용 가능한 TPU 노드 풀을 사용합니다. TPU 예약에 대한 자세한 내용은 TPU 예약을 참조하세요.
  • --spot: TPU 노드에 Spot VM을 사용하도록 노드 풀을 설정합니다. 노드 풀을 만든 후에는 변경할 수 없습니다. 자세한 내용은 스팟 VM을 참조하세요.
  • --enable-autoscaling: 자동 확장이 사용 설정된 노드 풀을 만듭니다. GKE는 멀티 호스트 TPU 슬라이스 노드 풀을 확장할 때 노드 풀을 0에서 최대 크기로 원자적으로 수직 확장합니다.
    • MAX_NODES: 노드 풀의 최대 크기입니다. --enable-autoscaling이 제공되는 경우 --max-nodes 플래그가 필요하며 TPU_TOPOLOGY({A}x{B}x{C})에 정의된 값의 곱을 각 VM의 칩 수로 나눈 값과 같아야 합니다.

Terraform

  1. google 제공업체 버전 4.84.0 이상을 사용해야 합니다.
  2. Terraform 구성에 다음 블록을 추가합니다.

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        spot = true
      }
    
      placement_policy {
        type = "COMPACT"
        tpu_topology = TPU_TOPOLOGY
      }
    }
    

    다음을 바꿉니다.

    • NODE_POOL_RESOURCE_NAME: Terraform 템플릿의 노드 풀 리소스 이름
    • PROJECT_ID: 프로젝트 ID
    • CLUSTER_NAME: 노드 풀을 추가할 기존 클러스터의 이름
    • POOL_NAME: 만들 노드 풀의 이름
    • CLUSTER_LOCATION: 클러스터의 컴퓨팅 위치. Kubernetes 제어 영역의 신뢰성 향상을 위해 리전 클러스터를 사용하는 것이 좋습니다. 영역 클러스터를 사용할 수도 있습니다. 자세한 내용은 TPU 버전 및 토폴로지 선택을 참조하세요.
    • NODE_ZONES: GKE가 노드 풀을 만드는 하나 이상의 영역을 쉼표로 구분한 목록
    • NUM_NODES: 노드 풀의 노드 수. 0이거나, TPU 칩 수의 곱을 4(멀티 호스트 TPU 슬라이스에서 각 TPU 노드의 칩 수)로 나눈 값이어야 합니다. 예를 들어 TPU_TOPOLOGY4x8이면 칩이 32개 있으므로 NUM_NODES는 8이어야 합니다. TPU 토폴로지에 대한 자세한 내용은 TPU 구성 매핑의 표를 참조하세요.
    • TPU_TOPOLOGY: TPU 슬라이스에 대해 원하는 물리적 토폴로지를 나타냅니다. 토폴로지 형식은 사용 중인 TPU 버전에 따라 달라집니다.
      • TPU v4의 경우: 3-튜플({A}x{B}x{C})로 토폴로지를 정의합니다(예: 4x4x4).
      • TPU v5e: 2-튜플({A}x{B})로 토폴로지를 정의합니다(예: 2x2).

    선택적으로 다음 변수를 사용할 수도 있습니다.

    • RESERVATION_NAME: TPU 예약을 사용하는 경우 노드 풀을 만들 때 사용할 예약 리소스의 라벨 목록입니다. reservation_affinity 필드에 RESERVATION_LABEL_VALUES를 채우는 방법에 대한 자세한 내용은 Terraform 제공업체를 참조하세요.
    • autoscaling: 자동 확장이 사용 설정된 노드 풀을 만듭니다. GKE는 멀티 호스트 TPU 슬라이스 노드 풀을 확장할 때 노드 풀을 0에서 최대 크기로 원자적으로 수직 확장합니다.
      • MAX_NODES: 노드 풀의 최대 크기입니다. TPU_TOPOLOGY에 정의된 값의 곱({A}x{B}x{C})을 각 VM의 칩 수로 나눈 값이어야 합니다.
    • spot: TPU 노드에 Spot VM을 사용하도록 노드 풀을 설정합니다. 노드 풀을 만든 후에는 변경할 수 없습니다. 자세한 내용은 스팟 VM을 참조하세요.

콘솔

TPU가 포함된 노드 풀을 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 노드 풀 추가를 클릭합니다.

  4. 노드 풀 세부정보 섹션에서 노드 위치 지정 체크박스를 선택합니다.

  5. 사용할 TPU 버전에 따라 영역을 선택합니다.

    • TPU v4의 경우 us-central2-b를 사용합니다.
    • ct5l-로 시작하는 TPU v5e 머신 유형은 멀티 호스트가 아닙니다.
    • ct5lp-로 시작하는 TPU v5e 머신 유형의 경우 us-west1-c, us-west4-a, us-west4-b, us-central1-a, us-east1-c, us-east5-b, europe-west4-a를 사용합니다.
    • ct5p-로 시작하는 TPU v5p 머신 유형의 경우 us-east1-d, us-east5-a, us-east5-c를 사용합니다.
  6. 탐색창에서 노드를 클릭합니다.

  7. 머신 구성 섹션에서 TPU를 선택합니다.

  8. 시리즈 드롭다운 메뉴에서 다음 중 하나를 선택합니다.

    • CT4P: TPU v4의 경우에 선택합니다.
    • CT5LP: TPU v5e의 경우에 선택합니다.
  9. 머신 유형 드롭다운 메뉴에서 노드에 사용할 머신 이름을 선택합니다. TPU 구성 매핑 테이블을 사용해서 멀티 호스트 TPU 노드 풀을 만드는 머신 유형 및 TPU 토폴로지를 정의하는 방법을 알아봅니다.

  10. TPU 토폴로지 드롭다운 메뉴에서 TPU 슬라이스의 물리적 토폴로지를 선택합니다.

  11. 필요한 변경사항 대화상자에서 변경을 클릭합니다.

  12. 부팅 디스크 유형표준 영구 디스크 또는 SSD 영구 디스크인지 확인합니다.

  13. 선택적으로 노드 풀의 노드에 Spot VM을 사용하려면 스팟 VM에서 노드 사용 설정 체크박스를 선택합니다.

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

프로비저닝 상태

GKE가 사용 가능한 TPU 용량 부족으로 인해 TPU 슬라이스 노드 풀을 만들 수 없으면 GKE에서 용량 부족으로 인해 TPU 노드를 만들 수 없다는 오류 메시지가 반환됩니다.

단일 호스트 TPU 슬라이스 노드 풀을 만드는 경우 다음과 비슷한 오류 메시지가 표시됩니다.

2 nodes cannot be created due to lack of capacity. The missing nodes will be
created asynchronously once capacity is available. You can either wait for the
nodes to be up, or delete the node pool and try re-creating it again later.

멀티 호스트 TPU 슬라이스 노드 풀을 만드는 경우 다음과 비슷한 오류 메시지가 표시됩니다.

The nodes (managed by ...) cannot be created now due to lack of capacity. They
will be created asynchronously once capacity is available. You can either wait
for the nodes to be up, or delete the node pool and try re-creating it again
later.

TPU 프로비저닝 요청이 장시간 큐에 유지될 수 있고 큐에 있는 동안 "프로비저닝" 상태로 유지됩니다.

용량을 사용할 수 있으면 GKE가 생성되지 않은 남은 노드를 만듭니다.

곧 용량이 필요하면 스팟 VM을 시도할 수 있습니다. 하지만 스팟 VM은 주문형 인스턴스와 다른 할당량을 소비합니다.

TPU 슬라이스 노드 풀을 삭제하여 큐에 있는 TPU 요청을 삭제할 수 있습니다.

TPU 노드에서 워크로드 실행

워크로드 준비

TPU 워크로드 준비 요구사항은 다음과 같습니다.

  1. JAX, PyTorch, TensorFlow와 같은 프레임워크는 libtpu 공유 라이브러리를 사용하여 TPU VM에 액세스합니다. libtpu에는 XLA 컴파일러, TPU 런타임 소프트웨어, TPU 드라이버가 포함됩니다. PyTorch 및 JAX의 각 출시 버전에는 특정 libtpu.so 버전이 필요합니다. GKE에서 TPU를 사용하려면 다음 버전을 사용해야 합니다.
    TPU 유형 libtpu.so 버전
    TPU v5e
    tpu-v5-lite-podslice
    tpu-v5-lite-device
    TPU v5p
    • 권장 jax[tpu] version: 0.4.19 이상
    • 권장 torchxla[tpuvm] 버전: 2023년 10월 23일 나이틀리 버전 빌드를 사용하는 것이 좋습니다
    TPU v4
    tpu-v4-podslice
  2. TPU 리소스를 요청하는 컨테이너에 다음 환경 변수를 설정합니다.
    • TPU_WORKER_ID: 포드마다 고유한 정수입니다. 이 ID는 TPU 슬라이스의 고유한 worker-id를 나타냅니다. 이 필드에 지원되는 값 범위는 0부터 포드 수에서 1을 뺀 값까지입니다.
    • TPU_WORKER_HOSTNAMES: 슬라이스 내에서 서로 통신해야 하는 TPU VM 호스트 이름이나 IP 주소의 쉼표로 구분된 목록입니다. 슬라이스의 TPU VM마다 호스트 이름이나 IP 주소가 있어야 합니다. IP 주소 또는 호스트 이름 목록은 TPU_WORKER_ID에 의해 정렬되고 색인이 0으로 지정됩니다.
    • completionMode: Indexed, subdomain, parallelism > 1, 요청 google.com/tpu 속성을 사용하여 작업을 만든 경우 GKE에서 변형 웹훅을 사용하여 이러한 환경 변수를 자동으로 삽입합니다. GKE는 서비스를 지원하는 포드에 DNS 레코드가 추가되도록 헤드리스 서비스를 추가합니다.

      Kuberay를 사용하여 TPU 멀티 호스트 리소스를 배포할 때 GKE는 GKE에서 Ray가 실행될 수 있도록 배포 가능한 웹훅Terraform 템플릿의 일부로 제공합니다. TPU로 GKE에서 Ray 실행에 대한 안내는 TPU 사용자 가이드를 참조하세요. 변형 웹훅은 이러한 환경 변수를 google.com/tpu 속성과 멀티 호스트 cloud.google.com/gke-tpu-topology 노드 선택기를 요청하는 Ray 클러스터에 삽입합니다.

    • 워크로드 매니페스트에서 Kubernetes 노드 선택기를 추가하여 GKE가 정의된 TPU 머신 유형 및 TPU 토폴로지로 TPU 워크로드를 예약하도록 합니다.

        nodeSelector:
          cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
          cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
        

      다음을 바꿉니다.

      • TPU_ACCELERATOR: TPU 가속기 이름입니다.
        • TPU v4의 경우 tpu-v4-podslice를 사용합니다.
        • ct5l-로 시작하는 TPU v5e 머신 유형의 경우 tpu-v5-lite-device를 사용합니다.
        • ct5lp-로 시작하는 TPU v5e 머신 유형의 경우 tpu-v5-lite-podslice를 사용합니다.
        • TPU v5p의 경우 tpu-v5p-slice를 사용합니다.
      • TPU_TOPOLOGY: TPU 슬라이스의 물리적 토폴로지입니다. 토폴로지 형식은 다음과 같이 TPU 버전에 따라 달라집니다.
        • TPU v4의 경우: 3-튜플({A}x{B}x{C})로 토폴로지를 정의합니다(예: 4x4x4).
        • TPU v5e: 2-튜플({A}x{B})로 토폴로지를 정의합니다(예: 2x2).
        • TPU v5p: 3-튜플({A}x{B}x{C})로 토폴로지를 정의합니다(예: 4x4x4).

워크로드 준비를 완료한 후에는 TPU를 사용하는 작업을 실행할 수 있습니다.

다음 섹션에서는 TPU로 간단한 계산을 수행하는 작업을 실행하는 방법에 대한 예시를 보여줍니다.

예시 1: TPU 노드 풀에서 사용 가능한 TPU 칩 수를 표시하는 워크로드 실행

다음 워크로드는 멀티 호스트 TPU 슬라이스의 모든 노드에서 TPU 칩 수를 반환합니다. 멀티 호스트 슬라이스를 만들기 위한 워크로드 매개변수는 다음과 같습니다.

  • TPU 버전: TPU v4
  • 토폴로지: 2x2x4

이 버전과 토폴로지를 선택하면 멀티 호스트 슬라이스가 생성됩니다.

  1. 다음 매니페스트를 available-chips-multihost.yaml로 저장합니다.
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: tpu-available-chips
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tpu-available-chips
    spec:
      backoffLimit: 0
      completions: 4
      parallelism: 4
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
            cloud.google.com/gke-tpu-accelerator: tpu-v4-podslice
            cloud.google.com/gke-tpu-topology: 2x2x4
          containers:
          - name: tpu-job
            image: python:3.10
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            securityContext:
              privileged: true
            command:
            - bash
            - -c
            - |
              pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                cpu: 10
                memory: 500Gi
                google.com/tpu: 4
              limits:
                cpu: 10
                memory: 500Gi
                google.com/tpu: 4
    
  2. 매니페스트를 배포합니다.
    kubectl create -f available-chips-multihost.yaml
    

    GKE는 4개의 TPU VM(멀티 호스트 TPU 슬라이스)으로 TPU v4 슬라이스를 실행합니다. 슬라이스에는 상호 연결된 칩 16개가 있습니다.

  3. 작업이 4개의 포드를 만들었는지 확인합니다.
    kubectl get pods
    

    출력은 다음과 비슷합니다.

    NAME                       READY   STATUS      RESTARTS   AGE
    tpu-job-podslice-0-5cd8r   0/1     Completed   0          97s
    tpu-job-podslice-1-lqqxt   0/1     Completed   0          97s
    tpu-job-podslice-2-f6kwh   0/1     Completed   0          97s
    tpu-job-podslice-3-m8b5c   0/1     Completed   0          97s
    
  4. 포드 중 하나의 로그를 가져옵니다.
    kubectl logs POD_NAME
    

    POD_NAME을 생성된 포드 중 하나의 이름으로 바꿉니다. 예를 들면 tpu-job-podslice-0-5cd8r입니다.

    출력은 다음과 비슷합니다.

    TPU cores: 16
    

예시 2: TPU VM에서 사용 가능한 TPU 칩 수를 표시하는 워크로드 실행

다음 워크로드는 특정 노드에 연결된 TPU 칩 수를 표시하는 정적 포드입니다. 단일 호스트 노드를 만들기 위한 워크로드 매개변수는 다음과 같습니다.

  • TPU 버전: TPU v5e
  • 토폴로지: 2x4

이 버전과 토폴로지를 선택하면 단일 호스트 슬라이스가 생성됩니다.

  1. 다음 매니페스트를 available-chips-singlehost.yaml로 저장합니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: tpu-job-jax-v5
    spec:
      restartPolicy: Never
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
        cloud.google.com/gke-tpu-topology: 2x4
      containers:
      - name: tpu-job
        image: python:3.10
        ports:
        - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
        securityContext:
          privileged: true
        command:
        - bash
        - -c
        - |
          pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
          python -c 'import jax; print("Total TPU chips:", jax.device_count())'
        resources:
          requests:
            google.com/tpu: 8
          limits:
            google.com/tpu: 8
    
  2. 매니페스트를 배포합니다.
    kubectl create -f available-chips-singlehost.yaml
    

    GKE는 TPU v5e를 사용하는 단일 호스트 TPU 슬라이스 8개로 노드를 프로비저닝합니다. 각 TPU VM에는 8개의 칩(단일 호스트 TPU 슬라이스)이 있습니다.

  3. 포드 로그를 가져옵니다.
    kubectl logs tpu-job-jax-v5
    

    출력은 다음과 비슷합니다.

    Total TPU chips: 8
    

가속기를 사용하여 노드 풀 업그레이드(GPU 및 TPU)

GKE는 노드 풀을 포함하여 Standard 클러스터를 자동으로 업그레이드합니다. 또한 노드 버전을 곧 새로운 버전으로 업그레이드하려는 경우 노드 풀을 수동으로 업그레이드할 수 있습니다. 클러스터의 업그레이드 방식을 제어하려면 출시 채널, 유지보수 기간 및 제외항목, 출시 시퀀싱을 사용합니다.

또한 일시 급증 업그레이드 또는 블루-그린 업그레이드와 같이 노드 풀에 대해 노드 업그레이드 전략을 구성할 수 있습니다. 이러한 전략을 구성하여 환경에서 속도와 중단 사이의 최적 균형을 이루는 방식으로 노드 풀이 업그레이드되도록 할 수 있습니다. 멀티 호스트 TPU 슬라이스 노드 풀의 경우 구성된 노드 업그레이드 전략을 사용하는 대신 GKE가 단일 단계로 전체 노드 풀을 원자적으로 다시 만듭니다. 자세한 내용은 GKE의 TPU 관련 용어에서 원자성 정의를 참조하세요.

노드 업그레이드 전략을 사용하려면 구성에 따라 GKE에서 일시적으로 추가 리소스를 프로비저닝해야 합니다. GPU 또는 TPU가 있는 노드를 더 만들려고 시도할 때 리소스 가용성 오류가 표시될 때와 같이 Google Cloud에서 노드 풀 리소스 용량이 제한적이면 리소스 제한 환경에서 업그레이드를 참조하세요.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 더 이상 예약된 워크로드가 없는 TPU 노드 풀을 삭제하는 것이 좋습니다. 실행 중인 워크로드를 정상적으로 종료해야 하는 경우 노드를 삭제하기 전에 kubectl drain을 사용하여 워크로드를 삭제합니다.

  1. TPU 노드 풀을 삭제합니다.

    gcloud container node-pools delete POOL_NAME \
        --location=LOCATION \
        --cluster=CLUSTER_NAME
    

    다음을 바꿉니다.

    • POOL_NAME: 노드 풀의 이름입니다.
    • CLUSTER_NAME: 클러스터의 이름
    • LOCATION: 클러스터의 컴퓨팅 위치입니다.

추가 구성

다음 섹션에서는 TPU 워크로드에 적용할 수 있는 추가 구성을 설명합니다.

멀티슬라이스

더 큰 학습 워크로드를 처리하기 위해 멀티슬라이스에서 더 작은 슬라이스를 함께 집계할 수 있습니다. 자세한 내용은 GKE의 멀티슬라이스 TPU를 참조하세요.

TPU 예약 마이그레이션

기존 TPU 예약이 있으면 먼저 TPU 예약을 새 Compute Engine 기반 예약 시스템으로 마이그레이션해야 합니다. 마이그레이션할 필요가 없는 Compute Engine 기반 예약 시스템을 만들 수도 있습니다. TPU 예약을 마이그레이션하는 방법은 TPU 예약을 참조하세요.

로깅

TPU VM을 포함하여 GKE 노드에서 실행되는 컨테이너에서 내보낸 로그는 GKE Logging 에이전트에 의해 수집되어 Logging으로 전송되고 Logging에 표시됩니다.

GKE 노드 자동 프로비저닝 사용

TPU 워크로드의 리소스 수요를 충족하기 위해 노드 풀을 자동으로 만들고 삭제하도록 GKE를 구성할 수 있습니다. 자세한 내용은 Cloud TPU 구성을 참조하세요.

TPU 노드 자동 복구

멀티 호스트 TPU 슬라이스 노드 풀의 TPU 노드가 비정상이면 전체 노드 풀이 다시 생성됩니다. TPU 노드가 비정상 상태가 되는 조건은 다음과 같습니다.

  • 공통 노드 조건이 있는 모든 TPU 노드
  • 할당할 수 없는 TPU 수가 0보다 큰 모든 TPU 노드
  • 중지(선점에 의해)되거나 종료된 모든 TPU VM 인스턴스
  • 노드 유지보수: 멀티 호스트 TPU 슬라이스 노드 풀 내의 TPU 노드(VM)가 호스트 유지보수를 위해 작동 중지되면 GKE가 전체 TPU 슬라이스를 다시 만듭니다.

작업 기록에서 복구 상태(실패 이유 포함)를 확인할 수 있습니다. 할당량 부족으로 인해 실패가 발생한 경우 Google Cloud 계정 담당자에게 문의하여 해당 할당량을 늘리세요.

TPU 노드 단계적 종료 구성

1.29.1-gke.1425000 이상을 실행하는 제어 영역이 있는 GKE 클러스터에서 TPU 노드는 종료가 임박했음을 노드에 알려주는 SIGTERM 신호를 지원합니다. 종료 임박 알림은 TPU 노드에서 최대 5분까지 구성할 수 있습니다.

이 알림 기간 내에 ML 워크로드를 단계적으로 종료하도록 GKE를 구성할 수 있습니다. 단계적 종료 중에 워크로드는 데이터 손실을 줄이기 위해 워크로드 데이터 저장과 같은 삭제 프로세스를 수행할 수 있습니다. 최대 알림 시간을 얻으려면 포드 매니페스트에서 다음과 같이 spec.terminationGracePeriodSeconds 필드를 300초(5분)로 설정합니다.

    spec:
      terminationGracePeriodSeconds: 300

GKE는 이러한 포드를 정상적으로 종료하고 사용자가 정의한 종료 작업(예: 학습 상태 저장)을 실행하기 위해 최선을 다합니다.

권한이 있는 모드 없이 컨테이너 실행

TPU 노드가 1.28 미만 버전을 실행하는 경우 다음 섹션을 참조하세요.

TPU VM에서 실행 중인 컨테이너는 드라이버가 직접 메모리 액세스(DMA)를 통해 TPU 칩과 통신할 수 있도록 잠긴 메모리에 대한 더 높은 제한에 액세스해야 합니다. 이 기능을 사용 설정하려면 높은 ulimit를 구성해야 합니다. 컨테이너의 권한 범위를 줄이려면 다음 단계를 완료하세요.

  1. 다음 필드를 포함하도록 securityContext를 수정합니다.

    securityContext:
      capabilities:
        add: ["SYS_RESOURCE"]
    
  2. TPU 리소스를 사용하도록 워크로드를 설정하기 전에 컨테이너 내에서 다음 명령어를 실행하여 ulimit를 늘립니다.

    ulimit -l 68719476736
    

참고: TPU v5e의 경우 버전 1.27.4-gke.900 이상의 클러스터에서 권한 모드 없이 실행 중인 컨테이너를 사용할 수 있습니다.

관측 가능성 및 측정항목

대시보드

Google Cloud 콘솔의 Kubernetes 클러스터 페이지에서 관측 가능성 탭에 TPU 관측 가능성 측정항목이 표시됩니다. 자세한 내용은 GKE 관측 가능성 측정항목을 참조하세요.

TPU 대시보드는 GKE 클러스터에서 시스템 측정항목을 사용 설정한 경우에만 채워집니다.

런타임 측정항목

GKE 버전 1.27.4-gke.900 이상에서 JAX 버전 0.4.14 이상을 사용하고 containerPort: 8431을 지정하는 TPU 워크로드는 TPU 사용률 측정항목을 GKE 시스템 측정항목으로 내보냅니다. TPU 워크로드의 런타임 성능을 모니터링하기 위해 Cloud Monitoring에서 다음 측정항목을 사용할 수 있습니다.

  • 가동 주기: 이전 샘플링 기간(60초) 동안 TPU 칩에서 TensorCore가 활발하게 처리된 시간의 백분율입니다. 백분율이 높을수록 TPU 사용률이 높은 것입니다.
  • 메모리 사용량: 할당된 가속기 메모리 양(바이트)입니다. 60초마다 샘플링됩니다.
  • 메모리 용량: 총 가속기 메모리 용량(바이트)입니다. 60초마다 샘플링됩니다.

이러한 측정항목은 Kubernetes 노드(k8s_node) 및 Kubernetes 컨테이너(k8s_container) 스키마에 있습니다.

Kubernetes 컨테이너:

  • kubernetes.io/container/accelerator/duty_cycle
  • kubernetes.io/container/accelerator/memory_used
  • kubernetes.io/container/accelerator/memory_total

Kubernetes 노드:

  • kubernetes.io/node/accelerator/duty_cycle
  • kubernetes.io/node/accelerator/memory_used
  • kubernetes.io/node/accelerator/memory_total

호스트 측정항목

GKE 버전 1.28.1-gke.1066000 이상에서 TPU VM은 TPU 사용률 측정항목을 GKE 시스템 측정항목으로 내보냅니다. TPU 호스트의 성능을 모니터링하기 위해 Cloud Monitoring에서 다음 측정항목을 사용할 수 있습니다.

  • TensorCore 사용률: 현재 사용되는 TensorCore의 백분율입니다. TensorCore 값은 행렬 곱셈 단위(MXU)와 벡터 단위의 합과 동일합니다. TensorCore 사용률은 지난 샘플 기간(60초) 동안 수행된 TensorCore 작업을 동일 기간 동안 지원된 TensorCore 작업 수로 나눈 값입니다. 값이 클수록 사용률이 높습니다.
  • 메모리 대역폭 사용률: 사용 중인 가속기 메모리 대역폭의 현재 백분율입니다. 샘플 기간(60초) 동안 사용된 메모리 대역폭을 동일한 샘플 기간 동안 지원된 최대 대역폭으로 나누어 계산합니다.

이러한 측정항목은 Kubernetes 노드(k8s_node) 및 Kubernetes 컨테이너(k8s_container) 스키마에 있습니다.

Kubernetes 컨테이너:

  • kubernetes.io/container/accelerator/tensorcore_utilization
  • kubernetes.io/container/accelerator/memory_bandwidth_utilization

Kubernetes 노드:

  • kubernetes.io/container/node/tensorcore_utilization
  • kubernetes.io/container/node/memory_bandwidth_utilization

자세한 내용은 Kubernetes 측정항목GKE 시스템 측정항목을 참조하세요.

알려진 문제

  • 클러스터 자동 확장 처리는 사용 가능한 TPU를 보고하기 전에 새 TPU 노드의 용량을 잘못 계산할 수 있습니다. 이후 클러스터 자동 확장 처리에서 추가 확장을 수행하여 결과적으로 필요한 것보다 많은 노드가 생성될 수 있습니다. 클러스터 자동 확장 처리에서는 일반적인 축소 작업 후 더 이상 필요하지 않은 추가 노드를 축소합니다.
  • 클러스터 자동 확장 처리에서는 대기 상태로 15분 이상 유지되는 TPU 노드 풀의 확장을 취소합니다. 클러스터 자동 확장 처리는 나중에 이러한 확장 작업을 다시 시도합니다. 이 동작으로 인해 예약을 사용하지 않는 고객의 TPU 획득 가능성이 줄어들 수 있습니다.
  • TPU taint에 대한 톨러레이션(toleration)이 있는 TPU 외의 워크로드는 TPU 노드 풀 드레이닝 중에 다시 생성될 경우 노드 풀의 축소를 막을 수 있습니다.

다음 단계