이 페이지에서는 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.5gb
및 3g.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를 사용하려면 다음 작업을 수행하세요.
가격 책정
멀티 인스턴스 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 클러스터를 만들 때는 gpuPartitionSize
를 acceleratorType
및 acceleratorCount
와 함께 지정해야 합니다. acceleratorType
은 nvidia-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 프로젝트의 IDZONE
: 클러스터 제어 영역의 컴퓨팅 영역CLUSTER_VERSION
:1.19.7-gke.2503
이후 버전DRIVER_VERSION
: 설치할 NVIDIA 드라이버 버전. 다음 중 하나일 수 있습니다.default
: GKE 버전의 기본 드라이버 버전을 설치합니다.latest
: GKE 버전에 사용 가능한 최신 드라이버 버전을 설치합니다. Container-Optimized OS를 사용하는 노드에서만 사용할 수 있습니다.disabled
: 자동 드라이버 설치를 건너뜁니다. 클러스터를 만든 후 반드시 수동으로 드라이버를 설치해야 합니다.gpu-driver-version
을 생략한 경우 기본 옵션입니다.
Terraform
Terraform을 사용하여 사용 설정된 멀티 인스턴스 GPU가 있는 클러스터를 만들려면 다음 예시를 참조하세요.
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개까지 배포할 수 있습니다.
다음은
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를 요청합니다.
-
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
이전 명령어의 포드 이름을 사용하여 로그를 보고 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)
다음 단계
- GPU 자세히 알아보기
- GPU의 시간 공유 구성 방법 알아보기
- 클러스터 멀티테넌시에 대해 자세히 알아보기
- 엔터프라이즈 멀티테넌시 권장사항 자세히 알아보기