더 높은 네트워크 대역폭 사용


100Gbps 이상의 더 높은 네트워크 대역폭을 사용해서 GPU VM에서 실행되는 분산 워크로드의 성능을 향상시킬 수 있습니다.

NVIDIA T4 또는 V100 GPU가 연결된 N1 범용 VM의 일부 VM 구성 및 일부 가속기에 최적화된 머신 유형에서는 더 높은 네트워크 대역폭이 지원됩니다.

이러한 더 높은 네트워크 대역폭 속도를 지원하는 구성 또는 머신 유형을 검토하려면 네트워크 대역폭 및 GPU를 참조하세요.

Compute Engine에 대한 일반적인 네트워크 대역폭 정보는 네트워크 대역폭을 참조하세요.

개요

각 GPU VM에 제공되는 더 높은 네트워크 대역폭을 사용하려면 다음 권장 단계를 수행합니다.

  1. Google Virtual NIC(gVNIC)를 지원하는 OS 이미지를 사용하여 GPU VM을 만듭니다. A3 VM의 경우 Container-Optimized OS 이미지를 사용하는 것이 좋습니다.
  2. 선택사항: Fast Socket을 설치합니다. Fast Socket은 여러 TCP 연결 사이의 경합을 줄여서 100Gbps 이상 네트워크에서 NCCL 성능을 향상시켜 줍니다. 일부 Deep Learning VM Image(DLVM)에는 Fast Socket이 사전 설치되어 있습니다.

Deep Learning VM Image 사용

Deep Learning VM Image 프로젝트에서 GPU 지원 이미지를 사용하여 VM을 만들 수 있습니다. 모든 GPU 지원 DLVM 이미지에는 GPU 드라이버, ML 소프트웨어, gVNIC가 사전 설치되어 있습니다. DLVM 이미지 목록은 이미지 선택을 참조하세요.

Fast Socket을 사용하려면 tf-latest-gpu-debian-10 또는 tf-latest-gpu-ubuntu-1804와 같은 DLVM 이미지를 선택할 수 있습니다.

더 높은 네트워크 대역폭을 사용하는 VM 만들기

더 높은 네트워크 대역폭을 위해서는 Google Virtual NIC(gVNIC)를 사용 설정하는 것이 좋습니다. 자세한 내용은 Google Virtual NIC 사용을 참조하세요.

A3 VM의 경우 gVNIC 버전 1.4.0rc3 이상이 필요합니다. 이 드라이버 버전은 Container-Optimized OS에서 사용할 수 있습니다. 그 밖의 모든 운영체제의 경우에는 gVNIC 버전 1.4.0rc3 이상을 설치해야 합니다.

GPU가 연결되어 있고 더 높은 네트워크 대역폭의 VM을 만들려면 다음을 수행합니다.

  1. 다음을 검토하세요.

    • T4 또는 V100 GPU가 연결된 N1 GPU VM의 경우: CPU, GPU, 메모리 구성의 최대 대역폭을 검토합니다.
    • A3, A2, G2 가속기에 최적화된 VM의 경우: 머신 유형의 최대 대역폭을 검토합니다.

    자세한 내용은 사용 가능한 최대 대역폭을 참조하세요.

  2. GPU VM을 만듭니다. 다음 예시에서는 V100 VM이 연결된 A3, A2, N1을 만드는 방법을 보여줍니다.

    이 예시에서 VM은 Google Cloud CLI를 사용하여 생성됩니다. 하지만 Google Cloud 콘솔 또는 Compute Engine API를 사용하여 VM을 만들 수도 있습니다. GPU VM 만들기에 대한 자세한 내용은 GPU가 연결된 VM 만들기를 참조하세요.

    A2(A100)

    예를 들어 최대 대역폭이 100Gbps이고, 8개의 A100 GPU가 연결되어 있고, tf-latest-gpu DLVM 이미지를 사용하는 VM을 만들려면 다음 명령어를 실행합니다.

    gcloud compute instances create VM_NAME \
     --project=PROJECT_ID \
     --zone=ZONE \
     --machine-type=a2-highgpu-8g \
     --maintenance-policy=TERMINATE --restart-on-failure \
     --image-family=tf-latest-gpu \
     --image-project=deeplearning-platform-release \
     --boot-disk-size=200GB \
     --network-interface=nic-type=GVNIC \
     --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
     --scopes=https://www.googleapis.com/auth/cloud-platform
    

    다음을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • PROJECT_ID: 프로젝트 ID입니다.
    • ZONE: VM의 영역입니다. 이 영역은 지정된 GPU 유형을 지원해야 합니다. 영역에 대한 자세한 내용은 GPU 리전 및 영역 가용성을 참조하세요.

    A3(H100)

    네트워크 성능이 향상된 A3 VM을 설정하는 방법에 대한 자세한 내용은 GPUDirect-TCPX로 네트워크 성능 향상을 참조하세요.

    N1(V100)

    예를 들어 최대 대역폭이 100Gbps이고, 8개의 V100 GPU가 연결되어 있고, tf-latest-gpu DLVM 이미지를 사용하는 VM을 만들려면 다음 명령어를 실행합니다.

    gcloud compute instances create VM_NAME \
     --project PROJECT_ID \
     --custom-cpu 96 \
     --custom-memory 624 \
     --image-project=deeplearning-platform-release \
     --image-family=tf-latest-gpu \
     --accelerator type=nvidia-tesla-v100,count=8 \
     --maintenance-policy TERMINATE \
     --metadata="install-nvidia-driver=True"  \
     --boot-disk-size 200GB \
     --network-interface=nic-type=GVNIC \
     --zone=ZONE
    
  3. GPU 지원 Deep Learning VM Image 또는 Container-Optimized OS를 사용하지 않을 경우 GPU 드라이버를 설치합니다. 자세한 내용은 GPU 드라이버 설치를 참조하세요.

  4. 선택사항. VM에서 Fast Socket을 설치합니다.

  5. VM을 설정한 후에는 네트워크 대역폭을 확인할 수 있습니다.

