GPUDirect-TCPX 및 멀티 네트워킹으로 GPU 네트워크 대역폭 극대화


이 페이지에서는 Standard 모드의 Google Kubernetes Engine(GKE) 클러스터에서 고성능 GPU 워크로드의 네트워크 대역폭과 처리량을 극대화하는 방법을 보여줍니다. 이 페이지는 ML 워크로드를 지원하는 머신러닝(ML) 엔지니어 및 플랫폼 관리자를 대상으로 합니다. 이미 네트워크 인터페이스 카드(NIC) 및 TCP와 같은 네트워킹 기술과 NVIDIA Collective Communications Library(NCCL)와 같은 가속기 기술에 익숙해야 합니다.

인공지능(AI), ML, 고성능 컴퓨팅(HPC) 애플리케이션에는 작업 완료 시간을 단축하여 성능을 최적화하기 위한 강력한 가속이 필요합니다. 예를 들어 대화형 AI 및 이미지 생성에 중점을 둔 ML 모델에는 높은 확장성과 컴퓨팅 성능이 필요합니다.

Google Cloud GPU 슈퍼컴퓨터 정보

Google Cloud에는 확장 가능한 대규모 모델을 위해 설계된 가속기 최적화 슈퍼컴퓨터가 있습니다. 이러한 머신의 이점은 다음과 같습니다.

  • 머신당 NVIDIA H100 GPU 8개
  • 기본 NIC의 최대 200Gbps 대역폭
  • 각각 GPU 데이터 전송에 최대 200Gbps 대역폭을 지원하는 최대 4개의 보조 NIC

이점의 전체 목록은 Compute Engine 문서의 A3 머신 계열을 참조하세요.

GKE 워크로드는 반드시 단일 노드에서 사용 가능한 모든 GPU와 사용 가능한 모든 보조 NIC를 사용하고 사용 가능한 대역폭의 상당 부분을 사용해야 합니다. 이 문서에 설명된 솔루션은 고성능, 높은 처리량, 짧은 지연 시간이 필요한 워크로드에 적합합니다.

대역폭 극대화에 필요한 특징 및 기능

GPU 슈퍼 컴퓨터 노드에서 네트워크 대역폭을 극대화하려면 다음 기능을 모두 사용합니다.

  • GPUDirect-TCPX: GPU와 주고받는 패킷 페이로드를 전송하는 데 필요한 오버헤드를 줄여 GPUDirect-TCPX를 사용하지 않는 GPU에 비해 대규모 처리량을 크게 개선합니다.
  • gVNIC: 패킷 헤더 분할, 흐름 조정, 버퍼 관리와 같은 GPUDirect-TCPX 기능을 사용 설정합니다. GPUDirect-TCPX를 사용하려면 gVNIC가 필요합니다. gVNIC에 대한 자세한 내용은 GPU 노드의 네트워크 트래픽 속도 향상을 참조하세요.
  • 멀티 네트워킹: 가속기 최적화 머신에 보조 NIC를 추가합니다. A3 머신의 경우 NIC 4개를 추가합니다. 각 NIC는 충돌을 피하기 위해 자체 VPC에서 별도의 서브넷과 연결됩니다. 다중 네트워크 지원에 대한 자세한 내용은 포드에 대한 다중 네트워크 지원 설정을 참조하세요.
  • 배치 정책: 리소스 배치 정책을 사용하여 특정 워크로드의 모든 GPU 노드를 물리적으로 가까운 서버에 배치하여 지연 시간을 최소화합니다. 자세한 내용은 GKE 노드를 위한 압축 배치 정의를 참조하세요.

절차 개요

