가속기 최적화 머신 계열은 Google Cloud가 인공지능(AI), 머신러닝(ML), 고성능 컴퓨팅(HPC)과 같은 GPU 가속 워크로드에 필요한 성능과 효율성을 제공하도록 설계되었습니다.
A3 가속기 최적화 머신 시리즈에는 vCPU 208개와 최대 1,872GB의 메모리가 있습니다. 각 a3-highgpu-8g
머신 유형에는 GPU당 80GB의 GPU 메모리를 제공하는 NVIDIA H100 GPU 8개가 연결되어 있습니다. 이러한 VM은 최대 1,000Gbps의 네트워크 대역폭을 얻을 수 있으므로 대규모 변환기 기반 언어 모델, 데이터베이스, 고성능 컴퓨팅(HPC)에 이상적입니다.
a3-highgpu-8g
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-highgpu-8g
VM에서 GPUDirect-TCPX와 함께 사용할 수 있는 향상된 GPU 네트워크 성능을 설정하고 테스트하는 방법을 보여줍니다.
개요
GPUDirect-TCPX로 네트워크 성능을 테스트하려면 다음 단계를 완료하세요.
- 하나 이상의 Virtual Private Cloud(VPC) 네트워크를 설정하고 MTU 설정(점보 프레임이라고도 함)을
8244
로 설정합니다. cos-105-lts
Container-Optimized OS 이미지를 사용하여 GPU VM을 만듭니다.- 각 VM에 GPU 드라이버를 설치합니다.
- 각 VM에서 네트워크 인터페이스 카드(NIC)에 GPU에 대한 액세스 권한을 부여합니다.
- NCCL 테스트를 실행합니다.
점보 프레임 MTU 네트워크 설정
a3-highgpu-8g
VM에는 5개의 물리적 NIC가 있으며, 물리적 NIC의 성능을 극대화하려면 5개의 가상 프라이빗 클라우드 네트워크를 만들고 MTU를 8244
로 설정해야 합니다.
관리 네트워크, 서브넷, 방화벽 규칙 만들기
관리 네트워크를 설정하려면 다음 단계를 완료하세요.
networks create
명령어를 사용하여 관리 네트워크를 만듭니다.gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \ --project=PROJECT_ID \ --subnet-mode=custom \ --mtu=8244
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
firewall-rules create
명령어를 사용하여 방화벽 규칙을 만듭니다.관리 네트워크의 방화벽 규칙을 만듭니다.
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
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
네트워크에서 데이터 전송 문제를 확인하는 데 사용할 수 있는
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
: 프로젝트 IDREGION
: 네트워크를 만들려는 리전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
가상 프라이빗 클라우드 네트워크를 만드는 방법에 관한 자세한 내용은 점보 프레임 MTU 네트워크 만들기 및 확인을 참고하세요.
GPU VM 만들기
GPUDirect-TCPX로 네트워크 성능을 테스트하려면 A3 VM을 2대 이상 만들어야 합니다.
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
: 프로젝트 IDZONE
: VM의 영역NETWORK_NAME_PREFIX
: Virtual Private Cloud 네트워크 및 서브넷에 사용할 이름 프리픽스
GPU 드라이버 설치
각 A3 VM에서 다음 단계를 완료합니다.
다음 명령어를 실행하여 NVIDIA GPU 드라이버를 설치합니다.
sudo cos-extensions install gpu -- --version=latest
다음 명령어를 실행하여 경로를 다시 마운트합니다.
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
NIC에 GPU 액세스 권한 부여
각 A3 VM에서 다음 단계를 완료하여 NIC에 GPU에 대한 액세스 권한을 부여합니다.
레지스트리를 구성합니다.
Container Registry를 사용하는 경우 다음 명령어를 실행합니다.
docker-credential-gcr configure-docker
Artifact Registry를 사용하는 경우 다음 명령어를 실행합니다.
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
수신 데이터 경로 관리자를 구성합니다. 관리 서비스인 GPUDirect-TCPX 수신 데이터 경로 관리자는 GPUDirect-TCPX를 사용하는 애플리케이션과 함께 실행되어야 합니다. 각 Container-Optimized OS VM에서 서비스를 시작하려면 다음 명령어를 실행합니다.
docker run --pull=always --rm \ --name receive-datapath-manager \ --detach \ --privileged \ --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"
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...
로그 보기를 중지하려면
ctrl-c
를 누릅니다.IP 테이블 규칙을 설치합니다.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
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.so
및libnccl.so
파일이/var/lib/tcpx/lib64
디렉터리에 배치됩니다.
테스트 실행
각 A3 VM에서 다음 단계를 완료하여 NCCL 테스트를 실행합니다.
컨테이너를 시작합니다.
#!/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
에 추가합니다.
컨테이너를 시작한 후 NCCL을 사용하는 애플리케이션을 컨테이너 내에서 실행할 수 있습니다. 예를 들어
run-allgather
테스트를 실행하려면 다음 단계를 완료하세요.각 A3 VM에서 다음을 실행합니다.
$ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
VM 하나에서 다음 명령어를 실행합니다.
VM 간의 연결을 설정합니다.
VM-0
및VM-1
을 각 VM의 이름으로 바꿉니다./scripts/init_ssh.sh VM-0 VM-1 pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
이렇게 하면 각 VM에
/scripts/hostfiles2
디렉터리가 생성됩니다.스크립트를 실행합니다.
/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.