본문으로 건너뛰기

InfiniBand 설정 및 벤치마크

목표

이 튜토리얼을 완료하면:

  • InfiniBand가 포함된 가상 클러스터 구성
  • IB 연결 상태 확인 및 대역폭 측정
  • NCCL 기반 멀티 가상머신 통신 테스트

사전 준비

  • ECI 계정 및 GPU 인스턴스 할당량 (최소 2대)
  • InfiniBand 패브릭을 지원하는 GPU 인스턴스 타입
  • SSH 클라이언트 (macOS/Linux 기본 제공, Windows는 WSL 또는 PuTTY) — 접속 방법 참고

1단계: 가상 클러스터 구성

  1. 컴퓨트 > 가상 클러스터 목록에서 가상 클러스터 생성으로 클러스터를 만듭니다. 패브릭 타입은 InfiniBand를 선택합니다. (자세한 구성은 가상 클러스터를 참고하세요.)
  2. 컴퓨트 > 가상머신에서 가상 머신 생성으로 멤버 가상머신을 만듭니다. 이미지는 Ubuntu 24.04 LTS (AI/GPU) 를 선택하고, 인스턴스 타입은 클러스터와 동일한 GPU 타입을 선택합니다. 클러스터 시작에는 최소 2대의 가상머신이 필요합니다.
  3. 만든 가상머신을 클러스터에 추가합니다. 가상머신은 대기중 상태일 때만 클러스터에 연결할 수 있으므로 생성 후 한 번도 시작하지 않거나, 시작했다면 먼저 중지하세요.
  4. 가상 클러스터 상세 페이지에서 클러스터 시작을 클릭합니다.
  5. 각 가상머신을 개별 시작합니다.
OS 이미지와 드라이버 호환성

각 OS 이미지는 고정된 NVIDIA 드라이버 버전을 제공하며, 드라이버에 따라 호환되는 NCCL·CUDA(nvcc) 버전이 달라집니다. 이 튜토리얼은 시연 편의를 위해 Ubuntu 24.04 LTS 이미지를 기준으로 하지만, 3단계: 환경 준비를 참고하면 다른 운영체제에서도 동일하게 실행할 수 있습니다.


2단계: InfiniBand 상태 확인

가상머신에 SSH 접속 후:

# HCA 확인
ibstat
ibv_devinfo

# IB 포트 상태 확인 (Active여야 정상)
ibstat | grep -A5 "Port 1"

# 연결된 가상머신 확인
ibhosts

3단계: 환경 준비

설치·빌드는 모든 가상머신에서 동일하게

3단계의 패키지 설치와 5단계의 nccl-tests 빌드는 클러스터의 모든 가상머신에서 동일하게 수행해야 합니다. 특히 libnccl 버전과 nccl-tests 빌드 결과물(./build/all_reduce_perf)의 경로가 가상머신마다 일치해야 mpirun이 정상 동작합니다.

반면 명령 실행 자체(IP·SSH 키 준비, 4단계 서버·클라이언트 실행, 5단계 mpirun)는 안내된 지정 가상머신에서만 수행합니다.

여러 가상머신 간 통신을 위해 OpenMPI 및 테스트를 위한 perftest를 설치합니다.

sudo apt update
sudo apt install openmpi-bin libopenmpi-dev perftest -y

또한 NCCL 테스트를 위해 libnccl 패키지를 설치합니다. 단, libnccl은 설치된 CUDA 버전에 맞춰야 하므로 먼저 CUDA 버전을 확인합니다. nvcc가 PATH에 없을 수 있으므로 전체 경로로 실행합니다.

/usr/local/cuda/bin/nvcc --version

# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2025 NVIDIA Corporation
# Built on Fri_Feb_21_20:23:50_PST_2025
# Cuda compilation tools, release 12.8, V12.8.93
# Build cuda_12.8.r12.8/compiler.35583870_0

nvcc에 표시된 CUDA 버전(예: cuda12.8)에 맞는 libnccl 패키지를 NVIDIA CUDA 저장소에서 확인합니다. 경로의 ubuntu2404는 사용 중인 OS 버전으로 바꾸세요.

혹은 아래 명령으로 설치 가능한 버전을 한 번에 확인할 수 있습니다.

V=$(/usr/local/cuda/bin/nvcc --version | grep -oP 'release \K[0-9]+\.[0-9]+') && apt list -a libnccl2 2>/dev/null | grep "cuda$V"

# libnccl2/unknown 2.30.7-1+cuda13.3 amd64 [upgradable from: 2.26.2-1+cuda12.8]
# libnccl2/unknown,now 2.26.2-1+cuda12.8 amd64 [installed,upgradable to: 2.30.7-1+cuda13.3]
# libnccl2/unknown 2.25.1-1+cuda12.8 amd64

확인한 버전으로 libnccl과 개발 패키지를 설치합니다. libnccl 과 libnccl-dev 모두 필요합니다. 아래의 커맨드 형식을 따라주세요.

