GPUDirect-TCPX로 GPU 네트워크 성능 극대화


가속기 최적화 머신 계열은 Google Cloud가 인공지능(AI), 머신러닝(ML), 고성능 컴퓨팅(HPC)과 같은 GPU 가속 워크로드에 필요한 성능과 효율성을 제공하도록 설계되었습니다.

A3 가속기 최적화 머신 시리즈에는 vCPU 208개와 최대 1,872GB의 메모리가 있습니다. 각 A3 VM에는 8개의 NVIDIA H100 GPU가 연결되어 있으며 GPU당 80GB GPU 메모리를 제공합니다. 이러한 VM은 최대 1,000Gbps의 네트워크 대역폭을 얻을 수 있으므로 대규모 변환기 기반 언어 모델, 데이터베이스, 고성능 컴퓨팅(HPC)에 이상적입니다.

A3 VM을 사용할 때 GPUDirect-TCPX를 사용하여 애플리케이션과 네트워크 간의 지연 시간을 최소화할 수 있습니다. GPUDirect-TCPX는 사용자의 A3 VM의 네트워크 성능을 향상시키기 위해 데이터 패킷 페이로드가 CPU와 시스템 메모리를 거치지 않고 GPU 메모리에서 바로 네트워크 인터페이스로 직접 전송될 수 있게 하는 커스텀 원격 직접 메모리 액세스(RDMA) 네트워킹 스택입니다. A3 VM은 Google Virtual NIC(gVNIC)와 결합된 GPUDirect-TCPX를 사용하여 A2 또는 G2 가속기 최적화 머신 유형에 비해 클러스터의 VM 간에 가장 높은 처리량을 제공할 수 있습니다.

이 문서에서는 Container-Optimized OS를 사용하는 A3 VM에서 GPUDirect-TCPX와 함께 사용할 수 있는 향상된 GPU 네트워크 성능을 설정하고 테스트하는 방법을 보여줍니다.

개요

GPUDirect-TCPX로 네트워크 성능을 테스트하려면 다음 단계를 완료하세요.

  1. 가상 프라이빗 클라우드(VPC) MTU 점보 프레임 네트워크를 설정합니다.
  2. cos-105-lts Container-Optimized OS 이미지를 사용하여 GPU VM을 만듭니다.
  3. 각 VM에 GPU 드라이버를 설치합니다.
  4. 각 VM에서 네트워크 인터페이스 카드(NIC)에 GPU에 대한 액세스 권한을 부여합니다.
  5. NCCL 테스트를 실행합니다.

점보 프레임 MTU 네트워크 설정

a3-highgpu-8g VM에는 5개의 물리적 NIC가 있으며, 물리적 NIC의 성능을 극대화하려면 5개의 가상 프라이빗 클라우드 네트워크를 만들고 MTU를 8244로 설정해야 합니다.

관리 네트워크, 서브넷, 방화벽 규칙 만들기

다음 단계에 따라 관리 네트워크를 설정합니다.

  1. networks create 명령어를 사용하여 관리 네트워크를 만듭니다.

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244
    
  2. networks subnets create 명령어를 사용하여 관리 서브넷을 만듭니다.

    gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-mgmt-net \
      --region=REGION \
      --range=192.168.0.0/24
    
  3. firewall-rules create 명령어를 사용하여 방화벽 규칙을 만듭니다.

    1. 관리 네트워크의 방화벽 규칙을 만듭니다.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=tcp:0-65535,udp:0-65535,icmp \
       --source-ranges=192.168.0.0/16
      
    2. SSH를 사용하여 VM에 연결할 수 있는 소스 IP 주소를 제한하는 tcp:22 방화벽 규칙을 만듭니다.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=tcp:22 \
       --source-ranges=SSH_SOURCE_IP_RANGE
      
    3. 네트워크의 데이터 전송 문제를 확인하는 데 사용할 수 있는 icmp 방화벽 규칙을 만듭니다.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=icmp \
       --source-ranges=0.0.0.0/0
      

