가속기 VM의 자동 네트워킹 구성

이 문서에서는 GPU, TPU와 같은 가속기 VM에 자동 네트워킹을 사용하여 Google Kubernetes Engine (GKE) 가속기 워크로드의 네트워크 구성을 간소화하는 방법을 보여줍니다. 이는 가속기 최적화 머신에서 인공지능 (AI), 머신러닝 (ML), 고성능 컴퓨팅 (HPC)을 실행하는 데 필수적입니다.

이 문서에서는 기본 GKE 개념, GPU 및 TPU 워크로드, VPC 네트워킹에 익숙하다고 가정합니다. 특히 다음 사항을 숙지해야 합니다.

이 페이지는 조직의 네트워크를 설계하는 클라우드 설계자 및 네트워킹 전문가를 대상으로 합니다. 모든 GKE 문서 세트의 개요는 GKE 문서 살펴보기를 참조하세요. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참고하세요.

GKE를 사용하면 특수 가속기에서 고성능 AI 및 ML을 간편하게 실행할 수 있습니다. 액셀러레이터 VM의 자동 네트워킹을 사용하면 RDMA와 같은 프로토콜에 필수적인 고속 다중 네트워크 연결을 단일 구성 플래그로 사용 설정할 수 있습니다. 이 자동화를 통해 여러 VPC 네트워크를 설정하고, IP 주소 범위를 관리하고, 모든 노드 풀과 포드의 네트워크 인터페이스를 구성하는 복잡한 수동 프로세스가 사라집니다. 노드 풀을 만들 때 단일 매개변수를 사용하면 GKE가 필요한 모든 클라우드 및 Kubernetes 네트워킹 리소스를 제공합니다.

용어

다음 용어는 액셀러레이터 VM의 네트워킹 아키텍처를 이해하는 데 중요합니다.

  • 가상 프라이빗 클라우드 (VPC): VPC는 Google의 프로덕션 네트워크 내에서 구현되는 물리적 네트워크의 가상 버전입니다. Compute Engine 가상 머신 (VM) 인스턴스, GKE 클러스터, 기타 리소스에 연결을 제공합니다.
  • Titanium NIC: CPU에서 네트워크 처리 작업을 오프로드하여 CPU가 워크로드에 집중할 수 있도록 하는 스마트 NIC입니다. GPU 머신에서는 직접적인 GPU-GPU 통신이 아닌 모든 트래픽을 처리합니다. TPU 머신에서는 모든 NIC가 Titanium NIC입니다.
  • 서브네트워크: 서브네트워크는 더 큰 VPC의 세분화된 부분입니다. 각 서브네트워크는 리전과 연결되어 있으며 정의된 IP 주소 범위를 갖습니다.
  • 네트워크 인터페이스 컨트롤러 (NIC): NIC는 VM 인스턴스를 네트워크에 연결하는 가상 네트워크 인터페이스입니다. 각 NIC는 특정 VPC 및 서브넷에 연결됩니다.
  • 호스트 네트워크: 제어 영역 트래픽 및 일반 포드 네트워킹과 같은 일반 클러스터 통신을 위해 노드의 기본 네트워크 인터페이스 (NIC)에서 사용하는 기본 네트워크입니다.
  • 데이터 네트워크: 액셀러레이터 VM 간의 고성능 데이터 전송을 위한 전용 네트워크입니다. GPU의 경우 RDMA가 있는 GPUDirect VPC인 경우가 많습니다. TPU의 경우 두 번째 호스트 네트워크일 수 있습니다.
  • 원격 직접 메모리 액세스(RDMA): RDMA는 운영체제나 CPU를 거치지 않고 네트워크 기기가 컴퓨터의 메인 메모리와 직접 데이터를 교환할 수 있도록 하는 기술입니다. 이렇게 하면 지연 시간이 크게 줄고 처리량이 향상되므로 HPC 및 ML 워크로드에 매우 중요합니다.
  • NVLink: NVLink는 단일 노드 내에서 여러 GPU를 연결하여 메모리를 공유하고 대규모 데이터 세트에서 공동으로 작업할 수 있도록 NVIDIA에서 개발한 고속 상호 연결 기술입니다.
  • Kubernetes 동적 리소스 할당 (DRA): DRA는 포드가 GPU 및 기타 특수 하드웨어와 같은 리소스를 요청하고 사용할 수 있는 더 유연한 방법을 제공하는 Kubernetes 기능입니다. 이를 통해 리소스 할당을 세밀하게 제어할 수 있습니다.

자동 네트워킹 작동 방식

