A4X를 사용하는 맞춤 AI 최적화 GKE 클러스터 만들기

이 페이지에서는 A4X 가상 머신 (VM)을 사용하여 AI 및 ML 워크로드를 지원하는 AI 최적화 Google Kubernetes Engine (GKE) 클러스터를 만드는 방법을 보여줍니다. A4X에 대한 자세한 내용은 A4X 시리즈를 참고하세요.

A4X 머신 시리즈는 대규모 AI/ML 클러스터를 실행할 수 있도록 설계되었으며, 워크로드 배치 지정, 고급 클러스터 유지보수 제어, 토폴로지 인식 스케줄링과 같은 기능을 제공합니다. 자세한 내용은 클러스터 관리 개요를 참조하세요.

GKE는 조직의 다양한 워크로드를 실행할 수 있는 단일 플랫폼을 제공하여 여러 플랫폼을 관리하는 운영 부담을 줄여줍니다. 고성능 분산 사전 학습, 모델 미세 조정, 모델 추론, 애플리케이션 서빙, 지원 서비스와 같은 워크로드를 실행할 수 있습니다.

이 페이지에서는 워크로드의 요구사항에 따라 클러스터를 최대한 유연하게 구성할 수 있도록 Google Cloud CLI로 GKE 클러스터를 만드는 방법을 알아봅니다. 또는 Cluster Toolkit을 사용하여 여러 사용 사례의 권장사항을 반영하는 기본 설정으로 클러스터를 빠르게 배포할 수도 있습니다.

GPUDirect RDMA를 사용하는 클러스터 구성 옵션

Google Cloud CLI로 클러스터를 만들려면 다음 클러스터 구성 옵션 중 하나를 선택하면 됩니다.

  • 분산 AI 워크로드를 실행하려는 경우: 이 페이지의 안내에 따라 GPUDirect RDMA를 사용하여 GKE 클러스터를 만듭니다.
  • 분산 AI 워크로드를 실행하지 않을 계획인 경우: GPUDirect RDMA를 사용하지 않고 GKE 클러스터를 만듭니다. 자세한 내용은 GPUDirect RDMA 없이 클러스터 만들기를 참고하세요.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

필요한 역할

GKE 클러스터를 만들고 관리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

용량 확보

미래용 예약을 만들어 A4X VM의 용량을 확보할 수 있습니다. 미래용 예약에 대한 자세한 내용은 소비 옵션 선택 표의 AI 하이퍼컴퓨터의 미래용 예약 열을 참고하세요.

미래용 예약으로 용량을 확보하려면 용량을 확보하는 방법 표에서 AI 하이퍼컴퓨터의 미래용 예약 행을 참고하세요.

요구사항

A4X VM이 있는 AI 최적화 GKE 클러스터에는 다음 요구사항이 적용됩니다.

  • A4X의 경우 1.33 이상의 경우 GKE 버전 1.33.4-gke.1036000 이상을 사용해야 합니다. 또는 1.32의 경우 GKE 버전 1.32.8-gke.1108000 이상을 사용합니다. 이러한 버전을 통해 A4X는 다음을 사용합니다.

    • R580: A4X의 최소 GPU 드라이버 버전입니다.
    • 일관된 드라이버 기반 메모리 관리(CDMM)(기본적으로 사용 설정됨) NVIDIA는 Kubernetes 클러스터가 메모리 과다 보고 문제를 해결하기 위해 이 모드를 사용 설정할 것을 권장합니다. CDMM을 사용하면 운영체제 (OS) 대신 드라이버를 통해 GPU 메모리를 관리할 수 있습니다. 이 접근 방식을 사용하면 OS에서 GPU 메모리를 온라인 상태로 전환하는 것을 방지하고 GPU 메모리를 OS에 비균일 메모리 액세스 (NUMA) 노드로 노출할 수 있습니다. CDMM이 사용 설정된 경우 멀티 인스턴스 GPU는 지원되지 않습니다. CDMM에 관한 자세한 내용은 하드웨어 및 소프트웨어 지원을 참고하세요.
    • A4X 노드 풀이 A4X의 네트워킹 기능을 사용하도록 설정하는 것이 권장되는 GPUDirect RDMA
  • GKE 노드는 Container-Optimized OS 노드 이미지를 사용해야 합니다. Ubuntu 및 Windows 노드 이미지는 지원되지 않습니다.

  • GKE 워크로드는 사용 가능한 모든 GPU를 사용해야 하고 포드는 단일 GKE 노드에서 사용 가능한 모든 보조 NIC를 사용해야 합니다. 여러 포드가 단일 GKE 노드에서 RDMA를 공유할 수 없습니다.

  • 이 설정은 NCCL 테스트를 실행합니다. 이 NCCL 테스트를 실행하려면 최소 VM 할당량이 2개 (a4x-highgpu-4g 또는 a4x-highgpu-4g-nolssd 사용 시 GPU 4개)여야 합니다.

  • 예약에 따름 프로비저닝 모델을 사용하여 A4X로 클러스터를 만들어야 합니다. 다른 프로비저닝 모델은 지원되지 않습니다.

  • GPUDirect RDMA는 NCCL Fast Socket 또는 GPUDirect TCPX/TCPXO와 호환되지 않습니다. GPUDirect RDMA를 사용하는 클러스터에서는 NCCL Fast Socket을 사용 설정하거나 TCPX/TCPXO 플러그인을 설치하지 마세요.

