멀티 인스턴스 GPU 실행


이 페이지에서는 NVIDIA® A100 또는 H100 그래픽 처리 장치(GPU)를 분할하여 Google Kubernetes Engine(GKE)의 여러 컨테이너에서 단일 GPU를 공유하는 방법을 설명합니다.

이 페이지에서는 사용자가 포드, 노드, 배포, 네임스페이스 같은 Kubernetes 개념과 노드 풀, 자동 확장, 자동 프로비저닝 같은 GKE 개념에 익숙하다고 가정합니다.

소개

Kubernetes는 컨테이너의 워크로드에 GPU 중 일부만 필요로 하더라도 컨테이너마다 전체 GPU를 할당하므로, 리소스 낭비와 비용 초과를 초래할 수 있습니다. 특히 최신 세대의 강력한 GPU를 사용하고 있다면 더욱 자원 낭비가 될 겁니다. GPU 사용률을 개선하기 위해 멀티 인스턴스 GPU를 사용하면 단일 지원 GPU를 최대 7개 슬라이스까지 파티션을 나눌 수 있습니다. 각 슬라이스는 노드의 컨테이너 하나에 개별적으로 할당할 수 있으므로 GPU당 최대 7개 컨테이너에 할당할 수 있습니다. 멀티 인스턴스 GPU는 워크로드 간에 하드웨어 격리를 제공하며 GPU에서 실행되는 모든 컨테이너에 대해 일관되고 예측 가능한 QoS를 제공합니다.

CUDA® 애플리케이션의 경우 멀티 인스턴스 GPU는 대체로 투명합니다. 각 GPU 파티션은 일반 GPU 리소스로 표시되고 프로그래밍 모델은 변경되지 않습니다.

멀티 인스턴스 GPU에 대한 상세 내용은 NVIDIA 멀티 인스턴스 GPU 사용자 가이드를 참조하세요.

지원되는 GPU

멀티 인스턴스 GPU를 지원하는 GPU 유형은 다음과 같습니다.

  • NVIDIA A100(40GB)
  • NVIDIA A100(80GB)
  • NVIDIA H100(80GB)

멀티 인스턴스 GPU 파티션

A100 GPU와 H100 GPU는 컴퓨팅 단위 7개와 메모리 단위 8개로 구성되며, 서로 다른 크기의 GPU 인스턴스로 파티션을 나눌 수 있습니다. GPU 파티션 크기는 [compute]g.[memory]gb 문법을 사용합니다. 예를 들어 1g.5gb의 GPU 파티션 크기는 하나의 컴퓨팅 단위(GPU의 스트리밍 멀티프로세서의 1/7)와 하나의 메모리 단위(5GB)가 있는 GPU 인스턴스를 나타냅니다. GPU의 파티션 크기는 Autopilot 워크로드를 배포하거나 Standard 클러스터를 만들 때 지정할 수 있습니다.

NVIDIA 멀티 인스턴스 GPU 사용자 가이드의 파티션을 나눈 테이블에는 각 GPU 파티션에서 사용할 수 있는 컴퓨팅 및 메모리 리소스 양과 더불어 모든 GPU 파티션 크기가 나열됩니다. 또한 테이블에는 GPU에서 만들 수 있는 각 파티션 크기의 GPU 인스턴스 수가 표시됩니다.

다음 테이블에는 GKE가 지원하는 파티션 크기가 나열되어 있습니다.