가속기 최적화 머신에는 GPU와 TPU 간의 높은 처리량과 짧은 지연 시간 통신을 지원하는 특수 네트워크 아키텍처가 있습니다. 각 실제 머신에는 여러 GPU 또는 TPU가 포함되어 있으며, NVLink와 같은 고속 상호 연결로 연결되는 경우가 많습니다. 머신에는 일반 네트워킹을 위한 NIC가 하나 이상 있고 고속 상호 연결을 위한 GPU NIC가 여러 개 있습니다.

액셀러레이터 최적화 머신 유형을 사용하는 GKE 노드를 만들면 GKE는 기본 VM에 여러 NIC를 구성합니다. 호스트 NIC는 일반 클러스터 통신 및 관리를 위해 호스트 VPC 네트워크에 연결되어 컨트롤 플레인과 통신합니다. GPU NIC는 GPUDirect 통신을 지원하기 위해 전용 고성능 VPC 네트워크에 연결되며, 이 네트워크는 RDMA가 사용 설정되고 MTU가 높게 (8896) 설정되는 경우가 많습니다.

포드가 GPU 또는 TPU를 요청할 때 노드의 고성능 네트워크 인터페이스에 액세스하도록 구성할 수 있습니다. 사용 가능한 모든 NIC 또는 특정 하위 집합을 요청할 수 있습니다. 요청된 각 네트워크 인터페이스는 단일 포드 전용이며 공유되지 않습니다. 이 네트워크 구성은 포드가 해당 인터페이스의 전체 대역폭과 리소스에 단독으로 액세스할 수 있도록 보장하며, 이는 성능에 민감한 워크로드에 중요한 이점입니다.

제한사항

  • 액셀러레이터 VM의 자동 네트워킹은 Autopilot 클러스터에서 지원되지 않습니다.
  • 자동화된 네트워킹을 사용하려면 클러스터가 GKE Dataplane V2를 사용해야 합니다.
  • 지원되는 머신 유형: 자동 네트워킹은 A3, A4, TPU Trillium (v6e) 가속기 최적화 머신 제품군에서 지원됩니다.
  • 단일 영역 노드 풀 필요: 단일 영역이 있는 노드 풀을 사용해야 합니다.
  • GKE 관리 DRANET을 사용하여 워크로드를 구성하는 경우 GKE 관리 DRANET의 주요 고려사항제한사항을 참고하세요.
  • 동일한 노드 풀에서 다중 네트워크 API와 DRANET을 모두 사용할 수는 없습니다. 포드의 네트워크 연결 방법을 하나 선택해야 합니다.

가속기 최적화 머신 네트워크 구성

가속기 최적화 머신은 유형에 따라 네트워크 구성이 다릅니다. 다음 표에는 다양한 머신 유형의 네트워크 사양이 요약되어 있습니다.

GPU 가속기 VM

머신 유형 GPU 수 티타늄 NIC 수 GPU NIC 수 GPUDirect 기술 추가 VPC
A3 8 (H100) 1 4 TCPX GPU NIC의 경우 4
A3 Mega 8 (H100) 1 8 TCPXO GPU NIC의 경우 8
A3 Ultra 8 (H200) 2 8 RDMA 2 (두 번째 NIC용 1개, GPU NIC용 1개)
A4 8 (B200) 2 8 RDMA 2 (두 번째 NIC용 1개, GPU NIC용 1개)
A4X 4 (GB200) 1 4 RDMA 2 (두 번째 NIC용 1개, GPU NIC용 1개)

TPU 가속기 VM

머신 유형 TPU 칩 수 NIC 수 추가 VPC
TPU Trillium (v6e) (ct6e-standard-4t) 4 2 2 (두 번째 NIC용 1개, 첫 번째 NIC의 추가 VNIC용 1개)

시작하기 전에

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

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

  • 클러스터에 GKE Dataplane V2가 있는지 확인합니다. 새 클러스터를 만들거나 기존 클러스터를 업데이트할 때 이 기능을 사용 설정할 수 있습니다.

    • 새 클러스터를 만듭니다.

      gcloud container clusters create CLUSTER_NAME \
        --cluster-version=CLUSTER_VERSION \
        --enable-dataplane-v2
      

      다음을 바꿉니다.

      • CLUSTER_NAME: 새 클러스터의 이름입니다.
      • CLUSTER_VERSION: 클러스터 버전으로 1.34.1-gke.1829001 이상이어야 합니다.
    • 기존 클러스터를 업데이트합니다.

      gcloud container clusters update CLUSTER_NAME \
          --enable-dataplane-v2
      

      CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  • RDMA를 사용하는 GPU 워크로드를 배포하려는 경우 DeviceClass 리소스가 있는지 확인하세요.

    kubectl get deviceclass mrdma.google.com
    

기본 네트워크 프로필로 노드 풀 만들기