클러스터 생성 시 고려사항

클러스터를 만들 때 다음 정보를 고려하세요.

  • 클러스터 위치 선택:
    • 선택한 머신 유형을 사용할 수 있는 위치를 사용하는지 확인합니다. 자세한 내용은 GPU 위치를 참고하세요.
    • 밀도 높은 예약의 경우 영역 클러스터를 만들 수 있습니다. 이 경우 --region 플래그를 --zone=COMPUTE_ZONE 플래그로 바꿉니다. 여기서 COMPUTE_ZONE은 컨트롤 플레인의 영역입니다.
    • 리전별 클러스터에서 노드 풀을 만들 때 --node-locations 플래그를 사용하여 GKE 노드의 영역을 지정할 수 있습니다.
  • 드라이버 버전 선택:
    • 드라이버 버전은 다음 값 중 하나일 수 있습니다.
      • default: GKE 노드 버전의 기본 드라이버 버전을 설치합니다. 기본 드라이버 버전 요구사항에 관한 자세한 내용은 요구사항 섹션을 참고하세요.
      • latest: GKE 버전에 사용 가능한 최신 드라이버 버전을 설치합니다. 이 옵션은 Container-Optimized OS를 사용하는 노드에서만 사용할 수 있습니다.
      • disabled: 자동 드라이버 설치를 건너뜁니다. 노드 풀을 만든 후 수동으로 드라이버를 설치해야 합니다.
    • GKE 노드 버전의 기본 및 최신 GPU 드라이버 버전에 관한 자세한 내용은 NVIDIA GPU 드라이버 수동 설치 섹션의 표를 참고하세요.
  • 예약 어피니티 선택:

    • 예약 이름 또는 예약 내의 특정 블록 이름과 같은 예약 정보를 확인할 수 있습니다. 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.
    • --reservation-affinity 플래그는 specific 또는 any 값을 사용할 수 있습니다. 하지만 고성능 분산 AI 워크로드의 경우 특정 예약을 사용하는 것이 좋습니다.
    • 공유 예약을 비롯한 특정 예약을 사용하는 경우 다음 형식으로 --reservation 플래그의 값을 지정합니다.

      projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
      

      다음 값을 바꿉니다.

      • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
      • RESERVATION_NAME: 예약의 이름
      • BLOCK_NAME: 예약 내의 특정 블록 이름입니다.

      VM이 BLOCK_NAME 내의 단일 하위 블록에 배치되도록 하위 블록 타겟팅 예약을 사용하려면 경로 끝에 다음을 추가하세요.

      /reservationSubBlocks/SUB_BLOCK_NAME
      

      SUB_BLOCK_NAME을 하위 블록 이름으로 바꿉니다.

A4X 및 GPUDirect RDMA를 사용하는 AI 최적화 GKE 클러스터 만들기