Fast Socket 설치

NVIDIA Collective Communications Library(NCCL)는 멀티 GPU 및 멀티 노드 학습을 위해 TensorFlow, PyTorch, Horovod와 같은 딥 러닝 프레임워크에서 사용됩니다.

Fast Socket은 NCCL을 위한 Google 고유의 네트워크 전송 기능입니다. Compute Engine에서 Fast Socket은 여러 TCP 연결 사이의 경합을 줄여서 100Gbps 네트워크에서의 NCCL 성능을 향상시켜 줍니다. NCCL 작업에 대한 자세한 내용은 NCCL 사용자 가이드를 참조하세요.

현재 평가에 따르면 Fast Socket이 메시지 크기에 따라 all-reduce 처리량을 30%~60% 정도 향상시켜주는 것으로 확인됩니다.

Fast Socket 환경을 설정하기 위해서는 Fast Socket이 사전 설치된 Deep Learning VM Image를 사용하거나 Linux VM에 Fast Socket을 수동으로 설치할 수 있습니다. Fast Socket이 사전 설치되어 있는지 확인하려면 Fast Socket이 사용 설정되었는지 확인을 참조하세요.

Linux VM에서 Fast Socket을 설치하려면 먼저 NCCL을 설치해야 합니다. 자세한 내용은 NVIDIA NCCL 문서를 참조하세요.

CentOS/RHEL

CentOS 또는 RHEL VM에서 Fast Socket을 다운로드하고 설치하려면 다음 단계를 완료합니다.

  1. 패키지 저장소를 추가하고 공개 키를 가져옵니다.

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. Fast Socket을 설치합니다.

    sudo yum install google-fast-socket
    
  3. Fast Socket이 사용 설정되었는지 확인합니다.

SLES

SLES VM에서 Fast Socket을 다운로드하고 설치하려면 다음 단계를 완료합니다.

  1. 패키지 저장소를 추가합니다.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. 저장소 키를 추가합니다.

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. Fast Socket을 설치합니다.

    sudo zypper install google-fast-socket
    
  4. Fast Socket이 사용 설정되었는지 확인합니다.

Debian/Ubuntu

Debian 또는 Ubuntu VM에서 Fast Socket을 다운로드하고 설치하려면 다음 단계를 완료합니다.

  1. 패키지 저장소를 추가합니다.

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. 저장소 키를 추가합니다.

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Fast Socket을 설치합니다.

    sudo apt update && sudo apt install google-fast-socket
    
  4. Fast Socket이 사용 설정되었는지 확인합니다.