다음을 바꿉니다.

  • NETWORK_NAME_PREFIX: Virtual Private Cloud 네트워크 및 서브넷에 사용할 이름 프리픽스
  • PROJECT_ID: 프로젝트 ID
  • REGION: 네트워크를 만들려는 리전
  • SSH_SOURCE_IP_RANGE: CIDR 형식의 IP 범위. 이는 SSH를 사용하여 VM에 연결할 수 있는 소스 IP 주소를 지정합니다.

데이터 네트워크, 서브넷, 방화벽 규칙 만들기

다음 명령어를 사용하여 각각 서브넷과 방화벽 규칙이 있는 데이터 네트워크 4개를 만듭니다.

for N in $(seq 1 4); do
  gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244

  gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-data-net-$N \
      --region=REGION \
      --range=192.168.$N.0/24

  gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-data-net-$N \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
done

Virtual Private Cloud 네트워크를 만드는 방법에 대한 자세한 내용은 점보 프레임 MTU 네트워크 만들기 및 확인을 참조하세요.

GPU VM 만들기

GPUDirect-TCPX로 네트워크 성능을 테스트하려면 A3 VM을 최소 두 개 이상 만들어야 합니다.

  1. cos-105-lts Container-Optimized OS 이미지를 사용하고 이전 단계에서 만든 가상 MTU 네트워크를 지정하여 각 VM을 만듭니다.

    VM은 또한 Google 가상 NIC(gVNIC) 네트워크 인터페이스를 사용해야 합니다. A3 VM의 경우 gVNIC 버전 1.4.0rc3 이상이 필요합니다. 이 드라이버 버전은 Container-Optimized OS에서 사용할 수 있습니다.

    첫 번째 가상 NIC는 일반 네트워킹 및 스토리지를 위한 기본 NIC로 사용되고, 다른 4개의 가상 NIC는 동일한 PCIe 스위치의 8개 GPU 중 2개와 NUMA 정렬됩니다.

    gcloud compute instances create VM_NAME \
      --project=PROJECT_ID \
      --zone=ZONE \
      --machine-type=a3-highgpu-8g \
      --maintenance-policy=TERMINATE --restart-on-failure \
      --image-family=cos-105-lts \
      --image-project=cos-cloud \
      --boot-disk-size=${BOOT_DISK_SZ:-50} \
      --metadata=cos-update-strategy=update_disabled \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address
    

    다음을 바꿉니다.

    • VM_NAME: VM의 이름
    • PROJECT_ID: 프로젝트 ID
    • ZONE: VM의 영역
    • NETWORK_NAME_PREFIX: Virtual Private Cloud 네트워크 및 서브넷에 사용할 이름 프리픽스

GPU 드라이버 설치

각 A3 VM에서 다음 단계를 완료합니다.

  1. 다음 명령어를 실행하여 NVIDIA GPU 드라이버를 설치합니다.

    sudo cos-extensions install gpu -- --version=latest
    
  2. 다음 명령어를 실행하여 경로를 다시 마운트합니다.

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

NIC에 GPU에 대한 액세스 권한 부여

