GKE는 조직의 다양한 워크로드를 실행할 수 있는 단일 플랫폼을 제공하여 여러 플랫폼을 관리하는 운영 부담을 줄여줍니다. 고성능 분산 사전 학습, 모델 미세 조정, 모델 추론, 애플리케이션 서빙, 지원 서비스와 같은 워크로드를 실행할 수 있습니다.
이 페이지에서는 GPUDirect-TCPXO, GPUDirect-TCPX, gVNIC, 멀티 네트워킹을 사용하여 Google Kubernetes Engine (GKE) Autopilot 클러스터를 만드는 방법을 알아봅니다. Standard 클러스터를 사용하는 경우 A3 Mega 또는 A3 High를 사용하는 GKE Standard 클러스터 만들기를 참고하세요.
이 페이지는 ML 워크로드를 지원하는 머신러닝(ML) 엔지니어 및 플랫폼 관리자를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요.
인공지능(AI), ML, 고성능 컴퓨팅(HPC) 애플리케이션에는 작업 완료 시간을 단축하여 성능을 최적화하기 위한 강력한 가속이 필요합니다. 예를 들어 대화형 AI 및 이미지 생성에 중점을 둔 ML 모델에는 높은 확장성과 컴퓨팅 성능이 필요합니다.
이 페이지를 읽기 전에 네트워크 인터페이스 카드(NIC) 및 TCP와 같은 네트워킹 기술과 NVIDIA Collective Communications Library(NCCL)와 같은 가속기 기술을 숙지해야 합니다.
Google Cloud GPU 머신 유형 정보
Google Cloud 는 다양한 워크로드를 지원하기 위해 여러 머신 유형을 제공합니다. 가속기 최적화 A 시리즈 머신 유형, 특히 후기 세대 A 시리즈는 확장 가능한 대규모 모델에 적합합니다. 이러한 GPU 머신 유형은 최대 3,600Gbps의 네트워크 대역폭을 사용할 수 있습니다.
GKE 워크로드는 단일 노드에서 사용 가능한 모든 GPU와 사용 가능한 모든 보조 NIC를 사용하고 사용 가능한 대역폭의 상당 부분을 사용해야 합니다. 이 문서에서 설명하는 솔루션은 고성능, 높은 처리량, 짧은 지연 시간을 요구하는 워크로드에 적합합니다.
대역폭 극대화에 필요한 특징 및 기능
여기에서 설명하는 A3 Mega 및 A3 High 머신 유형을 비롯한 A3 머신 시리즈에서 네트워크 대역폭을 극대화하려면 다음 기능을 모두 사용합니다.
- GPUDirect 네트워킹 스택: A3 머신 시리즈는 커스텀 원격 직접 메모리 액세스(RDMA)를 위한 세 가지 네트워킹 스택을 지원합니다.
- A3 High 머신 유형 및 NVIDIA H100 GPU에서는 GPUDirect-TCPX를 사용하여 GPU와 주고받는 패킷 페이로드를 전송하는 데 필요한 오버헤드를 줄이므로 GPUDirect를 사용하지 않는 GPU에 비해 대규모 처리량이 크게 개선됩니다.
- A3 Mega 머신 유형 및 NVIDIA H100 Mega GPU에서는 GPU와 VM 간의 통신을 더욱 개선하는 GPUDirect-TCPXO를 사용합니다.
- A3 Ultra 머신 유형 및 NVIDIA H200 GPU, 이후 머신 시리즈(예: A4, A4X, A4X Max)에서는 GPUDirect RDMA를 사용하여 처리량을 더욱 개선하면서 분산 AI 워크로드를 실행합니다. 시작하려면 A4 또는 A3 Ultra를 사용하는 AI 최적화 GKE 클러스터를 만드세요.
- gVNIC: 패킷 헤더 분할, 흐름 스티어링, 버퍼 관리와 같은 GPUDirect 기능을 사용 설정합니다. GPUDirect-TCPX 또는 GPUDirect-TCPXO를 사용하려면 gVNIC가 필요합니다. gVNIC에 대한 자세한 내용은 GPU 노드의 네트워크 트래픽 속도 향상을 참조하세요.
- 멀티 네트워킹: 가속기 최적화 머신에 보조 NIC를 추가합니다. 각 NIC는 충돌을 피하기 위해 자체 VPC에서 별도의 서브넷과 연결됩니다. 다중 네트워크 지원에 대한 자세한 내용은 포드에 대한 다중 네트워크 지원 설정을 참조하세요.
- 배치 정책: 리소스 배치 정책으로 특정 워크로드의 모든 GPU 노드를 물리적으로 가까운 서버에 배치하여 지연 시간을 최소화합니다. 자세한 내용은 GKE 노드를 위한 압축 배치 정의를 참고하세요.
절차 개요
이 모든 기능을 함께 사용하려면 다음을 수행합니다.
- 가상 프라이빗 클라우드(VPC) 및 서브넷 만들기
- GKE 환경 만들기
- GPUDirect 바이너리 및 NCCL 플러그인 설치
- NRI 기기 인젝터 플러그인 배포
- 테스트 워크로드를 배포하여 GPUDirect 설정 확인
- 자체 워크로드에 GPUDirect 채택
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- A3 Mega 또는 A3 High VM의 용량이 있는지 확인합니다. 이 용량을 확보하려면 먼저 소비 옵션 중에서 선택하세요. 이 페이지의 안내를 따르려면 온디맨드 용량, 온디맨드 예약, 미래용 예약 또는 최대 90일간의 미래용 예약 (캘린더 모드)을 사용하면 됩니다. 소비 옵션을 선택한 후 해당 안내에 따라 선택한 소비 옵션을 사용하여 용량을 확보합니다.
- H100 GPU의 할당량이 충분한지 확인합니다. 할당량 상향을 요청하려면 GPU 할당량을 참조하세요.
요구사항
다음 요구사항은 달리 명시되지 않는 한 GPUDirect-TCPX 및 GPUDirect-TCPXO 모두에 적용됩니다.
- GKE A3 High 노드에서 GPUDirect-TCPX를 사용하려면 다음 최소 GKE 패치 버전을 실행해야 합니다.
- GKE 버전 1.31의 경우 패치 버전 1.31.1-gke.1621000 이상을 사용합니다.
- GKE 버전 1.32~1.33의 경우 모든 패치 버전을 사용합니다.
- GKE 버전 1.34의 경우 패치 버전 1.34.5-gke.1153000 이상을 사용합니다.
- GKE 버전 1.35의 경우 패치 버전 1.35.2-gke.1485000 이상을 사용합니다.
- GKE 버전 1.36 이상의 경우 모든 패치 버전을 사용할 수 있습니다.
- GPU 노드에서 NVIDIA 드라이버 버전 535 이상을 사용해야 합니다.
- GKE Dataplane V2를 사용해야 합니다.
- GKE 버전 1.34 이상에서는 GPUDirect-TCPX 설치 프로그램 버전 3.1.9 이상과 GPUDirect-TCPX 사이드카 버전 2.0.12 이상을 사용해야 합니다. 설치 프로그램과 사이드카 버전은 일대일 매핑이 있으며 서로 대응해야 합니다. 예를 들어 설치 프로그램 버전 3.1.12는 사이드카 버전 2.0.15에 해당합니다. 설치 프로그램 및 사이드카 버전에 관한 자세한 내용은 GPUDirect-TCPX 출시 노트를 참고하세요.
- 여러 노드 풀에서 실행되는 GPUDirect-TCPX 또는 GPUDirect-TCPXO 워크로드의 경우 모든 노드 풀이 동일한 Compute Engine 영역에 있어야 하며 VPC 및 서브넷과 같은 동일한 네트워크 세트를 사용해야 합니다.
제한사항
다음과 같은 제한사항이 적용됩니다.
- GPUDirect-TCPX 및 GPUDirect-TCPXO는 멀티 인스턴스 GPU, GPU 시간 공유 또는 NVIDIA MPS를 지원하지 않습니다.
- GPUDirect-TCPX 또는 GPUDirect-TCPXO에서는 NCCL FastSocket을 사용할 수 없습니다.
- GKE 워크로드는 반드시 단일 노드에서 사용 가능한 모든 GPU와 사용 가능한 모든 보조 NIC를 사용해야 합니다. 여러 포드가 단일 노드에서 GPUDirect-TCPX 또는 GPUDirect-TCPXO를 사용할 수 없습니다.
a3-highgpu-8g및a3-megagpu-8g머신 유형만 사용할 수 있습니다. 다른 A3 머신 유형은 지원되지 않습니다.
VPC 및 서브넷 만들기
노드에 추가할 가상 NIC마다 프로젝트에 별도의 VPC 네트워크를 만듭니다. 각 VPC 네트워크에는 내부 네트워크 트래픽을 허용하는 서브넷과 방화벽 규칙이 있어야 합니다.
프로젝트에서 GPUDirect용 VPC 네트워크를 만들고 각각 서브넷과 방화벽 규칙을 설정합니다. A3 High 머신 유형의 경우 GPUDirect-TCPX 탭, A3 Mega 머신 유형의 경우 GPUDirect-TCPXO 탭을 선택하고 다음 안내를 완료합니다.
GPUDirect-TCPXO
대역폭을 최대화하려면 새 네트워크를 8개 만드는 것이 좋습니다.
for N in $(seq 1 8); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-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 주소 범위입니다. 이 명령어 예시는 8개의 서브넷을 반복하므로 변수를 사용하여 각 서브넷의 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입니다.
GPUDirect-TCPX
대역폭을 최대화하려면 새 네트워크를 4개 만드는 것이 좋습니다.
for N in $(seq 1 4); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-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입니다.
네트워크가 생성되었는지 확인합니다.
gcloud compute networks list
GKE 환경 만들기
멀티 네트워킹(프리뷰)을 사용하는 새 GKE 클러스터를 만듭니다. 멀티 네트워킹을 사용하도록 기존 클러스터를 업데이트할 수는 없습니다.GPUDirect-TCPXO
GPUDirect-TCPXO를 지원하는 사용 가능한 GKE 버전을 선택합니다. 버전을 나열하려면 다음 명령어를 실행합니다.
gcloud container get-server-config \ --format="yaml(validMasterVersions)" \ --region=REGION \ --project=PROJECT_ID다음을 바꿉니다.
REGION: 클러스터 컨트롤 플레인의 컴퓨팅 리전입니다.PROJECT_ID: Google Cloud 프로젝트 ID입니다.
클러스터 만들기:
gcloud beta container clusters create-auto CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=VERSION \ --enable-multi-networking \ --workload-policies=allow-net-admin다음을 바꿉니다.
자신이 만든 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: Network metadata: name: vpc5 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc5 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc6 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc6 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc7 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc7 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc8 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc8 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc5 spec: vpc: PREFIX-net-5 vpcSubnet: PREFIX-sub-5 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc6 spec: vpc: PREFIX-net-6 vpcSubnet: PREFIX-sub-6 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc7 spec: vpc: PREFIX-net-7 vpcSubnet: PREFIX-sub-7 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc8 spec: vpc: PREFIX-net-8 vpcSubnet: PREFIX-sub-8 deviceMode: NetDevice EOF이러한 리소스는 GPU 트래픽을 위한 NIC를 패스 스루 모드로 구성하도록 GKE에 지시합니다. GKE는 이 트래픽에 eBPF를 사용하는 기본 제공 네트워킹 프로그래밍을 적용하지 않습니다.
GPUDirect-TCPX
클러스터 만들기:
gcloud beta container clusters create-auto CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=VERSION \ --enable-multi-networking \ --workload-policies=allow-net-admin다음을 바꿉니다.
자신이 만든 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: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice EOF이러한 리소스는 GPU 트래픽을 위한 NIC를 패스 스루 모드로 구성하도록 GKE에 지시합니다. GKE는 이 트래픽에 eBPF를 사용하는 기본 제공 네트워킹 프로그래밍을 적용하지 않습니다.
GPUDirect 바이너리 설치 및 NCCL 구성
이 섹션에서는 A3 머신 유형(A3 High의 경우 GPUDirect-TCPX, A3 Mega의 경우 GPUDirect-TCPXO) 및 DaemonSet을 사용하는 특정 NCCL 라이브러리 버전을 기준으로 GPUDirect 바이너리를 설치하는 방법을 보여줍니다.
GPUDirect-TCPXO
이 DaemonSet에서 다음을 수행합니다.
- GPUDirect-TCPXO 관련 구성을 설정하기 위한 사전 설치
- 노드에 NCCL 라이브러리 및 GPUDirect-TCPXO 바이너리 설치
- VM의
/home/kubernetes/bin/nvidia/lib64디렉터리에 라이브러리와 바이너리를 저장합니다. 기본적으로 GKE는 NCCL 및 GPUDirect-TCPXO를 사용해야 하는 GPU 컨테이너의/usr/local/nvidia/lib64경로에 이 디렉터리를 마운트합니다.
바이너리를 설치하고 NCCL을 구성하려면 다음 단계를 따르세요.
GitHub의
nccl-tcpxo-installer-autopilot.yamlDaemonset 매니페스트를 검토합니다.전용 네임스페이스를 만듭니다.
kubectl create ns gpudirect-systemDaemonSet를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-tcpxo-installer-autopilot.yamlNCCL 플러그인이 실행되기 시작하는 데 약 2분이 걸립니다.
GPUDirect-TCPX
이 DaemonSet에서 다음을 수행합니다.
- 노드에 NCCL 라이브러리와 GPUDirect-TCPX 바이너리를 설치합니다.
- VM의
/home/kubernetes/bin/nvidia/lib64디렉터리에 라이브러리와 바이너리를 저장합니다. 기본적으로 GKE는 NCCL 및 GPUDirect-TCPX를 사용해야 하는 GPU 컨테이너의/usr/local/nvidia/lib64경로에 이 디렉터리를 마운트합니다.
바이너리를 설치하고 NCCL을 구성하려면 다음 단계를 따르세요.
GitHub의
nccl-tcpx-installer-autopilot.yamlDaemonset 매니페스트를 검토합니다.전용 네임스페이스를 만듭니다.
kubectl create ns gpudirect-systemDaemonSet를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer-autopilot.yamlNCCL 플러그인이 실행되기 시작하는 데 약 2분이 걸립니다.
NRI 기기 인젝터 플러그인 배포
이 섹션에서는 DaemonSetfmf 사용하여 NRI 기기 인젝터를 설치하는 방법을 보여줍니다. 두 H100 GPU 머신 유형 모두 동일한 NRI 기기 인젝터 플러그인을 설치합니다. 이 플러그인은 다음을 수행합니다.
- H100 GPU가 있는 노드에서 노드 리소스 인터페이스(NRI)를 사용 설정합니다. NRI는 GKE 버전 1.29 이상에서 기본적으로 사용 설정됩니다.
- 포드 주석에 지정된 컨테이너에 GPU 기기를 삽입하는 NRI 기기 인젝터 플러그인 컨테이너를 배포합니다.
플러그인을 설치하려면 다음을 수행합니다.
DaemonSet를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector-autopilot.yamlNCCL 플러그인이 실행되기 시작하는 데 약 2분이 걸립니다.
테스트 워크로드 배포
이 섹션에서는 샘플 워크로드를 배포하여 NCCL 및 GPUDirect-TCPX 또는 GPUDirect-TCPXO가 정상적으로 작동하는지 확인합니다. 이 샘플 워크로드는 다음을 수행합니다.
- H100 GPU가 있는 노드에서 각각 실행되는 포드 2개를 배포합니다.
- 포드가 GPUDirect-TCPXO 또는 GPUDirect-TCPX를 사용할 수 있도록 각 포드에 사이드카 컨테이너를 배포합니다.
이 샘플 워크로드를 배포하려면 다음 단계를 따르세요.
GPUDirect-TCPXO
이 워크로드에는 포드가 GPUDirect-TCPXO를 사용하도록 허용하는 서비스를 실행하는 tcpxo-daemon이라는 사이드카 컨테이너가 포함되어 있습니다. 자체 환경에서 GPUDirect-TCPXO를 사용해야 하는 모든 포드에 이 사이드카 컨테이너를 추가해야 합니다. 매니페스트에 추가해야 하는 필드의 스니펫은 매니페스트에 GPUDirect 추가를 참조하세요.
테스트 워크로드가 포함된 포드 2개를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest-autopilot.yaml포드가 실행 중이고 준비되었는지 확인합니다. 이미지가 크고(약 5GB) 다운로드하는 데 몇 분이 걸릴 수 있습니다.
kubectl get pods -w이 명령어는 업데이트를 감시하고 Pod 상태가 변경되면 새 줄을 출력합니다. 출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE nccl-test-host-1 0/2 ContainerCreating 0 23s nccl-test-host-2 2/2 Running 0 23s nccl-test-host-1 2/2 Running 0 46s모든 포드의
STATUS메시지가Running이고READY값이2/2이 될 때까지 기다린 후 다음 단계로 진행합니다.포드가 배포된 후 all-gather 테스트를 트리거합니다.
kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/allgather.sh nccl-host-1 nccl-host-2출력은 다음과 비슷합니다.
# 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) 0 0 float none -1 0.24 0.00 0.00 0 0.18 0.00 0.00 0 0 0 float none -1 0.19 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 256 4 float none -1 235.2 0.00 0.00 0 235.1 0.00 0.00 0 512 8 float none -1 241.0 0.00 0.00 0 236.1 0.00 0.00 0 1024 16 float none -1 236.3 0.00 0.00 0 233.3 0.00 0.00 0 2048 32 float none -1 234.1 0.01 0.01 0 233.4 0.01 0.01 0 4096 64 float none -1 237.1 0.02 0.02 0 235.3 0.02 0.02 0 8192 128 float none -1 236.2 0.03 0.03 0 235.2 0.03 0.03 0 16384 256 float none -1 236.6 0.07 0.06 0 238.5 0.07 0.06 0 32768 512 float none -1 237.9 0.14 0.13 0 238.8 0.14 0.13 0 65536 1024 float none -1 242.3 0.27 0.25 0 239.4 0.27 0.26 0 131072 2048 float none -1 263.0 0.50 0.47 0 275.1 0.48 0.45 0 262144 4096 float none -1 279.2 0.94 0.88 0 269.9 0.97 0.91 0 524288 8192 float none -1 273.5 1.92 1.80 0 273.5 1.92 1.80 0 1048576 16384 float none -1 315.1 3.33 3.12 0 314.1 3.34 3.13 0 2097152 32768 float none -1 319.2 6.57 6.16 0 311.5 6.73 6.31 0 4194304 65536 float none -1 331.8 12.64 11.85 0 331.3 12.66 11.87 0 8388608 131072 float none -1 356.3 23.54 22.07 0 353.8 23.71 22.23 0 16777216 262144 float none -1 409.1 41.01 38.45 0 405.2 41.40 38.81 0 33554432 524288 float none -1 451.4 74.34 69.69 0 447.7 74.94 70.26 0 67108864 1048576 float none -1 713.4 94.07 88.19 0 713.8 94.01 88.13 0 134217728 2097152 float none -1 1122.1 119.62 112.14 0 1116.3 120.23 112.72 0 268435456 4194304 float none -1 1785.8 150.32 140.92 0 1769.2 151.72 142.24 0 536870912 8388608 float none -1 2859.7 187.74 176.00 0 2852.6 188.20 176.44 0 1073741824 16777216 float none -1 5494.1 195.44 183.22 0 5568.2 192.83 180.78 0 2147483648 33554432 float none -1 10841 198.09 185.71 0 10798 198.88 186.45 0 4294967296 67108864 float none -1 21453 200.21 187.70 0 21490 199.86 187.37 0 8589934592 134217728 float none -1 42603 201.63 189.03 0 42670 201.31 188.73 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 45.7587 #
GPUDirect-TCPX
이 워크로드에는 포드가 GPUDirect-TCPX를 사용하도록 허용하는 서비스를 실행하는 tcpx-daemon이라는 사이드카 컨테이너가 포함되어 있습니다. 자체 환경에서 GPUDirect-TCPX를 사용해야 하는 모든 포드에 이 사이드카 컨테이너를 추가해야 합니다. 매니페스트에 추가해야 하는 필드의 스니펫은 매니페스트에 GPUDirect 추가를 참조하세요.
GitHub의
nccl-config.yamlConfigMap 매니페스트를 검토합니다. 이 매니페스트는 NCCL all-gather 테스트를 초기화하고 NCCL 관련 구성 설정을 설정하는 스크립트를 배포합니다.ConfigMap 및 테스트 워크로드를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest-autopilot.yaml포드가 실행 중이고 준비되었는지 확인합니다. 이미지가 크고(약 5GB) 다운로드하는 데 몇 분이 걸릴 수 있습니다.
kubectl get pods -w이 명령어는 업데이트를 감시하고 Pod 상태가 변경되면 새 줄을 출력합니다. 출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE nccl-test-host-1 0/2 ContainerCreating 0 23s nccl-test-host-2 2/2 Running 0 23s nccl-test-host-1 2/2 Running 0 46s모든 포드의
STATUS메시지가Running이고READY값이2/2이 될 때까지 기다린 후 다음 단계로 진행합니다.다음 명령어를 실행하여 노드의 NCCL all-gather 테스트를 트리거합니다.
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2출력은 다음과 비슷합니다.
# 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
자체 워크로드에 GPUDirect 채택
샘플 테스트 워크로드로 클러스터 네트워킹이 제대로 작동하는지 확인한 후 다음 단계는 실제 워크로드에 GPUDirect를 적용하는 것입니다. 이렇게 하려면 NCCL 설정과 Kubernetes 포드 매니페스트를 업데이트해야 합니다.
필수 NCCL 구성 설정을 사용하여 성능 개선
다음 키-값 쌍은 GPUDirect-TCPX 및 GPUDirect-TCPXO에 필요한 NCCL 구성 설정입니다. NCCL을 사용하는 워크로드를 배포할 때는 성능을 최적화하기 위해 환경 변수로 설정합니다.
GPUDirect-TCPXO
"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple,LL128",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"
필요한 경우 다음 단계에 따라 모든 구성을 한 번에 설정할 수 있습니다.
워크로드 컨테이너 매니페스트에 다음 키-값 쌍을 환경 변수로 추가합니다.
NCCL_LIB_DIR="/usr/local/nvidia/lib64"워크로드 컨테이너가 시작될 때
nccl-env-profile.sh스크립트가 실행되는지 확인합니다. 예를 들어 포드 사양에서 컨테이너의 명령어를 재정의하는 방법으로 이를 수행하여 다음을 포함할 수 있습니다.source ${NCCL_LIB_DIR}/nccl-env-profile.sh
LL128 지원
NVIDIA LL128(low-latency 128) NCCL 통신 프로토콜을 사용하면 중소 규모 집합체의 성능을 크게 개선할 수 있습니다. GPUDirect-TCPXO는 LL128 프로토콜을 지원합니다.
LL128을 사용하려면 GPUDirect 바이너리 설치 및 NCCL 구성 섹션의 nccl-tcpxo-installer.yaml 파일이 다음 컨테이너 이미지 버전 이상을 사용해야 합니다.
us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-
dev:v1.0.8-1
LL128을 설정하려면 다음 단계를 따르세요.
us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx- dev:v1.0.8-1NCCL 플러그인 버전의 경우 다음 단계를 따르세요.워크로드 매니페스트에서 다음 환경 변수를 설정합니다.
NCCL_LIB_DIR="/usr/local/nvidia/lib64컨테이너가 시작될 때
nccl-env-profile-ll128.sh스크립트를 실행하도록 워크로드를 구성합니다. 워크로드 매니페스트에서 다음 명령어를 설정합니다.source ${NCCL_LIB_DIR}/nccl-env-profile-ll128.shnccl-env-profile-ll128.sh스크립트에는 다음과 같은 환경 변수가 있습니다.NCCL_PROTO=Simple,LL128 NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_ll128.textproto NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config_ll128.textproto
us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.9-1NCL 플러그인 버전 및 이후 버전의 경우 LL128이 기본 파라미터가 되므로nccl-env-profile.sh스크립트 또는nccl-env-profile-ll128.sh스크립트를 사용하면 LL128이 사용 설정됩니다. LL128을 사용 중지하려면 다음 단계를 따르세요.워크로드 매니페스트에서 다음 환경 변수를 설정합니다.
NCCL_LIB_DIR="/usr/local/nvidia/lib64컨테이너가 시작될 때
nccl-env-profile-ll128.sh스크립트를 실행하도록 워크로드를 구성합니다. 워크로드 매니페스트에서 다음 명령어를 설정합니다.source ${NCCL_LIB_DIR}/nccl-env-profile-simple.shnccl-env-profile-simple.sh스크립트에는 다음과 같은 환경 변수가 있습니다.NCCL_PROTO=Simple NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto
GPUDirect-TCPX
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"
매니페스트에 GPUDirect 추가
이 섹션에서는 포드에서 GPUDirect를 사용하기 위해 Kubernetes 매니페스트에 추가해야 하는 필수 필드를 보여줍니다.
Autopilot 모드의 경우 GKE에서 하드웨어를 프로비저닝할 수 있도록 포드 매니페스트에서 적절한 GPU도 선택해야 합니다. H100 Mega GPU의 경우 GPUDirect-TCPXO를 사용합니다. H100 GPU의 경우 GPUDirect-TCPX를 사용합니다.포드에 다음 노드 선택기를 추가합니다.
nodeSelector:
cloud.google.com/gke-accelerator: GPU_NAME
cloud.google.com/gke-gpu-driver-version: latest
GPU_NAME을 GPU 이름으로 바꿉니다. 지원되는 값은 다음과 같습니다.
nvidia-h100-mega-80gbnvidia-h100-80gb
또한 예약된 용량을 사용하려면 이름과 선택적으로 블록 및 하위 블록을 포함한 예약에 관한 정보를 제공하면 됩니다. 자세한 내용은 Autopilot 클러스터에서 용량 예약 사용의 예약 사용에 관한 하위 섹션을 참고하세요.
GPUDirect 유형에 따라 다음을 수행합니다.
GPUDirect-TCPXO
포드 메타데이터에 다음 주석을 추가합니다.
metadata: annotations: devices.gke.io/container.tcpxo-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm - path: /dev/dmabuf_import_helper networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, {"interfaceName":"eth5","network":"vpc5"}, {"interfaceName":"eth6","network":"vpc6"}, {"interfaceName":"eth7","network":"vpc7"}, {"interfaceName":"eth8","network":"vpc8"} ]포드 사양에 다음 필드를 추가합니다.
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys - name: aperture-devices hostPath: path: /dev/aperture_devicestcpxo-daemon서비스를 실행하려면 다음 컨테이너를 매니페스트에 추가합니다. (TCPXO_DAEMON_IMAGE)를 최신 이미지로 바꿉니다(예:us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.17).- name: tcpxo-daemon image: TCPXO_DAEMON_IMAGE imagePullPolicy: Always command: ["/bin/sh", "-c"] args: - | set -ex chmod 755 /fts/entrypoint_rxdm_container.sh /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr securityContext: capabilities: add: - NET_ADMIN - NET_BIND_SERVICE volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs모든 GPU 컨테이너에 다음 환경 변수를 추가합니다.
env: - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices모든 GPU 컨테이너에 다음 volumeMounts를 추가합니다.
aperture_devices설정이 없으면 GPU 컨테이너에privileged:true가 필요합니다.volumeMounts: - name: aperture-devices mountPath: /dev/aperture_devicesNCCL 옵션을 구성하는 환경 변수를 추가합니다. 자세한 내용은 권장 NCCL 구성 설정을 사용하여 성능 개선을 참조하세요.
완성된 포드 사양의 예는 GitHub의 nccl-test-latest-autopilot.yaml 매니페스트를 참고하세요.
GPUDirect-TCPX
포드 메타데이터에 다음 주석을 추가합니다.
metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]포드 사양에 다음 필드를 추가합니다.
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/systcpx-daemon 서비스를 실행하려면 다음 컨테이너를 매니페스트에 추가합니다.
- name: tcpx-daemon image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.12 command: - /tcpgpudmarxd/build/app/tcpgpudmarxd - --gpu_nic_preset - a3vm - --gpu_shmem_type - fd - --uds_path - /run/tcpx - --setup_param - \"--verbose 128 2 0 \" securityContext: capabilities: add: - NET_ADMIN volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: tcpx-socket mountPath: /run/tcpx - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfsGPU를 요청하는 컨테이너에 다음 볼륨 마운트를 추가합니다.
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64NCCL 옵션을 구성하는 환경 변수를 추가합니다. 자세한 내용은 이 문서의 권장 NCCL 구성 설정을 사용하여 성능 개선 섹션을 참조하세요.
완성된 포드 사양의 예는 GitHub의 nccl-test-latest-autopilot.yaml 매니페스트를 참고하세요.
NCCL 디버깅 로그 수집
NCCL 오류를 로깅하려면 다음 NCCL 구성을 추가하는 것이 좋습니다.
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
NCCL_DEBUG=INFO: 디버깅 정보를 출력합니다.- 대규모 워크로드(노드 64개 이상)의 경우 광범위한 로깅이 발생할 수 있습니다. 이 시나리오를 방지하려면
NCCL_DEBUG_FILE을 지정하지 않은 한NCCL_DEBUG=WARN을 설정하여 로그를 오류로만 제한하는 것이 좋습니다.
- 대규모 워크로드(노드 64개 이상)의 경우 광범위한 로깅이 발생할 수 있습니다. 이 시나리오를 방지하려면
NCCL_DEBUG_SUBSYS: NCCL이 디버깅 정보를 수집하는 하위 시스템을 필터링합니다. 다음 하위 시스템의 로그를 수집하는 것이 좋습니다.INIT: NCCL의 초기화 단계입니다.NET: NCCL 네트워크입니다.ENV: NCCL에서 사용하는 환경 변수입니다.COLL: 집합체 작업입니다.GRAPH: 토폴로지 감지 및 그래프 검색입니다.
다른 하위 시스템의 로그를 수집하려면 NCCL 문서의
NCCL_DEBUG_SUBSYS에서 허용되는 값 목록을 참고하세요.NCCL_DEBUG_FILE(선택사항): 지정된 파일로 NCCL 디버그 로깅 출력을 전달합니다. 이 변수는 NCCL 로그를 표준 파일에 작성하므로 로그 출력이 애플리케이션 출력과 혼합되지 않습니다. 또한 이 변수는 서로 다른 NCCL 순위의 로그를 서로 다른 파일에 작성하여 로그가 혼합되는 것을 방지합니다.다음 파일 이름 형식을 사용합니다.
/DIRECTORY/FILE_NAME.%h.%p다음을 바꿉니다.
DIRECTORY: 로그 파일을 저장할 디렉터리입니다.FILE_NAME: 로그 파일의 이름입니다.
자리표시자
%h는 노드의 호스트 이름으로 확인되고%p는 로그를 생성하는 프로세스의 프로세스 ID(PID)로 확인됩니다.
NCCL 로그 디버깅에 관한 자세한 내용은 GKE에서 GPU 문제 해결을 참고하세요.
다음 단계
- Topology Aware Scheduling (TAS) 및 Kueue를 사용하여 GKE 클러스터에서 워크로드를 예약하는 방법에 대한 자세한 내용은 Topology Aware Scheduling으로 GKE 워크로드 예약을 참고하세요.
- GKE 클러스터 및 AI 워크로드와 관련된 일반적인 이벤트를 관리하는 방법에 대한 자세한 내용은 AI 최적화 GKE 클러스터 관리를 참고하세요.
- 환경을 테스트하여 올바르게 설정하고 최적화하는 방법에 대한 자세한 내용은 NCCL/gIB를 사용하여 클러스터 네트워킹 최적화를 참고하세요.