이 모든 기능을 함께 사용하려면 다음을 수행합니다.

  1. 가상 프라이빗 클라우드(VPC) 및 서브넷 만들기
  2. GKE 환경 만들기:
    1. 멀티 네트워킹이 사용 설정된 클러스터 만들기
    2. 다음 특성으로 노드 풀 만들기:
      1. gVNIC 사용 설정
      2. 각 보조 NIC에 지정된 멀티 네트워킹 서브넷
      3. 노드를 지원하는 H100 GPU(보조 NIC 4개 및 GPU 8개)가 있는 A3 머신 계열
      4. 최신 NVIDIA 드라이버 설치
  3. GPUDirect-TCPX 바이너리 및 NCCL 플러그인 설치
  4. 테스트 워크로드를 배포하여 GPUDirect-TCPX 설정 확인

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • H100 GPU의 할당량이 충분한지 확인합니다. 추가 할당량을 요청하려면 GPU 할당량을 참조하세요.

요구사항

  • GPUDirect-TCPX는 GKE 버전 1.27 이상에서 지원되며 다음이 필요합니다.
    • GKE 버전 1.27의 경우 GKE 패치 버전 1.27.7-gke.1121000 이상을 사용합니다.
    • GKE 버전 1.28의 경우 GKE 패치 버전 1.28.8-gke.1095000 이상을 사용합니다.
    • GKE 버전 1.29의 경우 GKE 패치 버전 1.29.3-gke.1093000 이상을 사용합니다.
  • GPU 노드는 NVIDIA 드라이버 버전 535 이상을 사용해야 합니다.
  • GKE Dataplane V2를 사용해야 합니다.

제한사항

다음과 같은 제한사항이 적용됩니다.

  • Autopilot 클러스터에서는 GPUDirect-TCPX를 사용할 수 없습니다.
  • GKE 버전 1.27 이상 및 다음 패치 버전을 사용하는 경우에만 GPUDirect-TCPX를 사용할 수 있습니다.
    • GKE 버전 1.27의 경우 GKE 패치 버전 1.27.7-gke.1121000 이상을 사용합니다.
    • GKE 버전 1.28의 경우 GKE 패치 버전 1.28.8-gke.1095000 이상을 사용합니다.
    • GKE 버전 1.29의 경우 GKE 패치 버전 1.29.3-gke.1093000 이상을 사용합니다.
  • 멀티 인스턴스 GPU 또는 GPU 시간 공유에는 GPUDirect-TCPX를 사용할 수 없습니다.
  • NCCL FastSocket을 사용할 수 없습니다.
  • 환경이 포드 사양에서 hostNetwork: true 설정을 지원해야 합니다.
  • 포드 스토리지에 로컬 SSD를 사용하려면 임시 스토리지에 대한 --ephemeral-storage-local-ssd=count=SSD_COUNT 플래그 또는 액세스 차단에 대한 --local-nvme-ssd-block=count=SSD_COUNT 플래그를 사용하여 기본 A3 VM에 연결할 정확한 로컬 SSD 수를 명시적으로 지정해야 합니다. 이 플래그를 생략하면 포드에서 로컬 SSD를 사용할 수 없습니다. 이 플래그는 데이터 액세스에 로컬 SSD를 사용하려는 경우에만 필요합니다.

    GKE에서 지원되는 머신 크기는 a3-highgpu-8g이고 해당 로컬 SSD 수는 16개입니다.

VPC 및 서브넷 만들기