분산 AI 워크로드의 경우 여러 GPU 노드가 단일 컴퓨터로 작동하도록 함께 연결되는 경우가 많습니다. A4X는 NVIDIA GB200 NVL72 랙 확장 아키텍처를 기반으로 하는 엑사스케일 플랫폼입니다. 이 머신 유형은 AI 워크로드에 고성능 클라우드 환경을 제공하여 여러 GPU에서 확장 및 공동작업을 지원합니다. 네트워크 대역폭 및 NIC 구성을 비롯한 A4X의 네트워크 아키텍처에 대한 자세한 내용은 A4X 머신 유형을 참고하세요.

A4X 및 GPUDirect RDMA를 사용하여 GKE Standard 클러스터를 만들려면 다음 섹션에 설명된 다음 단계를 완료하세요.

  1. VPC 및 서브넷 만들기
  2. 다중 네트워킹으로 GKE 클러스터 만들기
  3. GKE 네트워크 객체 만들기
  4. 워크로드 정책 만들기
  5. A4X로 노드 풀 만들기
  6. RDMA 바이너리 설치 및 NCCL 구성
  7. NVIDIA 컴퓨팅 도메인 CRD 및 DRA 드라이버 설치

VPC 및 서브넷 만들기

A4X VM의 구성은 다음과 같습니다.

  • NVLink로 연결된 가상 머신당 NVIDIA B200 GPU 4개
  • Arm 기반 NVIDIA Grace CPU 2개
  • GPU 간 네트워킹을 위한 400Gbps CX-7 네트워크 인터페이스 카드 (NIC) 4개
  • 외부 서비스를 위한 200Gbps Google Titanium 네트워크 인터페이스 카드 (NIC) 2개

분산 학습과 같은 AI 및 ML 워크로드에는 작업 완료 시간을 단축하여 성능을 최적화하기 위한 강력한 가속이 필요합니다. 높은 성능, 높은 처리량, 짧은 지연 시간이 필요한 워크로드의 경우 GPUDirect RDMA는 GPU 간 페이로드를 전송하는 데 필요한 네트워크 홉을 줄입니다. 이 접근 방식은 사용 가능한 네트워크 대역폭을 더 효율적으로 사용합니다.

CPU와 연결된 Google Titanium NIC 중 하나가 GKE의 기본 네트워크를 사용하므로 기본 네트워크에 충분한 IP 주소 범위가 있는 한 이 NIC의 새 VPC를 만들지 않아도 됩니다.

다음 명령어를 사용하여 두 번째 CPU Titanium NIC (gVNIC)용 VPC 하나와 4개의 CX-7 RDMA NIC용 VPC 하나를 만들 수 있습니다.

네트워크 대역폭을 최대화하기 위해 추가 GVNIC용 VPC를 만드는 명령어는 최대 전송 단위 (MTU)를 8896으로 설정합니다. RDMA VPC는 기본적으로 권장 설정인 8896으로 설정됩니다. 자세한 내용은 MTU 설정 및 GPU 머신 유형을 참고하세요.

  1. 배포에 맞게 환경 변수를 설정합니다.

    export REGION="COMPUTE_REGION"
    export ZONE="COMPUTE_ZONE"
    export PROJECT="PROJECT_ID"
    export GVNIC_NETWORK_PREFIX="GVNIC_NETWORK_PREFIX"
    export RDMA_NETWORK_PREFIX="RDMA_NETWORK_PREFIX"
    

    다음 변수를 바꿉니다.

    • COMPUTE_REGION: 클러스터의 리전
    • COMPUTE_ZONE: 노드 풀의 영역입니다.
    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • GVNIC_NETWORK_PREFIX: GVNIC 네트워크 접두사 (예: a4x-gvnic)
    • RDMA_NETWORK_PREFIX: RDMA 네트워크 접두사입니다 (예: a4x-rdma).
  2. VPC 네트워크 2개를 만듭니다.

    # Create a VPC for the additional GVNIC
    gcloud compute --project=${PROJECT} \
      networks create \
      GVNIC_NETWORK_PREFIX-net \
      --subnet-mode=custom \
      --mtu=8896
    
    gcloud compute --project=${PROJECT} \
      networks subnets create \
      GVNIC_NETWORK_PREFIX-sub \
      --network=GVNIC_NETWORK_PREFIX-net \
      --region=${REGION} \
      --range=192.168.0.0/24
    
    gcloud compute --project=${PROJECT} \
      firewall-rules create \
      GVNIC_NETWORK_PREFIX-internal \
      --network=GVNIC_NETWORK_PREFIX-net \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
    
    # Create HPC VPC for the RDMA NICs with 4 subnets.
    gcloud compute --project=${PROJECT} \
      networks create RDMA_NETWORK_PREFIX-net \
      --network-profile=${ZONE}-vpc-roce \
      --subnet-mode=custom
    
    # Create subnets for the HPC VPC.
    for N in $(seq 0 3); do
      gcloud compute --project=${PROJECT} \
        networks subnets create \
        RDMA_NETWORK_PREFIX-sub-$N \
        --network=RDMA_NETWORK_PREFIX-net \
        --region=${REGION} \
        --range=192.168.$((N+1)).0/24 &  # offset to avoid overlap with gvnics
    done
    

