GPU 및 유연한 시작 프로비저닝 모드로 소규모 일괄 워크로드 실행


이 가이드에서는 flex-start 프로비저닝 모드를 사용하여 중소규모 학습 워크로드에 맞게 GPU 프로비저닝을 최적화하는 방법을 보여줍니다. 이 가이드에서는 flex-start를 사용하여 두 개의 Kubernetes 작업으로 구성된 워크로드를 배포합니다. 각 작업에는 GPU 하나가 필요합니다. GKE는 두 작업을 실행하기 위해 A100 GPU가 두 개 있는 단일 노드를 자동으로 프로비저닝합니다.

워크로드에 멀티 노드 분산 처리가 필요한 경우 큐에 추가된 프로비저닝을 통한 flex-start를 사용하는 것이 좋습니다. 자세한 내용은 큐에 추가된 프로비저닝을 통한 flex-start로 대규모 워크로드 실행을 참고하세요.

이 가이드는 일괄 워크로드를 실행하기 위해 Kubernetes 컨테이너 조정 기능을 사용하는 데 관심이 있는 머신러닝(ML) 엔지니어, 플랫폼 관리자 및 운영자, 데이터 및 AI 전문가를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE 사용자 역할 및 태스크를 참조하세요.

flex-start(유연한 시작) 가격 책정

워크로드에 단기 예약으로 최대 7일 동안 필요에 따라 동적으로 프로비저닝된 리소스가 필요하고 복잡한 할당량 관리가 필요하지 않으며 비용 효율적인 액세스가 필요한 경우 flex-start(유연한 시작)를 사용하는 것이 좋습니다. flex-start(유연한 시작)는 동적 워크로드 스케줄러를 기반으로 하며 동적 워크로드 스케줄러 가격 책정을 사용하여 청구됩니다.

  • vCPU, GPU, TPU에 최대 53% 할인이 적용됩니다.
  • 사용한 만큼만 지불합니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 버전 1.33.0-gke.1712000 이상을 실행하는 Autopilot 클러스터 또는 Standard 클러스터가 있는지 확인합니다.
  • flex-start의 제한사항을 숙지합니다.
  • Standard 클러스터를 사용하는 경우 클러스터가 올바르게 작동하려면 flex-start를 사용 설정하지 않은 상태에서 노드 풀을 하나 이상 유지해야 합니다.
  • 노드 위치에 선점형 GPU 할당량이 있는지 확인합니다.

클러스터가 없거나 클러스터가 요구사항을 충족하지 않는 경우 gcloud CLI를 사용하여 Standard 리전 클러스터를 만들 수 있습니다. flex-start에 대해 알아볼 수 있도록 다음 플래그를 추가합니다.

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

flex-start 노드 풀을 만들 때는 앞에서 언급한 플래그와 --accelerator type=nvidia-l4,count=1를 사용합니다.

요구사항을 충족하는 Standard 클러스터가 있는 경우 다음 섹션에서 클러스터의 GPU 가속기 유형 및 머신 유형을 선택하는 방법을 안내합니다.

GPU 가속기 유형 선택

Autopilot 모드에서 클러스터를 사용하는 경우 이 섹션을 건너뛰고 일괄 워크로드 실행 섹션으로 이동합니다.

GPU 가용성은 영역마다 다릅니다. Standard 클러스터가 있는 영역에서 사용할 수 있는 GPU 가속기 유형을 찾아야 합니다. 리전 표준 클러스터가 있는 경우 GPU 가속기 유형을 사용할 수 있는 영역이 클러스터가 있는 리전에 있어야 합니다. 노드 풀을 만들 때 가속기 유형과 노드의 영역을 지정합니다. 클러스터 위치에서 사용할 수 없는 가속기 유형을 지정하면 노드 풀 만들기가 실패합니다.

다음 명령어를 실행하여 클러스터의 위치와 지원되는 GPU 액셀러레이터 유형을 가져옵니다.

  1. 클러스터가 있는 위치를 가져옵니다.

    gcloud container clusters list
    

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

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. 위치에서 가상 워크스테이션을 제외하고 사용 가능한 GPU 가속기 유형을 나열합니다.

    gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
    

    LOCATION_NAME을 클러스터의 위치로 바꿉니다.

    예를 들어 us-west2 리전의 GPU 가속기 유형 목록을 가져오려면 다음 명령어를 실행합니다.

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

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

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

호환되는 머신 유형 선택

Autopilot 모드에서 클러스터를 사용하는 경우 이 섹션을 건너뛰고 일괄 워크로드 실행 섹션으로 이동합니다.

클러스터 위치에서 사용할 수 있는 GPU를 확인한 후 호환되는 머신 유형을 결정할 수 있습니다.는 GPU를 특정 머신 시리즈로 제한합니다. Google Cloud 머신 유형을 찾으려면 다음 단계를 따르세요.

  1. 사용 가능한 GPU 모델 표를 참고하세요.
  2. 선택한 GPU 가속기 유형의 행을 찾습니다.
  3. 해당 행의 '머신 시리즈' 열을 확인합니다. 이 열에는 사용해야 하는 머신 시리즈가 표시됩니다.
  4. 지정할 수 있는 머신 유형 이름을 확인하려면 머신 시리즈의 링크를 클릭하세요.

유일한 예외는 선택한 가속기 유형과 함께 사용할 수 있는 N1 머신 유형에 관한 추가 안내를 제공하는 N1 머신 시리즈입니다.