Fast Socket이 사용 설정되었는지 확인

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

  1. NCCL 홈 디렉터리를 찾습니다.

    sudo ldconfig -p | grep nccl

    예를 들어 DLVM 이미지에서는 다음과 같이 출력됩니다.

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    여기에서 NCCL 홈 디렉터리는 /usr/local/nccl2입니다.

  2. NCCL이 Fast Socket 플러그인을 로드하는지 확인합니다. 확인하려면 NCCL 테스트 패키지를 다운로드해야 합니다. 테스트 패키지를 다운로드하려면 다음 명령어를 실행합니다.

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    NCCL_HOME_DIRECTORY를 NCCL 홈 디렉터리로 바꿉니다.

  3. nccl-tests 디렉터리에서 all_reduce_perf 프로세스를 실행합니다.

    NCCL_DEBUG=INFO build/all_reduce_perf

    Fast Socket이 사용 설정되었으면 FastSocket plugin initialized 메시지가 출력 로그에 표시됩니다.

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

네트워크 대역폭 확인

높은 대역폭 GPU로 작업할 때는 iperf2와 같은 네트워크 트래픽 도구를 사용해서 네트워킹 대역폭을 측정할 수 있습니다.

대역폭 속도를 확인하려면 GPU가 연결되어 있고 테스트 중인 대역폭 속도를 지원할 수 있는 VM이 2개 이상 필요합니다.

iPerf를 사용하여 Debian 기반 시스템에서 벤치마크를 수행합니다.

  1. 필요한 대역폭 속도를 지원할 수 있는 2개의 VM을 만듭니다.

  2. 두 VM이 모두 실행되면 SSH를 사용하여 VM 중 하나에 연결합니다.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    다음을 바꿉니다.

    • VM_NAME: 첫 번째 VM의 이름입니다.
    • PROJECT_ID: 프로젝트 ID입니다.
  3. 첫 번째 VM에서 다음 단계를 완료하세요.

    1. iperf를 설치합니다.

      sudo apt-get update && sudo apt-get install iperf
      
    2. 이 VM의 내부 IP 주소를 가져옵니다. 이를 기록하여 관리합니다.

      ip a
      
    3. iPerf 서버를 시작합니다.

      iperf -s
      

      그러면 벤치마크를 수행하기 위해 연결을 수신 대기하는 서버가 시작됩니다. 테스트 기간 동안 계속 실행되게 둡니다.

  4. 새 클라이언트 터미널에서 SSH를 사용하여 두 번째 VM에 연결합니다.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    다음을 바꿉니다.

    • VM_NAME: 두 번째 VM의 이름입니다.
    • PROJECT_ID: 프로젝트 ID입니다.
  5. 두 번째 VM에서 다음 단계를 완료하세요.

    1. iPerf를 설치합니다.

      sudo apt-get update && sudo apt-get install iperf
      
    2. iperf 테스트를 실행하고 첫 번째 VM의 IP 주소를 대상으로 지정합니다.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      그러면 30초 테스트를 실행하고 다음 출력과 유사한 결과를 생성합니다. iPerf가 다른 VM에 연결할 수 없으면 VM 또는 Google Cloud 콘솔에서 네트워크나 방화벽 설정을 조정해야 할 수 있습니다.

사용 가능한 최대 대역폭이 100Gbps 또는 1000Gbps(A3)이면 다음을 고려하세요.

  • 가상화 스택에서 이더넷, IP, TCP와 같은 프로토콜의 헤더 오버헤드로 인해 netperf로 측정되는 처리량은 약 90Gbps 도는 800Gbps(A3)에서 포화됩니다. 일반적으로 이를 goodput이라고 부릅니다.

    TCP는 100Gbps 또는 1,000Gbps 네트워크 속도를 달성할 수 있습니다. UDP와 같은 다른 프로토콜은 속도가 더 느립니다.

  • 프로토콜 오버헤드 및 네트워크 정체와 같은 요인들로 인해 데이터 스트림의 엔드 투 엔드 성능은 이보다 약간 낮을 수 있습니다.

  • VM 인스턴스 간에 최대 대역폭을 달성하려면 TCP 스트림을 여러 개 사용해야 합니다. Google에서는 4~16개 스트림이 권장됩니다. 스트림 수가 16개일 때 최대 처리량을 얻을 가능성이 높습니다. 애플리케이션 및 소프트웨어 스택에 따라 애플리케이션 또는 코드 설정을 조정하여 스트림을 여러 개 설정해야 할 수 있습니다.

다음 단계