각 A3 VM에서 다음 단계를 완료하여 NIC에 GPU에 대한 액세스 권한을 부여합니다.

  1. 레지스트리를 구성합니다.

    • Container Registry를 사용하는 경우 다음 명령어를 실행합니다.

      docker-credential-gcr configure-docker
      
    • Artifact Registry를 사용하는 경우 다음 명령어를 실행합니다.

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. 수신 데이터 경로 관리자를 구성합니다. 관리 서비스인 GPUDirect-TCPX 수신 데이터 경로 관리자는 GPUDirect-TCPX를 사용하는 애플리케이션과 함께 실행되어야 합니다. 각 Container-Optimized OS VM에서 서비스를 시작하려면 다음 명령어를 실행하세요.

    docker run --pull=always --rm \
      --name receive-datapath-manager \
      --detach \
      --cap-add=NET_ADMIN --network=host \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --device /dev/nvidia0:/dev/nvidia0 \
      --device /dev/nvidia1:/dev/nvidia1 \
      --device /dev/nvidia2:/dev/nvidia2 \
      --device /dev/nvidia3:/dev/nvidia3 \
      --device /dev/nvidia4:/dev/nvidia4 \
      --device /dev/nvidia5:/dev/nvidia5 \
      --device /dev/nvidia6:/dev/nvidia6 \
      --device /dev/nvidia7:/dev/nvidia7 \
      --device /dev/nvidia-uvm:/dev/nvidia-uvm \
      --device /dev/nvidiactl:/dev/nvidiactl \
      --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
      --volume /run/tcpx:/run/tcpx \
      --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \
    us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \
      --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
    
  3. receive-datapath-manager 컨테이너가 시작되었는지 확인합니다.

    docker container logs --follow receive-datapath-manager
    

    출력은 다음과 비슷하게 표시됩니다.

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
    
  4. 로그 보기를 중지하려면 ctrl-c를 누릅니다.

  5. IP 테이블 규칙을 설치합니다.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. NVIDIA Collective Communications Library(NCCL) 및 GPUDirect-TCPX 플러그인을 구성합니다.

    GPUDirect-TCPX를 지원하는 NCCL을 사용하려면 특정 NCCL 라이브러리 버전과 GPUDirect-TCPX 플러그인 바이너리 조합이 필요합니다. Google Cloud는 이 요구사항을 충족하는 패키지를 제공합니다.

    Google Cloud 패키지를 설치하려면 다음 명령어를 실행합니다.

    docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl
    sudo mount --bind /var/lib/tcpx /var/lib/tcpx
    sudo mount -o remount,exec /var/lib/tcpx
    

    이 명령어가 성공하면 libnccl-net.solibnccl.so 파일이 /var/lib/tcpx/lib64 디렉터리에 배치됩니다.

테스트 실행

각 A3 VM에서 다음 단계를 완료하여 NCCL 테스트를 실행합니다.

  1. 컨테이너를 시작합니다.

    #!/bin/bash
    
    function run_tcpx_container() {
    docker run \
      -u 0 --network=host \
      --cap-add=IPC_LOCK \
      --userns=host \
      --volume /run/tcpx:/tmp \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \
      --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
      --device /dev/nvidia0:/dev/nvidia0 \
      --device /dev/nvidia1:/dev/nvidia1 \
      --device /dev/nvidia2:/dev/nvidia2 \
      --device /dev/nvidia3:/dev/nvidia3 \
      --device /dev/nvidia4:/dev/nvidia4 \
      --device /dev/nvidia5:/dev/nvidia5 \
      --device /dev/nvidia6:/dev/nvidia6 \
      --device /dev/nvidia7:/dev/nvidia7 \
      --device /dev/nvidia-uvm:/dev/nvidia-uvm \
      --device /dev/nvidiactl:/dev/nvidiactl \
      --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \
      "$@"
    }
    

    앞의 명령어는 다음을 완료합니다.

    • /dev의 NVIDIA 기기를 컨테이너에 마운트
    • 컨테이너의 네트워크 네임스페이스를 호스트로 설정
    • 호스팅할 컨테이너의 사용자 네임스페이스를 설정
    • 컨테이너 기능에 CAP_IPC_LOCK 추가
    • 호스트의 /tmp를 컨테이너의 /tmp에 마운트
    • NCCL 및 GPUDirect-TCPX NCCL 플러그인의 설치 경로를 컨테이너에 마운트하고 마운트된 경로를 LD_LIBRARY_PATH에 추가
  2. 컨테이너를 시작하면 NCCL을 사용하는 애플리케이션이 컨테이너 내에서 실행될 수 있습니다. 예를 들어 run-allgather 테스트를 실행하려면 다음 단계를 완료합니다.

    1. 각 A3 VM에서 다음을 실행합니다.

      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
      
    2. VM 하나에서 다음 명령어를 실행합니다.

      1. VM 간의 연결을 설정합니다. VM-0VM-1을 각 VM의 이름으로 바꿉니다.

        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
        

        이렇게 하면 각 VM에 /scripts/hostfiles2 디렉터리가 생성됩니다.

      2. 스크립트를 실행합니다.

        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
        

        run-allgather 스크립트를 실행하는 데 약 2분이 소요됩니다. 로그 끝에 all-gather 결과가 표시됩니다.

        NCCL 로그에 다음 줄이 표시되면 GPUDirect-TCPX가 성공적으로 초기화되었는지 확인합니다.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.