이 페이지에서는 NVIDIA GPU Operator를 사용해야 하는 경우를 결정하고 GKE에서 NVIDIA GPU Operator를 사용 설정하는 방법을 보여줍니다.
개요
연산자는 사용자가 애플리케이션과 해당 구성요소를 관리하는 커스텀 리소스를 만들 수 있게 해주는 Kubernetes 소프트웨어 확장 프로그램입니다. 연산자를 사용하여 Kubernetes 자체에서 제공하는 것 이상의 복잡한 작업(예: 애플리케이션 배포 및 업그레이드)을 자동화할 수 있습니다.
NVIDIA GPU Operator는 Kubernetes 클러스터에서 NVIDIA GPU를 프로비저닝하는 데 필요한 소프트웨어 구성요소를 배포, 구성, 관리하기 위한 공통 인프라와 API를 제공하는 Kubernetes 연산자입니다. NVIDIA GPU 연산자는 일관된 환경을 제공하고 GPU 리소스 관리를 단순화하며 GPU 가속 워크로드를 Kubernetes에 통합하는 과정을 간소화합니다.
NVIDIA GPU Operator를 사용하는 이유는 무엇인가요?
GKE가 GPU 노드 수명 주기를 완벽하게 관리하므로 GPU 노드에 GKE GPU 관리를 사용하는 것이 좋습니다. GKE를 사용하여 GPU 노드를 관리하려면 다음 옵션 중 하나를 선택하세요.
또는 여러 클라우드 서비스 제공업체에서 일관된 환경을 원하거나, 이미 NVIDIA GPU Operator를 사용하고 있거나, NVIDIA GPU Operator에 종속된 소프트웨어를 사용하는 경우 NVIDIA GPU Operator가 적합한 옵션일 수 있습니다.
이러한 옵션 중에서 선택할 때 고려해야 할 사항에 관한 자세한 내용은 GKE 또는 GKE의 NVIDIA GPU Operator를 통해 GPU 스택 관리를 참고하세요.
제한사항
NVIDIA GPU Operator는 Container-Optimized OS(COS) 및 Ubuntu 노드 이미지에서 지원되며, 다음과 같은 제한사항이 있습니다.
- NVIDIA GPU Operator는 GPU Operator 버전 24.6.0 이상부터 GKE에서 지원됩니다.
- NVIDIA GPU Operator는 Autopilot 클러스터에서 지원되지 않습니다.
- NVIDIA GPU Operator는 Windows 노드 이미지에서 지원되지 않습니다.
- NVIDIA GPU Operator는 GKE에서 관리되지 않습니다. NVIDIA GPU 연산자를 업그레이드하려면 NVIDIA 문서를 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
- Standard 노드 풀에서 GPU 실행의 요구사항을 충족하는지 확인합니다.
개발 환경에 Helm이 설치되어 있는지 확인합니다. Helm은 Cloud Shell에 사전 설치되어 있습니다.
특정 Helm 버전 요구사항은 없지만 다음 명령어를 사용하여 Helm이 설치되어 있는지 확인할 수 있습니다.
helm version
출력이
Command helm not found
와 비슷하면 다음 명령어를 실행하여 Helm CLI를 설치할 수 있습니다.curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \ && chmod 700 get_helm.sh \ && ./get_helm.sh
GPU 노드 풀 만들기 및 설정
GPU 노드 풀을 만들고 설정하려면 다음 단계를 따르세요.
다음 수정을 사용하여 GPU 노드 풀을 만드는 방법에 대한 안내를 따라 GPU 노드 풀을 만듭니다.
- NVIDIA GPU Operator를 사용할 때는 지원되지 않으므로 자동 GPU 드라이버 설치를 건너뛰려면
gpu-driver-version=disabled
를 설정합니다. - GKE 관리 GPU 기기 플러그인 Daemonset를 사용 중지하려면
--node-labels="gke-no-default-nvidia-gpu-device-plugin=true"
를 설정합니다.
다음 명령어를 실행하고 필요에 따라 GPU 노드 풀 생성을 위한 다른 플래그를 추가합니다.
gcloud container node-pools create POOL_NAME \ --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=disabled \ --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"
다음을 바꿉니다.
- POOL_NAME 선택한 노드 풀의 이름입니다.
- GPU_TYPE: 사용할 GPU 가속기의 유형입니다. 예를 들면
nvidia-h100-80gb
입니다. - AMOUNT: 노드 풀의 노드에 연결할 GPU 수입니다.
예를 들어 다음 명령어는 영역 클러스터
a3-cluster
에 H100 GPU가 있는 GKE 노드 풀a3nodepool
을 만듭니다. 이 예시에서는 GKE GPU 기기 플러그인 Daemonset 및 자동 드라이버 설치가 사용 중지되어 있습니다.gcloud container node-pools create a3nodepool \ --region=us-central1 --cluster=a3-cluster \ --node-locations=us-central1-a \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=disabled \ --machine-type=a3-highgpu-8g \ --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" \ --num-nodes=1
- NVIDIA GPU Operator를 사용할 때는 지원되지 않으므로 자동 GPU 드라이버 설치를 건너뛰려면
다음 명령어를 실행하여 클러스터의 사용자 인증 정보를 가져옵니다.
USE_GKE_GCLOUD_AUTH_PLUGIN=True \ gcloud container clusters get-credentials CLUSTER_NAME [--zone COMPUTE_ZONE] [--region COMPUTE_REGION]
다음을 바꿉니다.
- CLUSTER_NAME: 노드 풀이 포함된 클러스터의 이름입니다.
- COMPUTE_REGION 또는 COMPUTE_ZONE: 클러스터가 리전 클러스터인지 영역 클러스터인지에 따라 클러스터의 리전 또는 영역을 지정합니다.
출력은 다음과 비슷합니다.
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
(선택사항) 클러스터에 연결할 수 있는지 확인합니다.
kubectl get nodes -o wide
이 클러스터에서 실행 중인 모든 노드 목록이 표시됩니다.
다음 명령어를 실행하여 NVIDIA GPU Operator의 네임스페이스
gpu-operator
를 만듭니다.kubectl create ns gpu-operator
출력은 다음과 비슷합니다.
namespace/gpu-operator created
다음 명령어를 실행하여
gpu-operator
네임스페이스에 리소스 할당량을 만듭니다.kubectl apply -n gpu-operator -f - << EOF apiVersion: v1 kind: ResourceQuota metadata: name: gpu-operator-quota spec: hard: pods: 100 scopeSelector: matchExpressions: - operator: In scopeName: PriorityClass values: - system-node-critical - system-cluster-critical EOF
출력은 다음과 비슷합니다.
resourcequota/gpu-operator-quota created
gpu-operator
네임스페이스의 리소스 할당량을 확인합니다.kubectl get -n gpu-operator resourcequota gpu-operator-quota
출력은 다음과 비슷합니다.
NAME AGE REQUEST LIMIT gpu-operator-quota 2m27s pods: 0/100
Container-Optimized OS 또는 Ubuntu 노드에 드라이버를 수동으로 설치합니다. 자세한 내용은 NVIDIA GPU 드라이버 수동 설치를 참고하세요.
COS를 사용하는 경우 다음 명령어를 실행하여 설치 DaemonSet을 배포하고 기본 GPU 드라이버 버전을 설치합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
Ubuntu를 사용하는 경우 배포하는 설치 DaemonSet은 안내의 Ubuntu 섹션에 설명된 대로 GPU 유형 및 GKE 노드 버전에 따라 다릅니다.
다음 명령어를 실행하여 GPU 드라이버 버전을 확인합니다.
kubectl logs -l k8s-app=nvidia-driver-installer \ -c "nvidia-driver-installer" --tail=-1 -n kube-system
GPU 드라이버가 성공적으로 설치되면 출력은 다음과 비슷합니다.
I0716 03:17:38.863927 6293 cache.go:66] DRIVER_VERSION=535.183.01 … I0716 03:17:38.863955 6293 installer.go:58] Verifying GPU driver installation I0716 03:17:41.534387 6293 install.go:543] Finished installing the drivers.
NVIDIA GPU Operator 설치
이 섹션에서는 Helm을 사용하여 NVIDIA GPU Operator를 설치하는 방법을 보여줍니다. 자세한 내용은 NVIDIA GPU Operator 설치에 대한 NVIDIA 문서를 참조하세요.
NVIDIA Helm 저장소를 추가합니다.
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
다음 구성 옵션으로 Helm을 사용하여 NVIDIA GPU Operator를 설치합니다.
- GPU Operator 버전이 24.6.0 이상인지 확인합니다.
hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia
를 사용하여 GPU Operator 에 드라이버 설치 경로를 구성합니다.- COS와 Ubuntu 모두에 툴킷 설치 경로를
toolkit.installDir=/home/kubernetes/bin/nvidia
로 설정합니다. COS에서/home
디렉터리는 쓰기가 가능하고 NVIDIA 런타임 바이너리를 저장하기 위한 스테이트풀(Stateful) 위치로 작동합니다. 자세한 내용은 COS 디스크 및 파일 시스템 개요를 참고하세요. - 레거시 모드는 지원되지 않으므로
cdi.enabled=true
및cdi.default=true
를 사용하여 GPU Operator에서 컨테이너 기기 인터페이스(CDI)를 사용 설정합니다. GKE에서 COS 및 Ubuntu 모두에 CDI가 필요합니다.
helm install --wait --generate-name \ -n gpu-operator \ nvidia/gpu-operator \ --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \ --set toolkit.installDir=/home/kubernetes/bin/nvidia \ --set cdi.enabled=true \ --set cdi.default=true \ --set driver.enabled=false
이러한 설정에 관한 자세한 내용은 NVIDIA 문서의 일반 차트 맞춤설정 옵션 및 일반 배포 시나리오를 참고하세요.
NVIDIA GPU Operator가 설치되었는지 확인합니다.
GPU Operator 피연산자가 올바르게 실행 중인지 확인하려면 다음 명령어를 실행합니다.
kubectl get pods -n gpu-operator
결과는 다음과 유사합니다.
NAME READY STATUS RESTARTS AGE gpu-operator-5c7cf8b4f6-bx4rg 1/1 Running 0 11m gpu-operator-node-feature-discovery-gc-79d6d968bb-g7gv9 1/1 Running 0 11m gpu-operator-node-feature-discovery-master-6d9f8d497c-thhlz 1/1 Running 0 11m gpu-operator-node-feature-discovery-worker-wn79l 1/1 Running 0 11m gpu-feature-discovery-fs9gw 1/1 Running 0 8m14s gpu-operator-node-feature-discovery-worker-bdqnv 1/1 Running 0 9m5s nvidia-container-toolkit-daemonset-vr8fv 1/1 Running 0 8m15s nvidia-cuda-validator-4nljj 0/1 Completed 0 2m24s nvidia-dcgm-exporter-4mjvh 1/1 Running 0 8m15s nvidia-device-plugin-daemonset-jfbcj 1/1 Running 0 8m15s nvidia-mig-manager-kzncr 1/1 Running 0 2m5s nvidia-operator-validator-fcrr6 1/1 Running 0 8m15s
노드의 'Allocatable' 필드에 GPU 수가 올바르게 구성되어 있는지 확인하려면 다음 명령어를 실행합니다.
kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
GPU_NODE_NAME을 GPU가 있는 노드의 이름으로 바꿉니다.
출력은 다음과 비슷합니다.
Allocatable: cpu: 11900m ephemeral-storage: 47060071478 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 80403000Ki nvidia.com/gpu: 1 # showing correct count of GPU associated with the nods pods: 110
GPU 워크로드가 올바르게 실행되는지 확인하려면
cuda-vectoradd
도구를 사용하면 됩니다.cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd spec: restartPolicy: OnFailure containers: - name: vectoradd image: nvidia/samples:vectoradd-cuda11.2.1 resources: limits: nvidia.com/gpu: 1 EOF
그런 후 다음 명령어를 실행하세요.
kubectl logs cuda-vectoradd
출력은 다음과 비슷합니다.
[Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done
다음 단계
- Standard 노드 풀에서 GPU를 실행하는 방법 알아보기
- GKE의 GPU 공유 전략 알아보기
- GKE에서 GPU를 사용하여 LLM 추론 워크로드를 자동 확장하기 위한 권장사항 알아보기
- NVIDIA GPU Operator 문서 살펴보기