노드에 추가할 각 가상 NIC마다 프로젝트에 별도의 VPC 네트워크를 만듭니다. 각 VPC에는 내부 네트워크 트래픽을 허용하는 서브넷 및 방화벽 규칙이 있어야 합니다. 대역폭을 극대화하려면 4개의 새 네트워크를 만드는 것이 좋습니다.

  1. 프로젝트의 기본 VPC 서브네트워크를 업데이트하여 포드와 서비스의 보조 IP 주소 범위를 추가합니다.

    gcloud compute networks subnets update DEFAULT_NETWORK \
        --region=REGION \
        --add-secondary-ranges="CLUSTER_NAME-pods=POD_IP_ADDRESS_RANGE,CLUSTER_NAME-services=SERVICE_IP_ADDRESS_RANGE"
    

    다음을 바꿉니다.

    • DEFAULT_NETWORK: 프로젝트의 기본 서브넷 이름입니다.
    • REGION: 기본 서브넷의 리전입니다.
    • CLUSTER_NAME: GKE 클러스터의 이름입니다.
    • POD_IP_ADDRESS_RANGE: 사용할 클러스터에 있는 포드의 IP 주소 범위로서 CIDR 표기법으로 나타냅니다. 예를 들면 10.64.0.0/19입니다.
    • SERVICE_IP_ADDRESS_RANGE: 클러스터에서 사용할 서비스의 IP 주소 범위로서 CIDR 표기법으로 나타냅니다. 포드 범위와 달라야 합니다. 예를 들면 10.65.0.0/19입니다.
  2. 프로젝트에서 각각 서브넷과 방화벽 규칙이 있는 GPUDirect-TCPX의 VPC 네트워크를 만듭니다.

    for N in $(seq 1 4); do
    gcloud compute networks create PROJECT_ID-net-$N \
        --subnet-mode=custom \
        --mtu=8244
    
    gcloud compute networks subnets create PROJECT_ID-sub-$N \
        --network=PROJECT_ID-net-$N \
        --region=REGION \
        --range=SUBNET_RANGE
    
    gcloud compute firewall-rules create PROJECT_ID-internal-$N \
      --network=PROJECT_ID-net-$N \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=SOURCE_RANGE
    done
    

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • REGION: 각 서브넷의 Compute Engine 리전입니다.
    • SUBNET_RANGE: CIDR 표기법으로 표시된 각 서브넷의 IP 주소 범위입니다. 이 예시 명령어는 서브넷 4개에 대해 반복되므로 변수를 사용하여 각 서브넷의 IP 주소를 변경합니다. 예를 들어 첫 번째 서브넷은 192.168.1.0/24, 두 번째 서브넷은 192.168.2.0/24 등을 사용하도록 192.168.$N.0/24를 지정합니다.
    • SOURCE_RANGE: 인그레스 트래픽을 허용하는 방화벽 규칙의 소스 IP 주소 범위로서 CIDR 표기법으로 나타냅니다. 예를 들면 192.168.0.0/16입니다.
  3. 네트워크가 생성되었는지 확인합니다.

    gcloud compute networks list
    

GKE 환경 만들기