가속기 최적화 머신을 사용하기 전에 머신 유형별 소비 옵션 가용성에 표시된 대로 유연한 시작 프로비저닝 모드가 지원되는지 확인하세요.

액셀러레이터 수 확인

Autopilot 모드에서 클러스터를 사용하는 경우 이 섹션을 건너뛰고 일괄 워크로드 실행 섹션으로 이동합니다.

노드 풀을 만들려면 노드 풀의 각 노드에 연결할 액셀러레이터 수를 결정해야 합니다. 유효한 값은 액셀러레이터 유형 및 머신 유형에 따라 다릅니다. 각 머신 유형에서 지원할 수 있는 GPU 수에는 제한이 있습니다. 1 기본값 외에 사용할 값을 확인하려면 다음 단계를 따르세요.

  1. GPU 머신 유형을 참고하세요.
  2. 표에서 머신 시리즈 유형의 가속기 유형을 검색합니다.
  3. 'GPU 수' 열의 값을 사용합니다.

flex-start로 노드 풀 만들기

Autopilot 모드에서 클러스터를 사용하는 경우 이 섹션을 건너뛰고 일괄 워크로드 실행 섹션으로 이동합니다.

기존 Standard 클러스터에 flex-start가 사용 설정된 노드 풀을 만들려면 gcloud CLI 또는 Terraform을 사용하면 됩니다.

gcloud

  1. flex-start를 사용하여 노드 풀을 만듭니다.

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair
    

    다음을 바꿉니다.

    • NODE_POOL_NAME: 노드 풀에 대해 선택한 이름입니다.
    • CLUSTER_NAME: 수정하려는 Standard 클러스터의 이름입니다.
    • LOCATION_NAME: 클러스터 컨트롤 플레인의 컴퓨팅 리전
    • PROJECT_ID: 프로젝트 ID입니다.
    • ACCELERATOR_TYPE: 인스턴스에 연결할 가속기의 특정 유형입니다 (예: NVIDIA T4의 경우 nvidia-tesla-t4).
    • COUNT: 인스턴스에 연결할 가속기 수입니다. 기본값은 1입니다.
    • MACHINE_TYPE: 노드에 사용할 머신 유형.
    • MAX_RUN_DURATION: 선택사항입니다. 노드의 최대 런타임(초 단위). 기본값은 7일까지입니다. 입력하는 번호는 s로 끝나야 합니다. 예를 들어 하루를 지정하려면 86400s를 입력합니다.
    • NODE_ZONES: GKE가 노드 풀을 만드는 하나 이상의 영역을 쉼표로 구분한 목록입니다.

    이 명령어에서 --flex-start 플래그는 gcloud에 flex-start가 사용 설정된 노드 풀을 만들도록 지시합니다.

    GKE는 지정된 액셀러레이터 유형의 인스턴스가 두 개 포함된 노드로 노드 풀을 만듭니다. 노드 풀에는 처음에는 노드가 0개이고 자동 확장이 사용 설정되어 있습니다.

  2. 노드 풀에서 flex-start의 상태를 확인합니다.

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --format="get(config.flexStart)"
    

    노드 풀에서 flex-start가 사용 설정되면 flexStart 필드가 True로 설정됩니다.

Terraform

Terraform 모듈을 사용하여 GPU와 함께 flex-start를 사용할 수 있습니다.

  1. Terraform 구성에 다음 블록을 추가합니다.
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

다음을 바꿉니다.

  • MACHINE_TYPE: 노드에 사용할 머신 유형입니다.
  • ACCELERATOR_TYPE: 인스턴스에 연결할 특정 유형의 가속기 (예: NVIDIA T4의 경우 nvidia-tesla-t4)입니다.
  • COUNT: 인스턴스에 연결할 가속기 수입니다. 기본값은 1입니다.
  • NODE_ZONES: GKE가 노드 풀을 만드는 하나 이상의 영역을 쉼표로 구분한 목록입니다.

Terraform에서 Google Cloud API를 호출하여 GPU와 함께 flex-start를 사용하는 노드 풀이 있는 클러스터를 만듭니다. 노드 풀에는 처음에는 노드가 0개이고 자동 확장이 사용 설정되어 있습니다. Terraform에 대해 자세히 알아보려면 terraform.io의 google_container_node_pool 리소스 사양을 참조하세요.

일괄 워크로드 실행

이 섹션에서는 각각 GPU 하나가 필요한 Kubernetes 작업 두 개를 만듭니다. Kubernetes의 작업 컨트롤러는 하나 이상의 포드를 만들고 특정 태스크를 성공적으로 실행하는지 확인합니다.

  1. Google Cloud 콘솔에서 Cloud Shell 활성화 아이콘 Cloud Shell 활성화를 클릭하여 Cloud Shell 세션을 시작합니다. Google Cloud 콘솔 하단 창에서 세션이 열립니다.

  2. dws-flex-start.yaml이라는 파일을 만듭니다.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-2
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    
  3. dws-flex-start.yaml 매니페스트를 적용합니다.

    kubectl apply -f dws-flex-start.yaml
    
  4. 작업이 동일한 노드에서 실행 중인지 확인합니다.

    kubectl get pods -l "job-name in (job-1,job-2)" -o wide
    

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

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트는 유지하되 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

개별 리소스 삭제

  1. 작업을 삭제합니다.

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. 노드 풀을 삭제합니다.

    gcloud container node-pools delete NODE_POOL_NAME \
          --location LOCATION_NAME
    
  3. 다음과 같이 클러스터를 삭제합니다.

    gcloud container clusters delete CLUSTER_NAME
    

다음 단계