단일 영역 내의 모든 GPU 또는 TPU 머신을 연결하는 네트워크를 자동으로 만들려면 auto 액셀러레이터 네트워크 프로필을 사용하여 노드 풀을 만드세요.

gcloud

자동으로 구성된 네트워크 프로필로 노드 풀을 만들려면 다음 명령어를 실행합니다.

gcloud beta container node-pools create NODE_POOL_NAME \
    --accelerator-network-profile=auto \
    --node-locations=ZONE \
    --machine-type=MACHINE_TYPE

액셀러레이터로 노드 풀을 만드는 방법에 관한 자세한 내용은 Autopilot 노드 풀에서 GPU 실행Autopilot에서 TPU 워크로드 배포를 참고하세요. 이 문서의 안내를 따를 때는 --accelerator-network-profile=auto 플래그를 gcloud container node-pools create 명령어에 추가합니다.

멀티 호스트 TPU 슬라이스 노드 풀의 경우 --tpu-topology 플래그도 추가해야 합니다.

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • ZONE: 노드 풀의 영역입니다.
  • MACHINE_TYPE: 노드의 머신 유형입니다(예: a3-ultragpu-8g).

REST

nodePools.create 메서드 요청에서 accelerator_network_profile 필드를 지정합니다.

{
  "nodePool": {
    "name": "NODE_POOL_NAME",
    "machineType": "MACHINE_TYPE",
    ...
    "accelerator_network_profile": "auto"
  }
}

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • MACHINE_TYPE: 노드의 머신 유형입니다(예: a3-ultragpu-8g).

GPU를 사용하는 워크로드 예약

다음 섹션에서는 GKE 관리 DRANET으로 RDMA 네트워크 인터페이스를 사용하도록 GPU 노드 풀과 워크로드를 구성하는 방법을 보여줍니다. 자세한 내용은 GKE 관리 DRANET을 사용하여 네트워크 리소스 할당을 참고하세요.

GPU 노드 풀에서 GKE 관리형 DRANET 드라이버 사용 설정

RDMA를 지원하는 GPU 노드 풀에서 GKE DRANET 드라이버를 사용 설정하려면 노드 풀을 만들 때 cloud.google.com/gke-networking-dra-driver=true 라벨을 추가합니다.

gcloud beta container node-pools create NODE_POOL_NAME \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --node-locations=NODE_LOCATIONS \
  --accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
  --machine-type=MACHINE_TYPE \
  --num-nodes=NUM_NODES \
  --reservation-affinity=specific \
  --reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
  --accelerator-network-profile=auto \
  --node-labels=cloud.google.com/gke-networking-dra-driver=true

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • REGION: 클러스터의 Google Cloud 리전입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.
  • ACCELERATOR_TYPE: GPU 가속기의 유형입니다.

    예를 들면 다음과 같습니다.

    • A4 VM: nvidia-b200를 입력합니다.
    • A3 Ultra VM: nvidia-h200-141gb를 입력합니다.
  • ACCELERATOR_COUNT: 노드 풀의 노드에 연결할 GPU 수입니다. 예를 들어 a4-highgpu-8g 및 a3-ultragpu-8g VM 모두 GPU 수는 8입니다.

  • DRIVER_VERSION: 사용할 GPU 드라이버 버전입니다. 예를 들면 default 또는 latest입니다.

  • MACHINE_TYPE: 노드 풀의 머신 유형(예: a3-ultragpu-8g)

  • NUM_NODES: 노드 풀의 노드 수입니다. flex-start의 경우 이 값을 0으로 설정해야 합니다.

  • RESERVATION_PROJECT: 예약의 프로젝트 ID입니다.

  • RESERVATION_NAME: 예약의 이름 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.

  • RESERVATION_BLOCK: 예약 내의 특정 블록 이름입니다. 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.

이 명령어는 가속기 네트워크 프로필을 사용하여 가속기 VM의 VPC 네트워크와 서브넷을 자동으로 구성합니다. 또는 VPC 네트워크 및 서브넷을 명시적으로 지정할 수 있습니다.

워크로드 RDMA 리소스 배포

포드에 RDMA 리소스를 할당하려면 ResourceClaimTemplate을 지정합니다.

  1. ResourceClaimTemplate를 만들어 RDMA 기기를 할당하는 방법을 정의합니다. 다음 매니페스트는 노드에서 사용 가능한 모든 mrdma 기기를 요청합니다. 매니페스트를 all-mrdma-template.yaml로 저장합니다.

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: All
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f all-mrdma-template.yaml
    
  3. 워크로드를 배포하고 ResourceClaimTemplate를 참조합니다. 다음 매니페스트는 all-mrdma 템플릿을 참조하는 포드를 배포합니다. 이 템플릿은 포드에 노드의 RDMA 인터페이스에 대한 액세스 권한을 부여합니다. 매니페스트를 agnhost-rdma-pod.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-rdma
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: rdma
          limits:
            nvidia.com/gpu: 1
      resourceClaims:
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  4. 매니페스트를 적용합니다.

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    다음 출력 예시에서는 기본 eth0lo 인터페이스와 할당된 RDMA 인터페이스(예: gpu0rdma0)를 보여줍니다. 네트워크 인터페이스 (NIC)의 수와 이름은 GKE 노드의 머신 유형에 따라 다릅니다.

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