멀티 네트워킹(미리보기)을 사용하는 새 GKE 클러스터를 만들고 연결된 H100 GPU와 추가 NIC 4개가 있는 A3 머신을 사용하는 GPU 노드 풀을 만듭니다. 멀티 네트워킹을 사용하도록 기존 클러스터를 업데이트할 수 없습니다.

  1. 클러스터 만들기:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=VERSION \
        --enable-dataplane-v2 --enable-ip-alias \
        --enable-multi-networking \
        --no-enable-autoupgrade \
        --cluster-secondary-range-name=CLUSTER_NAME-pods \
        --services-secondary-range-name=CLUSTER_NAME-services
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 새 클러스터의 이름입니다.
    • LOCATION: 클러스터의 Compute Engine 리전입니다.
    • VERSION: 클러스터의 GKE 버전입니다. 요구사항 섹션의 설명대로 지원되는 버전이어야 합니다.

    또한 이 명령어는 이전 섹션에서 만든 클러스터의 포드 및 서비스에 대한 보조 IP 주소를 명시적으로 지정합니다.

  2. 자신이 만든 VPC 네트워크 및 서브네트워크에 해당하는 클러스터에서 Network 및 GKENetworkParamSet 리소스를 만듭니다.

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc1
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc1
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc2
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc2
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc3
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc3
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc4
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc4
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc1
    spec:
      vpc: PROJECT_ID-net-1
      vpcSubnet: PROJECT_ID-sub-1
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc2
    spec:
      vpc: PROJECT_ID-net-2
      vpcSubnet: PROJECT_ID-sub-2
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc3
    spec:
      vpc: PROJECT_ID-net-3
      vpcSubnet: PROJECT_ID-sub-3
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc4
    spec:
      vpc: PROJECT_ID-net-4
      vpcSubnet: PROJECT_ID-sub-4
      deviceMode: NetDevice
    EOF
    

    이러한 리소스는 GPU 트래픽을 위한 NIC를 패스 스루 모드로 구성하도록 GKE에 지시합니다. GKE는 eBPF를 사용하는 기본 제공 네트워킹 프로그래밍을 이 트래픽에 적용하지 않습니다.

  3. H100 GPU의 노드 풀을 만듭니다.

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --machine-type=a3-highgpu-8g \
        --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \
        --additional-node-network=network=PROJECT_ID-net-1,subnetwork=PROJECT_ID-sub-1 \
        --additional-node-network=network=PROJECT_ID-net-2,subnetwork=PROJECT_ID-sub-2 \
        --additional-node-network=network=PROJECT_ID-net-3,subnetwork=PROJECT_ID-sub-3 \
        --additional-node-network=network=PROJECT_ID-net-4,subnetwork=PROJECT_ID-sub-4 \
        --enable-gvnic \
        --no-enable-autoupgrade \
        [--ephemeral-storage-local-ssd=count=16]
    

    NODE_POOL_NAME을 노드 풀의 이름으로 바꿉니다.

    이 명령어가 실패하면 프로젝트에 H100 GPU 할당량이 충분하지 않을 수 있습니다. 할당량이 있는지 확인하고 명령어를 다시 시도합니다.

  4. 클러스터의 노드 목록을 가져옵니다.

    kubectl get nodes
    
  5. 각 GPU 노드에 GPU가 8개 있는지 확인합니다.

    kubectl describe node NODE_NAME
    

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

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

GPUDirect-TCPX 설치 및 NCCL 구성

이 섹션에서는 DaemonSet를 사용하여 GPUDirect-TCPX 바이너리와 특정 NCCL을 설치하는 방법을 보여줍니다.

  1. DaemonSet 매니페스트를 검토합니다.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nccl-tcpx-installer
      namespace: kube-system
      labels:
        k8s-app: nccl-tcpx-installer
    spec:
      selector:
        matchLabels:
          k8s-app: nccl-tcpx-installer
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            name: nccl-tcpx-installer
            k8s-app: nccl-tcpx-installer
        spec:
          priorityClassName: system-node-critical
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: cloud.google.com/gke-accelerator
                        operator: In
                        values:
                          - nvidia-h100-80gb
          tolerations:
            - operator: "Exists"
          hostNetwork: true
          hostPID: true
          volumes:
            - name: var-lib
              hostPath:
                path: /var/lib
            - name: tcpx
              hostPath:
                path: /var/lib/tcpx
            - name: library-dir-host
              hostPath:
                path: /home/kubernetes/bin
          initContainers:
            - image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx-dev:v3.1.9
              name: nccl-tcpx-installer
              resources:
                requests:
                  cpu: 150m
              securityContext:
                privileged: true
              volumeMounts:
                - name: var-lib
                  mountPath: /var/lib
                - name: library-dir-host
                  mountPath: /usr/local
              command: ["/bin/sh", "-c"]
              args:
                - |
                  set -ex
                  /scripts/container_entry.sh install --install-nccl
                  mkdir -p /usr/local/nvidia/lib64
                  cp -r /var/lib/tcpx/lib64/. /usr/local/nvidia/lib64
                  echo "installation finishes"
          containers:
            - image: "gcr.io/google-containers/pause:2.0"
              name: pause
    

    이 DaemonSet에서 다음을 수행합니다.

    1. 노드에 NCCL 라이브러리와 GPUDirect-TCPX 바이너리를 설치합니다.
    2. 라이브러리와 바이너리를 VM의 /home/kubernetes/bin/nvidia/lib64 디렉터리에 저장합니다. 기본적으로 GKE는 NCCL 및 GPUDirect-TCPX를 사용해야 하는 GPU 컨테이너의 /usr/local/nvidia/lib64 경로에 이 디렉터리를 마운트합니다.
  2. DaemonSet를 배포합니다.

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

    NCCL 플러그인은 실행을 시작하는 데 약 2분 정도 걸립니다.

  3. DaemonSet 포드의 상태를 확인합니다.

    kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
    

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

    nccl-tcpx-installer-6c2pv                    1/1     Running   0          2m11s
    nccl-tcpx-installer-qgg82                    1/1     Running   0          2m11s
    