멀티 네트워킹으로 GKE 클러스터 만들기

  1. 멀티 네트워킹을 사용하여 GKE Standard 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME \
        --enable-dataplane-v2 --enable-ip-alias --location=COMPUTE_REGION \
        --enable-multi-networking --cluster-version=CLUSTER_VERSION \
        --enable-kubernetes-unstable-apis=resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices \
        [--services-ipv4-cidr=SERVICE_CIDR \
        --cluster-ipv4-cidr=POD_CIDR]
    

    이 명령어를 준비할 때는 다음을 수행하세요.

    • GKE 버전 1.34 이상을 실행하는 클러스터를 만들 때 DRA를 사용 설정하는 데 사용되는 --enable-kubernetes-unstable-apis 플래그를 삭제합니다. 이 플래그는 버전 1.32 또는 1.33을 실행하는 클러스터를 만들 때만 필요합니다. 베타 API를 사용 설정하면 베타 API가 지원 중단되고 이후 Kubernetes 부 버전에서 삭제될 때 베타 API에서 마이그레이션해야 합니다. 자세한 내용은 베타 API 지원 중단을 참고하세요.
    • 다음을 바꿉니다.

      • CLUSTER_NAME: 클러스터 이름입니다.
      • CLUSTER_VERSION: 새 클러스터의 버전입니다. GKE의 어떤 버전이 구성을 지원하는지 자세히 알아보려면 이 문서의 요구사항을 참고하세요.
      • COMPUTE_REGION: 컴퓨팅 리전의 이름입니다.
    • 선택적으로 서비스 및 포드의 보조 CIDR 범위를 명시적으로 제공할 수 있습니다. 이러한 선택적 플래그를 사용하는 경우 다음 변수를 바꿉니다.

      • SERVICE_CIDR: 서비스의 보조 CIDR 범위입니다.
      • POD_CIDR: 포드의 보조 CIDR 범위입니다.

      이러한 플래그를 사용하는 경우 CIDR 범위가 추가 노드 네트워크의 서브넷 범위와 겹치지 않는지 확인해야 합니다. 예를 들어 SERVICE_CIDR=10.65.0.0/19POD_CIDR=10.64.0.0/19을 생각해 보세요. 자세한 내용은 포드 IPv4 주소 범위 추가를 참고하세요.

GKE 네트워크 객체 만들기

이전 섹션에서 만든 VPC 네트워크를 GKE 네트워크 매개변수 집합을 통해 구성해야 합니다. 구체적으로 두 번째 CPU Titanium NIC (gVNIC)는 NetDevice 모드로 구성해야 하고 4개의 CX-7 RDMA NIC는 각각 RDMA 모드로 구성해야 합니다.

이 명령어는 다음 이름을 사용합니다.

  • CPU Titanium NIC (gVNIC) VPC의 이름은 GVNIC_NETWORK_PREFIX-net이고 서브넷의 이름은 GVNIC_NETWORK_PREFIX-sub입니다.
  • CX-7 RDMA NIC VPC의 이름은 RDMA_NETWORK_PREFIX-net이고 서브넷의 이름은 RDMA_NETWORK_PREFIX-sub-[0…3]입니다.

다음 명령어를 실행하여 GKE 네트워크 객체를 만듭니다.

kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: gvnic-1
spec:
  vpc: GVNIC_NETWORK_PREFIX-net
  vpcSubnet: GVNIC_NETWORK_PREFIX-sub
  deviceMode: NetDevice
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: gvnic-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: gvnic-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-0
spec:
  vpc: RDMA_NETWORK_PREFIX-net
  vpcSubnet: RDMA_NETWORK_PREFIX-sub-0
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-0
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-0
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-1
spec:
  vpc: RDMA_NETWORK_PREFIX-net
  vpcSubnet: RDMA_NETWORK_PREFIX-sub-1
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-2
spec:
  vpc: RDMA_NETWORK_PREFIX-net
  vpcSubnet: RDMA_NETWORK_PREFIX-sub-2
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-2
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-2
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-3
spec:
  vpc: RDMA_NETWORK_PREFIX-net
  vpcSubnet: RDMA_NETWORK_PREFIX-sub-3
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-3
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-3
EOF

워크로드 정책 만들기

파티션을 만들려면 워크로드 정책이 필요합니다. 자세한 내용은 MIG의 워크로드 정책을 참고하세요.

accelerator_topology 필드가 1x72로 설정된 HIGH_THROUGHPUT 워크로드 정책을 만듭니다.

gcloud beta compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
    --type HIGH_THROUGHPUT \
    --accelerator-topology 1x72 \
    --project PROJECT \
    --region COMPUTE_REGION

다음을 바꿉니다.

  • WORKLOAD_POLICY_NAME: 워크로드 정책의 이름입니다.
  • PROJECT: 프로젝트의 이름
  • COMPUTE_REGION: 컴퓨팅 리전의 이름입니다.

A4X로 노드 풀 만들기

GKE GPU 기기 플러그인을 사용하는 노드 풀을 만드는 것이 좋습니다. 이 플러그인은 GKE 관리형 GPU 리소스 관리를 제공합니다. 이 접근 방식에는 다음과 같은 이점이 있습니다.

  • 배포 및 업그레이드의 용이성
  • 드라이버 자동 설치
  • 측정항목 및 파티셔닝된 GPU와 같은 GKE 관리 GPU 기능
  • 필수 보안 취약점 수정

또는 사용 사례에 필요한 경우 NVIDIA GPU Operator를 사용할 수 있습니다. 자세한 내용은 NVIDIA GPU Operator를 사용하는 이유는 무엇인가요?를 참고하세요.

GKE GPU 기기 플러그인으로 A4X 노드 풀 만들기

GKE GPU 기기 플러그인을 사용하는 A4X 노드 풀을 만듭니다.

gcloud container node-pools create NODE_POOL_NAME \
    --location COMPUTE_REGION \
    --node-locations COMPUTE_ZONE \
    --cluster CLUSTER_NAME \
    --num-nodes=NODE_COUNT \
    --machine-type MACHINE_TYPE \
    --accelerator type=nvidia-gb200,count=4,gpu-driver-version=DRIVER_VERSION \
    --additional-node-network network=GVNIC_NETWORK_PREFIX-net,subnetwork=GVNIC_NETWORK_PREFIX-sub \
    --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \
    --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-1 \
    --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-2 \
    --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-3 \
    --scopes "https://www.googleapis.com/auth/cloud-platform" \
    --reservation-affinity=specific \
    --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME \
    --placement-policy=WORKLOAD_POLICY_NAME

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀의 이름입니다.
  • COMPUTE_REGION: 클러스터의 리전
  • COMPUTE_ZONE: 노드 풀의 영역입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.
  • NODE_COUNT: 노드 풀의 노드 수입니다. 18개 이하여야 합니다. NVLink 도메인을 사용하여 하나의 하위 블록에서 1x72의 GPU 토폴로지를 얻으려면 18개의 노드를 사용하는 것이 좋습니다.
  • MACHINE_TYPE: 로컬 SSD를 원하는지에 따라 a4x-highgpu-4g 또는 a4x-highgpu-4g-nolssd입니다.
  • DRIVER_VERSION: 설치할 NVIDIA 드라이버 버전입니다. default, latest, disabled 중 하나일 수 있습니다.
  • RESERVATION_NAME: 예약 이름입니다. 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.
  • BLOCK_NAME: 예약 내의 특정 블록 이름입니다. 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.
  • WORKLOAD_POLICY_NAME: 이전에 만든 워크로드 정책의 이름입니다.

NVIDIA GPU Operator로 A4X 노드 풀 만들기

