GPU 성능 최적화

다음 옵션들을 사용하면 가상 머신(VM) 인스턴스의 GPU 성능을 향상시킬 수 있습니다.

자동 부스트 사용 중지

NVIDIA® K80 GPU에서 자동 부스트 기능을 사용할 때는 시스템이 해당 애플리케이션의 최적 속도를 찾기 위해 클록 속도를 자동으로 조정합니다. 하지만 클록 속도를 지속적으로 조정하면 GPU 성능이 다소 저하될 수도 있습니다. 자동 부스트에 대한 자세한 내용은 GPU 부스트 및 K80 자동 부스트로 성능 향상을 참조하세요.

Compute Engine에서 NVIDIA® K80 GPU를 실행할 때는 자동 부스트를 사용 중지하는 것이 좋습니다.

NVIDIA® K80 GPU가 연결된 인스턴스에서 자동 부스트를 사용 중지하려면 다음 명령어를 실행합니다.

sudo nvidia-smi --auto-boost-default=DISABLED

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

All done.

GPU 클록 속도를 최대 주파수로 설정

NVIDIA® K80 GPU가 연결된 인스턴스에서 GPU 클록 속도를 최대 주파수로 설정하려면 다음 명령어를 실행합니다.

sudo nvidia-smi --applications-clocks=2505,875

최대 100Gbps 네트워크 대역폭 사용

더 높은 대역폭을 사용하는 VM 인스턴스 만들기

더 높은 네트워크 대역폭을 사용하면 Compute Engine에서 실행되는, NVIDIA® A100, T4, or V100 GPU를 사용하는 VM 인스턴스에서 분산 워크로드 성능을 향상시킬 수 있습니다.

GPU 인스턴스에 지원되는 네트워크 대역폭에 대한 자세한 내용은 네트워크 대역폭 및 GPU를 참조하세요.

GPU가 연결되어 있고 네트워크 대역폭이 최대 100Gbps인 VM 인스턴스를 만들려면 다음 안내를 따르세요.

  1. 가능한 최대 대역폭을 얻기 위해 필요한 최소 CPU, GPU, 메모리 구성을 검토합니다.
  2. 연결된 T4 또는 V100 GPU가 있는 VM 인스턴스를 만들려면 연결된 GPU가 있는 VM 만들기를 참조하세요.

    VM 인스턴스를 만들기 위해 사용하는 이미지에는 Compute Engine 가상 네트워크 인터페이스(gVNIC)가 설치되어 있어야 합니다. Compute Engine 가상 네트워크 인터페이스를 지원하는 VM 인스턴스 만들기에 대한 자세한 내용은 Compute Engine 가상 네트워크 인터페이스를 사용하는 VM 인스턴스 만들기를 참조하세요.

    또는 Google Deep Learning VM Image 카탈로그에서 GPU 드라이버, ML 소프트웨어, Compute Engine 네트워크 드라이버가 미리 설치된 tf-latest-gpu-gvnic 이미지를 사용할 수 있습니다.

    예시

    예를 들어 최대 대역폭이 100Gbps이고, V100 GPU가 8개 연결되어 있고, Deep Learning VM Image를 사용하는 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-gvnic \
       --accelerator type=nvidia-tesla-v100,count=8 \
       --maintenance-policy TERMINATE \
       --metadata="install-nvidia-driver=True"  \
       --boot-disk-size 200GB \
       --zone=ZONE
    

    예시

    예를 들어 최대 대역폭이 100Gbps이고, A100 GPU가 8개 연결되어 있고, Deep Learning VM Image를 사용하는 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 tf2-ent-2-3-cu110 \
       --image-project deeplearning-platform-release \
       --boot-disk-size 200GB \
       --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 리전 및 영역 가용성을 참조하세요.
  3. VM 인스턴스를 만든 후에는 네트워크 대역폭을 확인할 수 있습니다.

네트워크 대역폭 확인

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

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