테스트 워크로드 배포

이 섹션에서는 샘플 워크로드를 배포하여 NCCL 및 GPUDirect-TCPX가 예상대로 작동하는지 확인합니다. 이 워크로드에는 포드가 GPUDirect-TCPX를 사용할 수 있는 서비스를 실행하는 tcpx-daemon이라는 사이드카 컨테이너가 포함됩니다. 이 사이드카 컨테이너를 GPUDirect-TCPX를 사용해야 하는 자체 환경의 모든 포드에 추가해야 합니다. 매니페스트에 추가해야 하는 필수 필드의 스니펫은 이 문서의 매니페스트에 GPUDirect-TCPX 추가를 참조하세요.

  1. GitHub의 nccl-config-default.yaml ConfigMap 매니페스트를 검토합니다. 이 매니페스트는 NCCL allgather 테스트를 초기화하는 스크립트를 배포하고 NCCL 관련 환경 변수를 설정합니다.
  2. GitHub의 nccl-test.yaml 매니페스트를 검토합니다. 이 매니페스트는 다음을 수행합니다.

    1. H100 GPU가 있는 노드에서 각각 실행되는 포드 2개를 배포합니다.
    2. 포드가 GPUDirect-TCPX를 사용할 수 있도록 각 포드에 tcpx-daemon이라는 사이드카 컨테이너를 배포합니다.
  3. ConfigMap 및 테스트 워크로드를 배포합니다.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config-default.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test.yaml
    
  4. 다음 명령어를 실행하여 노드의 NCCL all-gather 테스트를 트리거합니다.

    head_pod=$(kubectl get pods --output='custom-columns=POD:.metadata.name' --no-headers | head -n1)
    
    nodes=($(kubectl get pods --output='custom-columns=NODE:.spec.nodeName' --no-headers))
    
    kubectl exec --stdin --tty --container=nccl-test ${head_pod} -- /configs/allgather.sh ${nodes[@]}
    

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

    #                                                              out-of-place                       in-place
    #       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
         1048576         16384     float    none      -1    696.8    1.50    1.41      0    729.0    1.44    1.35      0
         2097152         32768     float    none      -1    776.4    2.70    2.53      0    726.7    2.89    2.71      0
         4194304         65536     float    none      -1    774.3    5.42    5.08      0    805.1    5.21    4.88      0
         8388608        131072     float    none      -1    812.1   10.33    9.68      0    817.6   10.26    9.62      0
        16777216        262144     float    none      -1   1035.2   16.21   15.19      0   1067.8   15.71   14.73      0
        33554432        524288     float    none      -1   1183.3   28.36   26.59      0   1211.8   27.69   25.96      0
        67108864       1048576     float    none      -1   1593.4   42.12   39.49      0   1510.5   44.43   41.65      0
       134217728       2097152     float    none      -1   2127.8   63.08   59.13      0   2312.7   58.03   54.41      0
       268435456       4194304     float    none      -1   3603.0   74.50   69.85      0   3586.2   74.85   70.17      0
       536870912       8388608     float    none      -1   7101.7   75.60   70.87      0   7060.9   76.03   71.28      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : 29.8293
    

NCCL 환경 변수를 사용하여 성능 개선