또는 NVIDIA GPU Operator를 사용하려면 다음 단계를 따르세요.

  1. 이전 섹션의 gcloud container node-pools create 명령어를 다음과 같이 변경하여 실행합니다.

    • gpu-driver-version=latestgpu-driver-version=disabled로 변경합니다. 이 수정사항은 NVIDIA GPU Operator를 사용할 때는 지원되지 않으므로 자동 GPU 드라이버 설치를 건너뜁니다.
    • --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"를 설정하여 GKE 관리형 GPU 기기 플러그인 Daemonset를 사용 중지합니다.
  2. GKE GPU 드라이버 설치 프로그램 DaemonSet 매니페스트를 적용합니다. 이 매니페스트는 각 A4X 노드에 GPU 드라이버 설치 프로그램 포드를 배포합니다.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  3. Google Kubernetes Engine (GKE)에서 NVIDIA GPU Operator로 GPU 스택 관리:

    1. GPU 노드 풀을 만들고 설정하는 섹션에서 인증 사용자 인증 정보를 가져오는 단계부터 시작하는 안내를 따릅니다.
    2. NVIDIA GPU Operator 설치 모든 단계를 완료하되 Helm을 사용하여 NVIDIA GPU Operator를 설치하는 참조 섹션의 명령어를 바꿉니다. 대신 다음 명령어를 사용하세요.

      helm install --wait --generate-name \
        -n gpu-operator \
        nvidia/gpu-operator \
        --version="25.3.0" \
        -f <(cat <<EOF
      hostPaths:
        driverInstallDir: /home/kubernetes/bin/nvidia
      toolkit:
        installDir: /home/kubernetes/bin/nvidia
      cdi:
        enabled: true
        default: true
      driver:
        enabled: false
      
      daemonsets:
        tolerations:
          - key: nvidia.com/gpu
            operator: Equal
            value: present
            effect: NoSchedule
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
      
      node-feature-discovery:
        worker:
          tolerations:
            - key: kubernetes.io/arch
              operator: Equal
              value: arm64
              effect: NoSchedule
            - key: "node-role.kubernetes.io/master"
              operator: "Equal"
              value: ""
              effect: "NoSchedule"
            - key: "node-role.kubernetes.io/control-plane"
              operator: "Equal"
              value: ""
              effect: "NoSchedule"
            - key: nvidia.com/gpu
              operator: Exists
              effect: NoSchedule
      EOF
      )
      

RDMA 바이너리 설치 및 NCCL 구성

다음 DaemonSet을 적용하여 각 노드에 RDMA 바이너리와 NCCL 라이브러리를 설치합니다. 기본 VM마다 RDMA 바이너리는 /home/kubernetes/bin/gib 디렉터리에 설치되고 NCCL 라이브러리는 /home/kubernetes/bin/nvidia/lib64 디렉터리에 설치됩니다.

  kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-rdma/nccl-rdma-installer-a4x.yaml

NVIDIA Compute Domain CRD 및 DRA 드라이버 설치

NVIDIA Compute Domain CRD 및 DRA 드라이버를 설치합니다. 자세한 내용은 GPU용 NVIDIA DRA 드라이버를 참고하세요.

  1. 개발 환경에 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
    
  2. NVIDIA Helm 저장소를 추가합니다.

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
      && helm repo update
    
  3. DRA 드라이버의 ResourceQuota를 만듭니다.

    export POD_QUOTA=POD_QUOTA
    
    kubectl create ns nvidia-dra-driver-gpu
    
    kubectl apply -n nvidia-dra-driver-gpu -f - << EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: nvidia-dra-driver-gpu-quota
    spec:
      hard:
        pods: ${POD_QUOTA}
      scopeSelector:
        matchExpressions:
        - operator: In
          scopeName: PriorityClass
          values:
            - system-node-critical
            - system-cluster-critical
    EOF
    

    POD_QUOTA를 클러스터의 A4X 노드 수의 2배 이상에 1을 더한 수로 바꿉니다. 예를 들어 클러스터에 A4X 노드가 18개 있는 경우 변수를 37 이상으로 설정해야 합니다.

  4. DRA 드라이버를 설치합니다.

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="DRA_DRIVER_VERSION" \
        --create-namespace \
        --namespace nvidia-dra-driver-gpu \
        -f <(cat <<EOF
    nvidiaDriverRoot: /home/kubernetes/bin/nvidia
    resources:
      gpus:
        enabled: false
    
    controller:
      affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: "nvidia.com/gpu"
                  operator: "DoesNotExist"
    
    kubeletPlugin:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: cloud.google.com/gke-accelerator
                    operator: In
                    values:
                      - nvidia-gb200
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - arm64
    
      tolerations:
        - key: nvidia.com/gpu
          operator: Equal
          value: present
          effect: NoSchedule
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
    EOF
    )
    

    DRA_DRIVER_VERSION을 버전 25.3.1 이상으로 바꿉니다. helm search repo nvidia/nvidia-dra-driver-gpu --versions 명령어를 실행하여 사용 가능한 NVIDIA DRA 드라이버 버전 목록을 확인할 수 있습니다. 또는 GitHub 출시 노트를 검토하여 사용 가능한 버전을 찾습니다.