파티션 크기 GPU 인스턴스
GPU: NVIDIA A100(40GB)(nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU: NVIDIA A100(80GB)(nvidia-a100-80gb)
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H100 (80GB)(nvidia-h100-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1

노드 풀 내의 각 노드에 있는 각 GPU는 같은 방식으로 파티션을 나눕니다. 예를 들어 노드 풀에 2개의 노드가 있고 각 노드에 4개의 GPU가 있고 파티션 크기가 1g.5gb라고 가정해 보겠습니다. GKE는 각 GPU에 1g.5gb 크기의 파티션 7개를 만듭니다. 각 노드에는 4개의 GPU가 있으므로 각 노드에서 사용할 수 있는 1g.5gb GPU 파티션은 28개입니다. 노드 풀에 2개의 노드가 있으므로 전체 노드 풀에서는 총 56개의 1g.5gb GPU 파티션을 사용할 수 있습니다.

GPU 파티션 유형이 두 개 이상인 GKE Standard 클러스터를 만들려면 노드 풀을 여러 개 만들어야 합니다. 예를 들어 클러스터에 1g.5gb3g.20gb GPU 파티션이 있는 노드를 원하는 경우 GPU 파티션 크기가 1g.5gb로 설정된 노드 풀과 3g.20gb로 설정된 노드 풀을 포함하여 2개의 노드 풀을 만들어야 합니다.

GKE Autopilot 클러스터는 다른 파티션 크기가 필요한 워크로드를 만들 때 올바른 파티션 구성으로 노드를 자동으로 만듭니다.

각 노드에는 노드에서 사용할 수 있는 GPU 파티션 크기로 라벨이 지정됩니다. 이 라벨을 사용하면 워크로드에서 필요한 GPU 파티션 크기로 노드를 타겟팅할 수 있습니다. 예를 들어 1g.5gb GPU 인스턴스가 있는 노드는 다음과 같이 라벨이 지정됩니다.

cloud.google.com/gke-gpu-partition-size=1g.5gb

작동 방식

멀티 인스턴스 GPU를 사용하려면 다음 작업을 수행하세요.

  1. 멀티 인스턴스 GPU가 사용 설정된 클러스터 만들기
  2. 드라이버를 수동으로 설치
  3. 노드의 GPU 리소스 수 확인
  4. 멀티 인스턴스 GPU를 사용하여 컨테이너 배포

가격 책정

멀티 인스턴스 GPU는 A100 GPU 및 H100 GPU에만 적용되며 워크로드 실행에 사용되는 다른 제품과 함께 해당 GPU 가격 책정이 적용됩니다. 파티션 나누기를 위해 클러스터의 노드에 전체 GPU만 연결할 수 있습니다. GPU 가격 정보는 GPU 가격 책정 페이지를 참조하세요.

제한사항

  • 신뢰할 수 없는 워크로드에는 GKE에서 멀티 인스턴스 GPU 파티션을 사용하지 않는 것이 좋습니다.
  • GPU 파티션 자동 확장 및 자동 프로비저닝은 GKE 버전 1.20.7-gke.400 이상에서 완전히 지원됩니다. 이전 버전에서는 노드가 최소 1개 이상인 노드 풀만 워크로드의 특정 GPU 파티션 크기 요구에 따라 자동 확장될 수 있습니다.
  • GPU 인스턴스에서는 GPU 사용률 측정항목(예: duty_cycle)을 사용할 수 없습니다.
  • 멀티 인스턴스는 물리적 GPU를 하드웨어 수준에서 서로 격리되는 개별 인스턴스로 분할합니다. 멀티 인스턴스 GPU 인스턴스를 사용하는 컨테이너는 해당 인스턴스에 제공되는 CPU와 메모리 리소스에만 액세스할 수 있습니다.
  • 포드는 최대 1개의 멀티 인스턴스 GPU 인스턴스만 사용할 수 있습니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • Autopilot에서 멀티 인스턴스 GPU는 GKE 버전 1.29.3-gke.1093000 이상에서 지원됩니다.
  • NVIDIA A100 GPU 할당량이 충분해야 합니다. 할당량 증가 요청을 참조하세요.
  • Autopilot에서 멀티 인스턴스 GPU를 사용하려면 Autopilot에서 GPU 워크로드 배포에서 Autopilot에서 GPU를 사용하는 방법에 대해 자세히 알아보세요.
  • GKE는 Autopilot 클러스터의 모든 멀티 인스턴스 GPU 워크로드에 Accelerator 컴퓨팅 클래스를 할당합니다.

멀티 인스턴스 GPU가 사용 설정된 클러스터 만들기

GKE Standard를 사용하는 경우 클러스터에서 멀티 인스턴스 GPU를 사용 설정해야 합니다. 버전 1.29.3-gke.1093000 이상을 실행하는 Autopilot 클러스터는 기본적으로 멀티 인스턴스 GPU를 사용 설정합니다. Autopilot에서 멀티 인스턴스 GPU를 사용하려면 이 문서에서 멀티 인스턴스 GPU를 사용하여 컨테이너 배포 섹션을 참조하세요.

멀티 인스턴스 GPU가 포함된 Standard 클러스터를 만들 때는 gpuPartitionSizeacceleratorTypeacceleratorCount와 함께 지정해야 합니다. acceleratorTypenvidia-tesla-a100, nvidia-a100-80gb, nvidia-h100-80gb이어야 합니다.

다음 예시에서는 노드 1개와 노드에 1g.5gb 크기의 GPU 파티션 7개가 있는 GKE 클러스터를 만드는 방법을 보여줍니다. 이 페이지의 다른 단계에서는 1g.5gb의 GPU 파티션 크기를 사용하여 각 GPU에 7개의 파티션을 만듭니다. 앞서 언급한 지원되는 GPU 파티션 크기를 사용할 수도 있습니다.

Google Cloud CLI 또는 Terraform을 사용할 수 있습니다.

gcloud

멀티 인스턴스 GPU가 사용 설정된 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME  \
    --project=PROJECT_ID  \
    --zone ZONE  \
    --cluster-version=CLUSTER_VERSION  \
    --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
    --machine-type=a2-highgpu-1g  \
    --num-nodes=1

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • PROJECT_ID: Google Cloud 프로젝트의 ID
  • ZONE: 클러스터 제어 영역의 컴퓨팅 영역
  • CLUSTER_VERSION: 1.19.7-gke.2503 이후 버전
  • DRIVER_VERSION: 설치할 NVIDIA 드라이버 버전. 다음 중 하나일 수 있습니다.
    • default: GKE 버전의 기본 드라이버 버전을 설치합니다.
    • latest: GKE 버전에 사용 가능한 최신 드라이버 버전을 설치합니다. Container-Optimized OS를 사용하는 노드에서만 사용할 수 있습니다.
    • disabled: 자동 드라이버 설치를 건너뜁니다. 클러스터를 만든 후 반드시 수동으로 드라이버를 설치해야 합니다. gpu-driver-version을 생략한 경우 기본 옵션입니다.

Terraform

Terraform을 사용하여 사용 설정된 멀티 인스턴스 GPU가 있는 클러스터를 만들려면 다음 예시를 참조하세요.

resource "google_container_cluster" "default" {
  name               = "gke-standard-zonal-gpu"
  location           = "us-central1-a"
  initial_node_count = 1

  node_config {
    guest_accelerator {
      type  = "nvidia-tesla-t4"
      count = 1
      gpu_driver_installation_config {
        gpu_driver_version = "LATEST"
      }
    }
    machine_type = "n1-standard-2"
  }

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

Terraform 사용에 대한 자세한 내용은 GKE에 대한 Terraform 지원을 참조하세요.

클러스터에 연결

새로 생성된 클러스터에 연결하도록 kubectl를 구성하세요.

gcloud container clusters get-credentials CLUSTER_NAME

드라이버 설치

클러스터를 만들 때 자동 드라이버 설치를 사용 중지한 경우 또는 1.27.2-gke.1200 이전의 GKE 버전을 실행하는 경우 생성이 완료된 후 호환되는 NVIDIA 드라이버를 수동으로 설치해야 합니다. 멀티 인스턴스 GPU에는 NVIDIA 드라이버 버전 450.80.02 이상이 필요합니다.

드라이버가 설치된 후 멀티 인스턴스 GPU 모드가 사용 설정됩니다. 드라이버를 자동으로 설치한 경우 GPU 기기 플러그인이 GPU 파티션을 만들기 시작할 때 노드가 재부팅됩니다. 드라이버를 수동으로 설치한 경우 드라이버 설치가 완료되면 노드가 재부팅됩니다. 재부팅을 완료하려면 몇 분 정도 걸릴 수 있습니다.

노드의 GPU 리소스 수 확인

다음 명령어를 실행하여 nvidia.com/gpu 리소스의 용량 및 할당 가능한 수가 7인지 확인합니다.

kubectl describe nodes

다음은 명령어의 출력 예시입니다.

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

멀티 인스턴스 GPU를 사용하여 컨테이너 배포

노드에서 멀티 인스턴스 GPU 기기당 최대 1개의 컨테이너를 배포할 수 있습니다. 이 예시에서는 파티션 크기가 1g.5gb이며 노드에 사용할 수 있는 멀티 인스턴스 GPU 파티션은 7개입니다. 따라서 이 노드에 GPU를 요청하는 컨테이너를 최대 7개까지 배포할 수 있습니다.

  1. 다음은 cuda:11.0.3-base-ubi7 컨테이너를 시작하고 nvidia-smi를 실행하여 컨테이너 내 GPU의 UUID를 출력하는 예시입니다. 이 예시에서는 7개의 컨테이너가 있고 각 컨테이너는 하나의 GPU 파티션을 수신합니다. 또한, 이 예시에서는 1g.5gb GPU 파티션이 있는 노드를 타겟팅하도록 cloud.google.com/gke-gpu-partition-size 노드 선택기를 설정합니다.

    Autopilot

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                  cloud.google.com/gke-accelerator: nvidia-tesla-a100
                  cloud.google.com/gke-accelerator-count: "1"
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    이 매니페스트는 다음을 수행합니다.

    • cloud.google.com/gke-accelerator 노드 선택기를 설정하여 nvidia-tesla-a100 GPU 유형을 요청합니다.
    • GPU를 1g.5gb 파티션 크기로 분할합니다.
    • cloud.google.com/gke-accelerator-count 노드 선택기를 설정하여 단일 GPU를 노드에 연결합니다.

    Standard

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    이 매니페스트는 다음을 수행합니다.

    • 파티션 크기가 1g.5gb인 단일 GPU를 요청합니다.
  2. 7개의 포드가 모두 실행 중인지 확인하세요.

    kubectl get pods
    

    다음은 명령어의 출력 예시입니다.

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. 이전 명령어의 포드 이름을 사용하여 로그를 보고 GPU UUID를 확인합니다.

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    다음은 명령어의 출력 예시입니다.

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

다음 단계