원하는 경우 특정 환경 변수를 설정하여 NCCL을 사용하는 워크로드의 성능을 개선할 수 있습니다. 테스트 워크로드 배포 섹션에서 배포하는 nccl-config-default.yaml ConfigMap은 기본적으로 일부 NCCL 변수를 설정합니다. 변수 구성은 ConfigMap의 run-nccl.sh 스크립트에 저장됩니다.

NCCL 환경 변수를 변경하려면 업데이트된 ConfigMap 매니페스트를 수정된 변수로 배포합니다. GitHub의 nccl-config-latest.yaml 매니페스트에는 업데이트된 run-nccl.sh 스크립트와 모든 권장 변수가 포함되어 있습니다.

다음 명령어는 업데이트된 nccl-config-latest.yaml ConfigMap을 사용하는 기본 변수가 있는 기존 ConfigMap을 업데이트합니다.

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config-latest.yaml

Kubernetes가 ConfigMap을 업데이트하는 데 약 2분 정도 걸립니다.

NCCL 환경 변수를 확인하려면 다음 명령어를 실행합니다.

head_pod=$(kubectl get pods --output='custom-columns=POD:.metadata.name' --no-headers | head -n1)

kubectl exec --stdin --tty --container=nccl-test ${head_pod} -- cat /configs/run-nccl.sh

매니페스트에 GPUDirect-TCPX 추가

이 섹션에서는 포드가 GPUDirect-TCPX를 사용할 수 있도록 Kubernetes 매니페스트에 추가해야 하는 필수 필드를 제공합니다.

  1. 포드 사양에 다음 필드를 추가합니다.

    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      volumes:
      - name: libraries
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib64
      - name: tcpx-socket
        hostPath:
          path: /run/tcpx
    
  2. tcpx-daemon 서비스를 실행하려면 매니페스트에 다음 컨테이너를 추가합니다.

    - name: tcpx-daemon
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
      command:
        - /tcpgpudmarxd/build/app/tcpgpudmarxd
        - --gpu_nic_preset
        - a3vm
        - --gpu_shmem_type
        - fd
        - --uds_path
        - /run/tcpx
        - --setup_param
        - \"--verbose 128 2 0 \"
      securityContext:
        privileged: true
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
        - name: tcpx-socket
          mountPath: /run/tcpx
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  3. GPU를 요청하는 모든 컨테이너에 다음 볼륨 마운트를 추가합니다.

    volumeMounts:
    - name: tcpx-socket
      mountPath: /tmp
    - name: libraries
      mountPath: /usr/local/nvidia/lib64
    
  4. 모든 GPU 컨테이너에 다음 환경 변수를 추가합니다.

    env:
    - name: LD_LIBRARY_PATH
      value: /usr/local/nvidia/lib64
    
  5. 필요한 경우 환경 변수를 추가하여 NCCL 옵션을 구성합니다. 자세한 내용은 이 문서의 NCCL 환경 변수를 사용하여 성능 개선 섹션을 참조하세요.

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

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    name: example-pod
spec:
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  containers:
  - name: tcpx-daemon
    image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
    command:
      - /tcpgpudmarxd/build/app/tcpgpudmarxd
      - --gpu_nic_preset
      - a3vm
      - --gpu_shmem_type
      - fd
      - --uds_path
      - /run/tcpx
      - --setup_param
      - \"--verbose 128 2 0 \"
    securityContext:
      privileged: true
    volumeMounts:
      - name: libraries
        mountPath: /usr/local/nvidia/lib64
      - name: tcpx-socket
        mountPath: /run/tcpx
    env:
      - name: LD_LIBRARY_PATH
        value: /usr/local/nvidia/lib64
    - name: nccl-test
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx:v3.1.2
      imagePullPolicy: Always
      command:
        - /bin/sh
        - -c
        - "while true; do echo hello; sleep 1; done"
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      volumeMounts:
        - name: tcpx-socket
          mountPath: /run/tcpx
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
  volumes:
    - name: libraries
      hostPath:
        path: /home/kubernetes/bin/nvidia/lib64
    - name: tcpx-socket
      hostPath:
        path: /run/tcpx