네트워크 대역폭을 측정하려면 다음 단계를 완료하세요.

  1. VM 인스턴스 하나에서 다음 명령어를 실행합니다.

    iperf -s
  2. 다른 VM 인스턴스에서는 다음 명령어를 실행합니다. server_dns_or_internal_ip를 VM 인스턴스의 DNS 또는 내부 IP 주소로 바꿉니다.

    iperf -c server_dns_or_internal_ip -P 16 -t 30

사용 가능한 최대 대역폭이 100Gbps이면 다음을 고려하세요.

  • 가상화 스택에서 이더넷, IP, TCP와 같은 프로토콜의 헤더 오버헤드로 인해 netperf로 측정되는 처리량은 약 90Gbps에서 포화됩니다.

    TCP는 100Gbps 네트워크 속도를 달성할 수 있습니다. UDP와 같은 다른 프로토콜은 현재까지 속도가 느립니다.

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

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

  • 100Gbps 네트워크 대역폭은 단방향으로만 달성할 수 있습니다. TX + RX 합계는 약 100Gbps로 예상될 수 있습니다.

더 높은 네트워크 대역폭 속도와 Fast Socket 사용

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

Fast Socket은 NCCL을 위한 Google 고유의 네트워크 전송 기능입니다. Compute Engine에서 Fast Socket은 여러 TCP 연결 사이의 경합을 줄여서 100Gbps 네트워크에서의 NCCL 성능을 향상시켜 줍니다.

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

Fast Socket 환경을 설정하기 위해 Deep Learning VM Image 또는 Compute Engine 공개 이미지를 사용할 수 있습니다.

Deep Learning VM Image 사용

Fast Socket을 설정하기 위해 Deep Learning VM을 사용할 수 있습니다. Deep Learning VM Image에는 GPU 드라이버, ML 소프트웨어, Fast Socket, Compute Engine 네트워크 드라이버가 사전 설치되어 있습니다.

이러한 이미지에는 다음 항목이 포함됩니다.

  • tf-latest-gpu-debian-10
  • tf-latest-gpu-ubuntu-1804

V100 예시

예를 들어 최대 대역폭이 100Gbps이고, V100 GPU가 8개 연결되어 있고, Deep Learning VM Image와 Fast Socket을 사용하는 Debian 10 VM을 만들려면 다음 명령어를 실행합니다.

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --custom-cpu=96 \
    --custom-memory=624 \
    --image-project=deeplearning-platform-release \
    --image-family=tf-latest-gpu-debian-10 \
    --accelerator=type=nvidia-tesla-v100,count=8 \
    --maintenance-policy=TERMINATE \
    --metadata="install-nvidia-driver=True"  \
    --network-interface=nic-type=GVNIC \
    --boot-disk-size=200GB

A100 예시

예를 들어 최대 대역폭이 100Gbps이고, A100 GPU가 8개 연결되어 있고, Deep Learning VM Image와 Fast Socket을 사용하는 Ubuntu 18.04 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-ubuntu-1804 \
    --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 리전 및 영역 가용성을 참조하세요.

환경을 설정한 후에는 Fast Socket이 사용 설정된 것을 확인할 수 있습니다.

Compute Engine 공개 이미지 사용

Fast Socket을 설정하기 위해 Compute Engine 공개 이미지를 사용할 수 있습니다. Compute Engine 공개 이미지를 사용하려면 다음 단계를 완료합니다.

  1. A100, T4, V100 GPU가 연결된 VM을 만들려면 GPU가 연결된 VM 만들기를 참조하세요.

  2. 이 이미지를 사용하여 연결된 A100, T4, V100 GPU가 있는 VM을 만듭니다. 자세한 내용은 연결된 GPU가 있는 VM 만들기를 참조하세요.

  3. GPU 드라이버를 설치합니다. 자세한 내용은 GPU 드라이버 설치를 참조하세요.

  4. Fast Socket을 설치합니다. 자세한 내용은 수동으로 Fast Socket 설치를 참조하세요.

  5. 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
    ......
    

다음 단계