sudo apt install libnccl2=2.26.2-1+cuda12.8 libnccl-dev=2.26.2-1+cuda12.8 -y

이후 단계에서 반복해서 쓰이는 각 가상머신의 IP를 환경변수로 지정합니다. 컴퓨트 > 가상머신 > 가상머신 선택 > 네트워크 > 네트워크 인터페이스의 IP 주소를 사용하세요. 모든 가상머신이 같은 네트워크에 있어야 정상 동작합니다. 실제 값으로 채운 뒤, 명령을 실행할 가상머신에서 export 하세요.

export VM_A_IP=<가상머신 A IP> # 서버/마스터 가상머신
export VM_B_IP=<가상머신 B IP>
export VM_C_IP=<가상머신 C IP>

4단계: 대역폭 벤치마크

ib_write_bw로 가상머신 간 RDMA 쓰기 대역폭을 측정합니다. 가상머신 A(서버)를 먼저 실행한 뒤, 가상머신 B(클라이언트)가 가상머신 A의 IP로 접속합니다.

# 가상머신 A (서버)
ib_write_bw -d mlx5_0 --pkey_index 1

# 가상머신 B (클라이언트): 가상머신 A의 IP 사용
ib_write_bw -d mlx5_0 ${VM_A_IP} --pkey_index 1

각 값은 다음과 같이 설정합니다.

설명
-d mlx5_0사용할 HCA 디바이스. 2단계 ibstat / ibv_devinfo에 나열된 이름 중 하나이며, 서버·클라이언트가 같은 디바이스를 가리키도록 맞춥니다.
${VM_A_IP}(클라이언트에만 지정) 서버 가상머신의 IP. 3단계에서 export한 값입니다.

정상 동작 시 클러스터의 IB 패브릭 사양에 가까운 대역폭이 측정되어야 합니다. 측정값이 사양 대비 현저히 낮으면 케이블·드라이버·클러스터 설정을 점검하세요.

용도에 따라 다른 ib_* 명령으로 링크 상태와 성능을 추가로 점검할 수 있습니다.

명령용도
ib_write_bwRDMA Write 대역폭
ib_write_latRDMA Write 지연 시간(latency)
ibstat가상머신 간 IB 연결 및 포트 상태 확인

5단계: NCCL All-Reduce 테스트

nccl-tests를 빌드합니다.

git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests && make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi
가상머신 버전 통일

nccl-tests 빌드는 모든 가상머신에서 동일하게 수행해야 하며, libnccl 버전도 가상머신별로 일치해야 원활한 테스트가 보장됩니다.

먼저 단일 가상머신에서 8개 GPU로 동작을 확인합니다.

# 단일 가상머신 × 8 GPU
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8

멀티 가상머신으로 확장하기 전에, mpirun이 각 가상머신에 접속할 수 있도록 마스터 가상머신의 SSH 공개키를 나머지 가상머신에 복사하고 최초 1회 로그인해 호스트 키를 등록합니다.

# 마스터 가상머신에 키가 없으면 생성
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519

# 각 가상머신에 공개키 복사 후 1회 로그인
ssh-copy-id ${VM_B_IP} && ssh ${VM_B_IP} exit
ssh-copy-id ${VM_C_IP} && ssh ${VM_C_IP} exit

이제 마스터 가상머신에서 멀티 가상머신 벤치마크를 실행합니다.

# 가상머신 3대 × 8 GPU All-Reduce 테스트
mpirun -np 24 \
-H ${VM_A_IP}:8,${VM_B_IP}:8,${VM_C_IP}:8 \
--map-by ppr:8:node --bind-to numa \
-x NCCL_IB_DISABLE=0 \
-x NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7 \
-x NCCL_SOCKET_IFNAME=enp0s3 \
-x NCCL_IB_PKEY=1 \
./build/all_reduce_perf -b 512M -e 8G -f 2 -g 1

핵심 옵션은 다음과 같습니다.

옵션설명
-np 24 / -H ...:8총 프로세스 수와 가상머신별 프로세스 수 (가상머신당 GPU 8개 → 가상머신 3대 × 8 = 24)
--map-by ppr:8:node --bind-to numa가상머신당 8프로세스 배치, NUMA 경계에 바인딩
NCCL_IB_DISABLE=0InfiniBand 강제 사용
NCCL_IB_HCA사용할 HCA 목록 (2단계 ibstat의 디바이스 이름)
NCCL_SOCKET_IFNAME부트스트랩용 이더넷 인터페이스 (ip addr로 확인)

성능 튜닝용 옵션(NCCL_IB_GID_INDEX, NCCL_IB_QPS_PER_CONNECTION, NCCL_NET_GDR_LEVEL, NCCL_CROSS_NIC 등)은 환경에 맞춰 선택적으로 추가할 수 있습니다.


트러블슈팅

증상원인해결
ibstat 명령 없음OFED 미설치 이미지OFED 포함 이미지로 가상머신 재생성
NCCL 타임아웃가상머신 간 통신 불가방화벽 허용,네트워크 서브넷 재확인

참고 자료


다음 단계