멀티 네트워킹, RDMA, IMEX 도메인용 워크로드 매니페스트 구성

  1. 포드 메타데이터에 다음 주석을 추가합니다.

    metadata:
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth2","network":"rdma-0"},
            {"interfaceName":"eth3","network":"rdma-1"},
            {"interfaceName":"eth4","network":"rdma-2"},
            {"interfaceName":"eth5","network":"rdma-3"}
          ]
    
  2. Arm 노드에서 예약할 노드 어피니티 규칙을 추가합니다.

    spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/arch
              operator: In
              values:
              - arm64
    

    자세한 내용은 단일 아키텍처에 워크로드 예약을 참고하세요.

  3. 포드 사양에 다음 볼륨을 추가합니다.

    spec:
    volumes:
      - name: library-dir-host
        hostPath:
          path: /home/kubernetes/bin/nvidia
      - name: gib
        hostPath:
          path: /home/kubernetes/bin/gib
    
  4. GPU를 요청하는 컨테이너에 다음 볼륨 마운트, 환경 변수, 리소스를 추가합니다. 워크로드 컨테이너는 다음 네 개의 GPU를 모두 요청해야 합니다.

    containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
        - name: gib
       mountPath: /usr/local/gib
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 4
    
  5. 워크로드의 ComputeDomain 리소스를 만듭니다.

    apiVersion: resource.nvidia.com/v1beta1
    kind: ComputeDomain
    metadata:
      name: a4x-compute-domain
    spec:
      numNodes: NUM_NODES
      channel:
        resourceClaimTemplate:
          name: a4x-compute-domain-channel
    

    NUM_NODES를 워크로드에 필요한 노드 수로 바꿉니다.

  6. 포드에서 사용할 resourceClaimTemplate을 지정합니다.

    spec:
      ...
      volumes:
        ...
      containers:
        - name: my-container
          ...
          resources:
            limits:
              nvidia.com/gpu: 4
      claims:
              - name: compute-domain-channel
            ...
    resourceClaims:
      - name: compute-domain-channel
        resourceClaimTemplateName: a4x-compute-domain-channel
    
  7. 필수 환경 변수를 모두 설정하여 NCCL을 구성합니다. 워크로드 컨테이너에서 다음 셸 스크립트를 사용합니다.

    source /usr/local/gib/scripts/set_nccl_env.sh
    

완성된 포드 사양은 다음과 같습니다.

apiVersion: resource.nvidia.com/v1beta1
kind: ComputeDomain
metadata:
  name: a4x-compute-domain
spec:
  numNodes: NUM_NODES
  channel:
    resourceClaimTemplate:
      name: a4x-compute-domain-channel
---
apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
      ]
spec:
  ...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
        - name: gib
       mountPath: /usr/local/gib
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 4
        claims:
          - name: compute-domain-channel
        ...
resourceClaims:
  - name: compute-domain-channel
    resourceClaimTemplateName: a4x-compute-domain-channel

네트워크 성능 테스트

프로비저닝된 클러스터의 기능을 검증하는 것이 좋습니다. 이렇게 하려면 Google 환경에 최적화된 NVIDIA Collective Communications Library (NCCL) 테스트NCCL/gIB 테스트를 사용하세요.

다음 단계