TPU를 사용하는 워크로드 예약

다음 섹션에서는 GKE 관리 DRANET과 함께 RDMA가 아닌 네트워크 인터페이스를 사용하도록 TPU 노드 풀과 워크로드를 구성하는 방법을 보여줍니다. 자세한 내용은 GKE 관리 DRANET을 사용하여 네트워크 리소스 할당을 참고하세요.

네트워킹 DeviceClass 확인

네트워킹을 위한 DeviceClass 리소스가 클러스터에 있는지 확인합니다.

kubectl get deviceclass netdev.google.com

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

NAME                AGE
netdev.google.com   2d22h

TPU 슬라이스 노드 풀에서 GKE 관리형 DRANET 드라이버 사용 설정

TPU 슬라이스 노드 풀을 만들 때 GKE DRANET 드라이버를 사용 설정하려면 cloud.google.com/gke-networking-dra-driver=true 라벨을 추가합니다.

gcloud beta container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_LOCATIONS \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto \
    --node-labels=cloud.google.com/gke-networking-dra-driver=true

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • LOCATION: 클러스터의 Google Cloud 리전 또는 영역입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.
  • NODE_LOCATIONS: 노드 풀에 있는 노드의 Google Cloud 영역입니다.
  • MACHINE_TYPE: 노드에 사용할 머신 유형입니다. TPU 호환 머신 유형에 관한 자세한 내용은 TPU 버전 선택을 참고하세요.
  • TPU_TOPOLOGY: TPU 토폴로지(예: 2x4x4) 토폴로지 형식은 TPU 버전에 따라 달라집니다. TPU 토폴로지에 대해 자세히 알아보려면 토폴로지 선택을 참고하세요.
  • NUM_NODES: 노드 풀의 노드 수입니다.

자세한 내용은 단일 호스트 TPU 슬라이스 노드 풀 만들기를 참고하세요.

모든 네트워크 기기를 요청하는 워크로드 배포

포드에 비RDMA 네트워크 기기를 할당하려면 ResourceClaimTemplate를 지정합니다.

  1. netdev.google.com DeviceClass를 참조하는 ResourceClaimTemplate를 만듭니다. 다음 매니페스트는 노드에서 사용 가능한 모든 비RDMA 네트워크 기기를 요청합니다.

    매니페스트를 all-netdev-template.yaml로 저장합니다.

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-netdev
    spec:
      spec:
        devices:
          requests:
          - name: req-netdev
            exactly:
              deviceClassName: netdev.google.com
              allocationMode: All
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f all-netdev-template.yaml
    
  3. 워크로드를 배포하고 ResourceClaimTemplate를 참조합니다. 다음 매니페스트는 all-netdev 템플릿을 사용하여 포드에 노드의 모든 비RDMA 네트워크 기기에 대한 액세스 권한을 부여하는 포드를 배포합니다. 매니페스트를 netdev-pod.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-netdev
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: netdev
          limits:
            google.com/tpu: 4
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
      resourceClaims:
      - name: netdev
        resourceClaimTemplateName: all-netdev
    

    다음을 바꿉니다.

    • TPU_ACCELERATOR: TPU 가속기 유형(예: tpu-v5p-slice)
    • TPU_TOPOLOGY: TPU 토폴로지(예: 2x4x4)
  4. 매니페스트를 적용합니다.

    kubectl apply -f netdev-pod.yaml
    
  5. 추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    다음 출력 예시에서는 기본 eth0lo 인터페이스와 할당된 네트워크 기기(이름이 eth1eth2와 같음)를 보여줍니다. NIC 수와 이름은 GKE 노드의 머신 유형에 따라 다릅니다.

    eth0
    eth1
    eth2
    lo
    

문제 해결

노드 풀의 네트워크 설정을 확인하려면 다음 명령어를 실행하세요.

gcloud beta container node-pools describe NODE_POOL_NAME \
    --zone=ZONE \
    --cluster=CLUSTER_NAME

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀의 이름입니다.
  • ZONE: 노드 풀의 영역입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.

출력에는 노드 풀에 연결된 추가 네트워크와 서브네트워크가 표시됩니다.

다음 단계