Amazon EC2에서 ML 워크로드를 위한 EFA와 NCCL 시작하기

Amazon EC2에서 ML 워크로드를 위한 EFA와 NCCL 시작하기

NVIDIA Collective Communications Library(NCCL)는 단일 노드 또는 여러 노드의 여러 GPU를 위한 표준 집합 통신 루틴 라이브러리예요. NCCL을 EFA, Libfabric, MPI와 함께 사용해 다양한 머신 러닝 워크로드를 지원할 수 있어요. 자세한 내용은 NCCL 웹사이트를 참고하세요.

출처: 문서

본문

요구 사항
  • 지원되는 인스턴스 유형에는 EFA 지원 P 시리즈 및 G 시리즈 인스턴스 유형이 포함됩니다(자세한 내용은 Amazon EC2 가속 컴퓨팅 인스턴스 참고).
  • 지원되는 기본 AMI: Amazon Linux 2023, Ubuntu 26.04, Ubuntu 24.04, Ubuntu 22.04, Debian 12, Debian 13, RHEL 10.
  • EFA는 NCCL 2.4.2 이상만 지원합니다.

AWS Deep Learning AMI로 EFA와 NCCL을 사용해 머신 러닝 워크로드를 실행하는 방법에 대한 자세한 내용은 AWS Deep Learning AMIs 개발자 안내서의 DLAMI에서 EFA 사용하기 를 참고하세요.

단계
  • Step 1: EFA 활성화 보안 그룹 준비
  • Step 2: 임시 인스턴스 실행
  • Step 3: NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치
  • Step 4: GDRCopy 설치
  • Step 5: EFA 소프트웨어 설치
  • Step 6: NCCL 설치
  • Step 7: NCCL 테스트 설치
  • Step 8: EFA 및 NCCL 구성 테스트
  • Step 9: 머신 러닝 애플리케이션 설치
  • Step 10: EFA 및 NCCL 활성화 AMI 만들기
  • Step 11: 임시 인스턴스 종료
  • Step 12: 클러스터 배치 그룹에 EFA 및 NCCL 활성화 인스턴스 실행
  • Step 13: 패스워드 없는 SSH 활성화

Step 1: EFA 활성화 보안 그룹 준비

EFA는 보안 그룹 자체로부터의 모든 인바운드 및 아웃바운드 트래픽을 허용하는 보안 그룹이 필요해요. 다음 절차는 그 자체로부터의 모든 인바운드/아웃바운드 트래픽을 허용하고, SSH 연결을 위해 모든 IPv4 주소로부터의 인바운드 SSH 트래픽을 허용하는 보안 그룹을 만듭니다.

중요

  • 이 보안 그룹은 테스트 목적으로만 만들어진 것입니다. 프로덕션 환경에서는 연결하는 IP 주소(예: 컴퓨터의 IP 주소) 또는 로컬 네트워크의 IP 주소 범위에서만 트래픽을 허용하는 인바운드 SSH 규칙을 만들 것을 권장합니다.
  • 자기 참조 인바운드/아웃바운드 규칙(보안 그룹 자체로의/로부터의 모든 트래픽 허용)은 EFA가 작동하기 위한 필수 규칙입니다. 이 규칙이 없으면 인스턴스 간 EFA 트래픽이 차단되어 NCCL 통신이 실패합니다.

다른 시나리오는 다양한 사용 사례에 대한 보안 그룹 규칙 을 참고하세요.

EFA 활성화 보안 그룹 만들기
  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 Security Groups를 선택한 다음 Create security group을 선택합니다.
  3. Create security group 창에서 다음을 수행합니다.
    • Security group name에 보안 그룹의 설명적인 이름을 입력합니다(예: EFA-enabled security group).
    • (선택 사항) Description에 보안 그룹에 대한 간단한 설명을 입력합니다.
    • VPC에서 EFA 활성화 인스턴스를 실행하려는 VPC를 선택합니다.
    • Create security group을 선택합니다.
  4. 생성한 보안 그룹을 선택하고 Details 탭에서 Security group ID를 복사합니다.
  5. 보안 그룹을 선택한 상태에서 Actions, Edit inbound rules를 선택한 후 다음을 수행합니다.
    • Add rule을 선택합니다.
    • Type에서 All traffic을 선택합니다.
    • Source type에서 Custom을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.
    • Add rule을 선택합니다.
    • Type에서 SSH를 선택합니다.
    • Source type에서 Anywhere-IPv4를 선택합니다.
    • Save rules를 선택합니다.
  6. 보안 그룹을 선택한 상태에서 Actions, Edit outbound rules를 선택한 후 다음을 수행합니다.
    • Add rule을 선택합니다.
    • Type에서 All traffic을 선택합니다.
    • Destination type에서 Custom을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.
    • Save rules를 선택합니다.

Step 2: 임시 인스턴스 실행

EFA 소프트웨어 구성 요소를 설치하고 구성하는 데 사용할 수 있는 임시 인스턴스를 실행합니다. 이 인스턴스를 사용해 EFA 활성화 인스턴스를 실행할 수 있는 EFA 활성화 AMI를 만듭니다.

임시 인스턴스 실행하기
  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 Instances를 선택한 다음 Launch Instances를 선택해 새 실행 인스턴스 마법사를 엽니다.
  3. (선택 사항) Name and tags 섹션에 인스턴스 이름(예: EFA-instance)을 제공합니다. 이름은 리소스 태그(Name=EFA-instance)로 인스턴스에 할당됩니다.
  4. Application and OS Images 섹션에서 지원되는 운영 체제 중 하나의 AMI를 선택합니다.
  5. Instance type 섹션에서 지원되는 인스턴스 유형을 선택합니다.
  6. Key pair 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.
  7. Network settings 섹션에서 Edit을 선택한 후 다음을 수행합니다.
    • Subnet에서 인스턴스를 실행할 서브넷을 선택합니다.

    중요 — 서브넷을 선택해야 합니다. 서브넷을 선택하지 않으면 인스턴스를 EFA에 활성화할 수 없습니다.

    • Firewall (security groups) 에서 Select existing security group을 선택한 다음 이전 단계에서 만든 보안 그룹을 선택합니다.
    • Advanced network configuration 섹션을 확장합니다.
    • Network interface 1에서 Network card index = 0, Device index = 0, Interface type = EFA with ENA를 선택합니다.
    • (선택 사항) 멀티 카드 인스턴스 유형을 사용하는 경우, 필요한 각 추가 네트워크 인터페이스에 대해 Add network interface를 선택하고, Network card index에서 다음 사용하지 않는 인덱스를 선택한 다음 Device index = 1과 Interface type = EFA with ENA 또는 EFA-only를 선택합니다.
  8. Storage 섹션에서 필요에 따라 볼륨을 구성합니다.

    참고 — NVIDIA CUDA Toolkit을 위해 추가로 10~20GiB의 스토리지를 프로비저닝해야 합니다. 충분한 스토리지를 프로비저닝하지 않으면 NVIDIA 드라이버와 CUDA 툴킷을 설치하려 할 때 insufficient disk space 오류가 발생합니다.

  9. 오른쪽 Summary 패널에서 Launch instance를 선택합니다.

Step 3: NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치

Amazon Linux 2023

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치하기
  • 모든 소프트웨어 패키지를 최신 상태로 유지하려면 인스턴스에서 빠른 소프트웨어 업데이트를 수행합니다.
$ sudo dnf upgrade -y && sudo reboot

인스턴스가 재부팅된 후 다시 연결합니다.

  • NVIDIA GPU 드라이버와 NVIDIA CUDA Toolkit을 설치하는 데 필요한 유틸리티를 설치합니다.
$ sudo dnf groupinstall 'Development Tools' -y && sudo dnf install -y dkms kernel-devel-$(uname -r) kernel-headers-$(uname -r)
  • nouveau 오픈 소스 드라이버를 비활성화합니다.
  • 현재 실행 중인 커널 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.
$ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
  • /etc/modprobe.d/blacklist.conf 거부 목록 파일에 nouveau를 추가합니다.
$ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
EOF
  • grub 파일에 GRUB_CMDLINE_LINUX="rdblacklist=nouveau"를 추가하고 GRUB 구성을 다시 빌드합니다.
$ echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' | sudo tee -a /etc/default/grub \
&& sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • CUDA 네트워크 리포지토리를 추가합니다.
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
  • NVIDIA GPU 드라이버를 다운로드하고 설치합니다.
$ wget https://us.download.nvidia.com/tesla/580.167.08/NVIDIA-Linux-x86_64-580.167.08.run \
&& sudo sh NVIDIA-Linux-x86_64-580.167.08.run -m kernel-open --no-drm --disable-nouveau --dkms --silent
  • NVIDIA CUDA Toolkit과 cuDNN을 설치합니다.
$ sudo dnf install -y cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-devel-cuda-13
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • (NVSwitch가 있는 인스턴스, 예: P 시리즈 멀티 GPU 인스턴스) NVIDIA Fabric Manager를 설치하고 시작합니다. G 시리즈 인스턴스는 NVSwitch를 사용하지 않으며 Fabric Manager가 필요하지 않습니다.
$ sudo dnf install -y https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/nvidia-fabricmanager-580.167.08-1.el8.x86_64.rpm \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • CUDA 경로가 인스턴스가 시작될 때마다 설정되도록 합니다.
  • bash 셸의 경우 /home/username/.bashrc와 /home/username/.bash_profile에 다음 명령문을 추가합니다.
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  • tcsh 셸의 경우 /home/username/.cshrc에 다음 명령문을 추가합니다.
setenv PATH=/usr/local/cuda/bin:$PATH
setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  • NVIDIA GPU 드라이버가 작동하는지 확인하려면 다음 명령을 실행합니다.
$ nvidia-smi -q | head

이 명령은 NVIDIA GPU, NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit에 대한 정보를 반환해야 합니다.

Ubuntu 26.04, Ubuntu 24.04, Ubuntu 22.04

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치하기
  • 모든 소프트웨어 패키지를 최신 상태로 유지하려면 인스턴스에서 빠른 소프트웨어 업데이트를 수행합니다.
$ sudo apt-get update && sudo apt-get upgrade -y
  • NVIDIA GPU 드라이버와 NVIDIA CUDA Toolkit을 설치하는 데 필요한 유틸리티를 설치합니다.
$ sudo apt-get update && sudo apt-get install build-essential -y
  • NVIDIA GPU 드라이버를 사용하려면 먼저 nouveau 오픈 소스 드라이버를 비활성화해야 합니다.
  • 현재 실행 중인 커널 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.
$ sudo apt-get install -y gcc make linux-headers-$(uname -r)
  • /etc/modprobe.d/blacklist.conf 거부 목록 파일에 nouveau를 추가합니다.
$ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
EOF
  • 선호하는 텍스트 편집기로 /etc/default/grub을 열고 다음을 추가합니다.
GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
  • GRUB 구성을 다시 빌드합니다.
$ sudo update-grub
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • CUDA 리포지토리를 추가하고 NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN을 설치합니다.
  • Ubuntu 26.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2604/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo add-apt-repository -y 'deb [trusted=yes] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2604/x86_64 /' \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open cuda-toolkit-13-3 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  • Ubuntu 24.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo add-apt-repository -y 'deb [trusted=yes] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 /' \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open-580 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  • Ubuntu 22.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo DEBIAN_FRONTEND=noninteractive add-apt-repository -y "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /" \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open-580 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • (NVSwitch가 있는 인스턴스, 예: P 시리즈 멀티 GPU 인스턴스) NVIDIA Fabric Manager를 설치하고 시작합니다. G 시리즈 인스턴스는 NVSwitch를 사용하지 않으며 Fabric Manager가 필요하지 않습니다.
  • Ubuntu 26.04
$ sudo apt-get install -y nvidia-fabricmanager \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • Ubuntu 24.04 및 Ubuntu 22.04
$ sudo apt-get install -y nvidia-fabricmanager-580 \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • CUDA 경로가 인스턴스가 시작될 때마다 설정되도록 합니다.
  • bash 셸의 경우 /home/username/.bashrc와 /home/username/.bash_profile에 다음 명령문을 추가합니다.
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  • tcsh 셸의 경우 /home/username/.cshrc에 다음 명령문을 추가합니다.
setenv PATH=/usr/local/cuda/bin:$PATH
setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  • NVIDIA GPU 드라이버가 작동하는지 확인하려면 다음 명령을 실행합니다.
$ nvidia-smi -q | head

이 명령은 NVIDIA GPU, NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit에 대한 정보를 반환해야 합니다.

Debian 12 및 Debian 13

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치하기
  • NVIDIA GPU 드라이버와 NVIDIA CUDA Toolkit을 설치하는 데 필요한 유틸리티를 설치합니다.
$ sudo apt-get install -y build-essential gcc make linux-headers-$(uname -r) dkms
  • nouveau 오픈 소스 드라이버를 비활성화합니다.
$ sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="rdblacklist=nouveau"/' /etc/default/grub && sudo update-grub
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • CUDA 리포지토리를 추가하고 NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN을 설치합니다.
  • Debian 12
$ wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo DEBIAN_FRONTEND=noninteractive add-apt-repository -y "deb https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/ /" \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  • Debian 13
$ wget https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open cuda-toolkit-13-3 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  • NVIDIA UVM 커널 모듈을 구성합니다.
$ uvm_ko=$(find /lib/modules/$(uname -r) -name 'nvidia*uvm*.ko*' 2>/dev/null | head -1) && if [ -n "$uvm_ko" ]; then real=$(basename "$uvm_ko"); real=${real%.ko*}; echo "$real" | sudo tee /etc/modules-load.d/nvidia-uvm.conf; if [ "$real" != "nvidia-uvm" ]; then echo "alias nvidia-uvm $real" | sudo tee /etc/modprobe.d/nvidia-uvm.conf; fi; sudo modprobe "$real" || true; fi && sudo modprobe nvidia
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • (NVSwitch가 있는 인스턴스, 예: P 시리즈 멀티 GPU 인스턴스) NVIDIA Fabric Manager를 설치하고 시작합니다.
  • NVIDIA 커널 모듈의 버전을 확인합니다.
$ cat /proc/driver/nvidia/version | grep "Kernel Module"

예시 출력:

NVRM version: NVIDIA UNIX x86_64 Kernel Module  610.43.02  ...

앞의 예시에서는 커널 모듈의 메이저 버전 610이 설치됐습니다.

  • NVIDIA Fabric Manager를 설치합니다.
  • Debian 12: 이전 단계에서 확인된 메이저 버전과 일치하는 패키지를 설치합니다.
$ sudo apt-get install -y nvidia-fabricmanager-major_version_number \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • Debian 13: nvidia-fabricmanager 패키지를 설치합니다.
$ sudo apt-get install -y nvidia-fabricmanager \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • CUDA 경로가 인스턴스가 시작될 때마다 설정되도록 합니다(bash/tcsh 셸 모두 위와 동일한 명령문 사용).
  • NVIDIA GPU 드라이버가 작동하는지 nvidia-smi -q | head로 확인합니다.

RHEL 10

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN 설치하기
  • 모든 소프트웨어 패키지를 최신 상태로 유지하려면 인스턴스에서 빠른 소프트웨어 업데이트를 수행합니다.
$ sudo dnf upgrade -y && sudo reboot

인스턴스가 재부팅된 후 다시 연결합니다.

  • NVIDIA GPU 드라이버와 NVIDIA CUDA Toolkit을 설치하는 데 필요한 유틸리티를 설치합니다.
$ sudo dnf groupinstall 'Development Tools' -y \
&& sudo dnf install -y dkms kernel-devel-$(uname -r) \
&& sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
  • nouveau 오픈 소스 드라이버를 비활성화합니다.
  • /etc/modprobe.d/blacklist.conf 거부 목록 파일에 nouveau를 추가합니다.
$ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
EOF
  • grub 파일에 GRUB_CMDLINE_LINUX="rdblacklist=nouveau"를 추가하고 GRUB 구성을 다시 빌드합니다.
$ echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' | sudo tee -a /etc/default/grub \
&& sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • CUDA 리포지토리를 추가하고 NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN을 설치합니다.
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/cuda-rhel10.repo \
&& sudo dnf install -y nvidia-open-580.167.08 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-devel-cuda-13
  • 인스턴스를 재부팅하고 다시 연결합니다.
  • (NVSwitch가 있는 인스턴스) NVIDIA Fabric Manager를 설치하고 시작합니다.
$ sudo dnf install -y https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/nvidia-fabricmanager-580.167.08-1.x86_64.rpm \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  • CUDA 경로가 인스턴스가 시작될 때마다 설정되도록 합니다(bash/tcsh 셸 모두 위와 동일한 명령문 사용).
  • NVIDIA GPU 드라이버가 작동하는지 nvidia-smi -q | head로 확인합니다.

Step 4: GDRCopy 설치

Libfabric의 성능을 개선하려면 GDRCopy를 설치합니다. GDRCopy에 대한 자세한 내용은 GDRCopy 리포지토리를 참고하세요.

Amazon Linux 2023

GDRCopy 설치하기
  • 필요한 종속성을 설치합니다.
$ sudo yum -y install dkms rpm-build make check check-devel
  • GDRCopy 패키지를 다운로드하고 압축을 풉니다.
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
  • GDRCopy RPM 패키지를 빌드합니다.
$ CUDA=/usr/local/cuda ./build-rpm-packages.sh
  • GDRCopy RPM 패키지를 설치합니다.
$ sudo rpm -Uvh gdrcopy-kmod-2.5.2*dkms*.rpm \
&& sudo rpm -Uvh gdrcopy-2.5.2*.rpm \
&& sudo rpm -Uvh gdrcopy-devel-2.5.2*.rpm

Ubuntu 26.04, Ubuntu 24.04, Ubuntu 22.04

GDRCopy 설치하기
  • 필요한 종속성을 설치합니다.
$ sudo apt-get install -y build-essential devscripts debhelper fakeroot pkg-config dkms
  • Ubuntu 22.04에서는 다음 추가 종속성도 설치합니다.
$ sudo apt-get install -y check libsubunit-dev
  • GDRCopy 패키지를 다운로드·압축 해제하고 패키지를 빌드합니다.
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz \
&& cd gdrcopy-2.5.2/packages \
&& CUDA=/usr/local/cuda ./build-deb-packages.sh
  • GDRCopy DEB 패키지를 설치합니다.
$ sudo dpkg -i gdrdrv-dkms_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i libgdrapi_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i gdrcopy-tests_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i gdrcopy_2.5.2-1_amd64.*.deb

Debian 12 및 Debian 13

GDRCopy 설치하기
  • 필요한 종속성을 설치합니다.
$ sudo apt-get install -y build-essential devscripts debhelper fakeroot pkg-config dkms
  • GDRCopy 패키지를 다운로드하고 압축을 풉니다.
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
  • Debian 버전 패치를 적용하고 패키지를 빌드합니다.
$ sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-lib/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-tests/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' dkms/debian/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-meta/changelog \
&& sed -i 's/FULL_VERSION="${VERSION}"/FULL_VERSION="${VERSION}-${DEBIAN_VERSION}"/g' build-deb-packages.sh
$ CUDA=/usr/local/cuda ./build-deb-packages.sh
  • GDRCopy DEB 패키지를 설치합니다.
$ sudo dpkg -i gdrdrv-dkms_2.5.2*.deb \
&& sudo dpkg -i libgdrapi_2.5.2*.deb \
&& sudo dpkg -i gdrcopy-tests_2.5.2*.deb \
&& sudo dpkg -i gdrcopy_2.5.2*.deb

RHEL 10

GDRCopy 설치하기
  • 필요한 종속성을 설치합니다.
$ sudo yum -y install dkms rpm-build make check check-devel
  • GDRCopy 패키지를 다운로드하고 압축을 풉니다.
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
  • GDRCopy RPM 패키지를 빌드합니다.
$ CUDA=/usr/local/cuda ./build-rpm-packages.sh
  • GDRCopy RPM 패키지를 설치합니다.
$ sudo rpm -Uvh gdrcopy-kmod-2.5.2*dkms*.rpm \
&& sudo rpm -Uvh gdrcopy-2.5.2*.rpm \
&& sudo rpm -Uvh gdrcopy-devel-2.5.2*.rpm

Step 5: EFA 소프트웨어 설치

인스턴스에서 EFA를 지원하는 데 필요한 EFA 활성화 커널, EFA 드라이버, Libfabric, aws-ofi-nccl 플러그인, Open MPI 스택을 설치합니다.

EFA 소프트웨어 설치하기
  1. 실행한 인스턴스에 연결합니다(자세한 내용은 SSH로 Linux 인스턴스에 연결하기 참고).
  2. EFA 소프트웨어 설치 파일을 다운로드합니다. 소프트웨어 설치 파일은 압축된 tarball(.tar.gz) 파일로 제공됩니다. 최신 stable 버전을 다운로드하려면 다음 명령을 사용합니다.
$ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.50.0.tar.gz

앞 명령에서 버전 번호를 latest로 바꿔 최신 버전을 얻을 수도 있습니다. 3. (선택 사항) EFA tarball(.tar.gz) 파일의 신뢰성과 무결성을 확인합니다. 출판자 정체를 확인하고 파일이 게시 이후 변경되거나 손상되지 않았는지 확인하려면 이 작업을 권장합니다. tarball 파일을 확인하지 않으려면 이 단계를 건너뜁니다.

  • 공개 GPG 키를 다운로드해 키링으로 가져옵니다.
$ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key

이 명령은 키 값을 반환해야 합니다. 다음 단계에서 필요하므로 키 값을 기록해 두세요.

  • GPG 키의 지문을 확인합니다. 다음 명령을 실행하고 이전 단계의 키 값을 지정합니다.
$ gpg --fingerprint key_value

이 명령은 4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC와 동일한 지문을 반환해야 합니다. 지문이 일치하지 않으면 EFA 설치 스크립트를 실행하지 말고 지원팀에 문의하세요.

  • 서명 파일을 다운로드하고 EFA tarball 파일의 서명을 확인합니다.
$ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.50.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.50.0.tar.gz.sig

예시 출력:

gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC
gpg: Good signature from "Amazon EC2 EFA <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 4E90 91BC BB97 A96B 26B1  5E59 A054 80B1 DD2D 3CCC

결과에 Good signature가 포함되고 지문이 이전 단계에서 반환된 지문과 일치하면 다음 단계로 진행합니다. 그렇지 않으면 EFA 설치 스크립트를 실행하지 말고 지원팀에 문의하세요. 4. 압축된 .tar.gz 파일에서 파일을 추출하고 추출된 디렉토리로 이동합니다.

$ tar -xf aws-efa-installer-1.50.0.tar.gz && cd aws-efa-installer
  1. (선택 사항) 설치 중 개별 패키지 서명을 확인합니다. EFA 설치 프로그램 1.48.0부터 설치 프로그램은 GPG 서명된 개별 RPM 및 DEB 패키지를 포함합니다. 설치 중 각 개별 패키지의 신뢰성과 무결성을 확인하려면 --check-signatures 플래그를 사용합니다. 이 플래그를 활성화하면 설치 프로그램이 먼저 모든 패키지 서명을 확인하고, 모든 패키지가 검증을 통과할 때만 설치를 진행합니다. 어떤 패키지라도 검증에 실패하면 설치 프로그램은 아무것도 설치하지 않고 즉시 종료됩니다.
    • GPG 공개 키를 다운로드합니다.
$ wget https://efa-installer.amazonaws.com/aws-efa-installer.key
  • 키 경로를 내보냅니다. 그런 다음 다음 단계에서 설치 명령에 --check-signatures를 추가하고 환경 변수를 보존하기 위해 sudo 대신 sudo -E를 사용합니다.
$ export EFA_INSTALLER_KEY=$(pwd)/aws-efa-installer.key

RPM 기반 시스템(Amazon Linux 2023, RHEL, Rocky Linux, SUSE)에서 설치 프로그램은 rpm --checksig를 사용해 각 RPM을 확인합니다. DEB 기반 시스템(Ubuntu, Debian)에서 설치 프로그램은 GPG 서명 검증을 사용해 각 DEB를 확인합니다. 어떤 패키지라도 검증에 실패하면 설치가 즉시 중단됩니다. 6. EFA 소프트웨어 설치 스크립트를 실행합니다. (이전 선택 단계를 완료했다면 설치 명령에 --check-signatures를 추가하고 sudo -E ./efa_installer.sh -y --mpi=openmpi5 --check-signatures처럼 sudo -E를 사용하세요.)

  • EFA 1.30.0부터 Open MPI 4.1과 Open MPI 5가 모두 기본으로 설치됩니다. Open MPI 4.1이 필요하지 않으면 Open MPI 5만 설치하세요. 다음 명령은 Open MPI 5만 설치합니다. Open MPI 4.1과 Open MPI 5를 모두 설치하려면 --mpi=openmpi5를 제거하세요.
$ sudo ./efa_installer.sh -y --mpi=openmpi5

Libfabric은 /opt/amazon/efa 디렉토리에, aws-ofi-nccl 플러그인은 /opt/amazon/ofi-nccl 디렉토리에, Open MPI는 /opt/amazon/openmpi 디렉토리에 설치됩니다. 7. EFA 설치 프로그램이 인스턴스 재부팅을 요청하면 재부팅한 후 다시 연결합니다. 그렇지 않으면 인스턴스에서 로그아웃한 후 다시 로그인해 설치를 완료합니다. 8. EFA 소프트웨어가 성공적으로 설치됐는지 확인합니다.

$ fi_info -p efa -t FI_EP_RDM

이 명령은 Libfabric EFA 인터페이스에 대한 정보를 반환해야 합니다.

Step 6: NCCL 설치

NCCL을 설치합니다. NCCL에 대한 자세한 내용은 NCCL 리포지토리를 참고하세요.

NCCL 설치하기
  • /opt 디렉토리로 이동합니다.
$ cd /opt
  • 공식 NCCL 리포지토리를 인스턴스에 클론하고 로컬 클론 리포지토리로 이동합니다.
$ sudo git clone https://github.com/NVIDIA/nccl.git -b v2.30.4-1 && cd nccl
  • NCCL을 빌드·설치하고 CUDA 설치 디렉토리를 지정합니다.
$ sudo make -j src.build CUDA_HOME=/usr/local/cuda-13

Step 7: NCCL 테스트 설치

NCCL 테스트를 설치합니다. NCCL 테스트를 통해 NCCL이 올바르게 설치됐고 예상대로 작동하는지 확인할 수 있습니다. NCCL 테스트에 대한 자세한 내용은 nccl-tests 리포지토리를 참고하세요.

NCCL 테스트 설치하기
  • 홈 디렉토리로 이동합니다.
$ cd $HOME
  • 공식 nccl-tests 리포지토리를 인스턴스에 클론하고 로컬 클론 리포지토리로 이동합니다.
$ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
  • LD_LIBRARY_PATH 변수에 Libfabric 디렉토리를 추가합니다.
  • Amazon Linux 2023
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
  • Ubuntu 및 Debian
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib:$LD_LIBRARY_PATH
  • RHEL 10
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
  • NCCL 테스트를 설치하고 MPI, NCCL, CUDA 설치 디렉토리를 지정합니다.
$ make MPI=1 MPI_HOME=/opt/amazon/openmpi NCCL_HOME=/opt/nccl/build CUDA_HOME=/usr/local/cuda-13

Step 8: EFA 및 NCCL 구성 테스트

임시 인스턴스가 EFA와 NCCL에 대해 올바르게 구성됐는지 확인하려면 테스트를 실행합니다.

EFA 및 NCCL 구성 테스트하기
  • 테스트를 실행할 호스트를 지정하는 호스트 파일을 만듭니다. 다음 명령은 인스턴스 자체에 대한 참조를 포함하는 my-hosts라는 호스트 파일을 만듭니다. IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts

IMDSv1

[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
  • NCCL 테스트를 실행합니다. 다음 명령은 인스턴스당 8개의 GPU가 있다고 가정합니다. 인스턴스 유형에 따라 -n과 -N 값을 조정하세요.
$ /opt/amazon/openmpi/bin/mpirun \
-x FI_EFA_USE_DEVICE_RDMA=1 \
-x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/amazon/ofi-nccl/lib:$LD_LIBRARY_PATH \
-x NCCL_DEBUG=INFO \
--hostfile my-hosts -n 8 -N 8 \
--mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
$HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
  • NCCL_DEBUG 로그가 인쇄될 때 EFA가 NCCL의 기본 제공자로 활성화됐음을 확인할 수 있습니다.
ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Selected Provider is efa*

p4d.24xlarge 인스턴스를 사용할 때 다음 추가 정보가 표시됩니다.

ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Running on P4d platform, Setting NCCL_TOPO_FILE environment variable to /home/ec2-user/install/plugin/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml

Step 9: 머신 러닝 애플리케이션 설치

임시 인스턴스에 머신 러닝 애플리케이션을 설치합니다. 설치 절차는 특정 머신 러닝 애플리케이션에 따라 다릅니다. Linux 인스턴스에 소프트웨어를 설치하는 방법에 대한 자세한 내용은 Amazon Linux 2023 사용 설명서의 OS 업데이트 관리 를 참고하세요.

참고 — 설치 지침은 머신 러닝 애플리케이션의 설명서를 참고하세요.

Step 10: EFA 및 NCCL 활성화 AMI 만들기

필요한 소프트웨어 구성 요소를 설치한 후, EFA 활성화 인스턴스를 실행하는 데 재사용할 수 있는 AMI를 만듭니다.

임시 인스턴스에서 AMI 만들기
  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 Instances를 선택합니다.
  3. 만든 임시 인스턴스를 선택하고 Actions, Image, Create image를 선택합니다.
  4. Create image에서 다음을 수행합니다.
    • Image name에 AMI에 대한 설명적인 이름을 입력합니다.
    • (선택 사항) Image description에 AMI의 목적에 대한 간단한 설명을 입력합니다.
    • Create image를 선택합니다.
  5. 탐색 창에서 AMIs를 선택합니다.
  6. 목록에서 만든 AMI를 찾습니다. 다음 단계로 진행하기 전에 상태가 pending에서 available로 바뀔 때까지 기다립니다.

Step 11: 임시 인스턴스 종료

이 시점에서는 실행한 임시 인스턴스가 더 이상 필요하지 않습니다. 인스턴스를 종료해 비용 발생을 중지할 수 있습니다.

임시 인스턴스 종료하기
  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에서 Instances를 선택합니다.
  3. 만든 임시 인스턴스를 선택한 다음 Actions, Instance state, Terminate instance를 선택합니다.
  4. 확인 메시지가 표시되면 Terminate를 선택합니다.

Step 12: 클러스터 배치 그룹에 EFA 및 NCCL 활성화 인스턴스 실행

이전에 만든 EFA 활성화 AMI와 EFA 활성화 보안 그룹을 사용해 EFA 및 NCCL 활성화 인스턴스를 클러스터 배치 그룹에 실행합니다.

참고 — EFA 활성화 인스턴스를 클러스터 배치 그룹에 실행하는 것은 절대적인 요구 사항은 아닙니다. 그러나 단일 가용 영역의 로우 레이턴시 그룹에 인스턴스를 실행하므로 클러스터 배치 그룹에서 EFA 활성화 인스턴스를 실행하는 것을 권장합니다.

  • 클러스터의 인스턴스를 확장할 때 용량을 사용할 수 있게 하려면 클러스터 배치 그룹에 대한 Capacity Reservation을 만들 수 있습니다(자세한 내용은 배치 그룹과 함께 Capacity Reservations 사용하기 참고).

새 콘솔

임시 인스턴스 실행하기
  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에서 Instances를 선택한 다음 Launch Instances를 선택해 새 실행 인스턴스 마법사를 엽니다.
  3. (선택 사항) Name and tags 섹션에 인스턴스 이름(예: EFA-instance)을 제공합니다.
  4. Application and OS Images 섹션에서 My AMIs를 선택한 다음 이전 단계에서 만든 AMI를 선택합니다.
  5. Instance type 섹션에서 p3dn.24xlarge 또는 p4d.24xlarge를 선택합니다.
  6. Key pair 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.
  7. Network settings 섹션에서 Edit을 선택한 후 다음을 수행합니다.
    • Subnet에서 인스턴스를 실행할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 인스턴스를 EFA에 활성화할 수 없습니다.
    • Firewall (security groups) 에서 Select existing security group을 선택한 다음 이전 단계에서 만든 보안 그룹을 선택합니다.
    • Advanced network configuration 섹션을 확장합니다.
    • Network interface 1에서 Network card index = 0, Device index = 0, Interface type = EFA with ENA를 선택합니다.
    • (선택 사항) p4d.24xlarge나 p5.48xlarge 같은 멀티 카드 인스턴스 유형을 사용하는 경우, 필요한 각 추가 네트워크 인터페이스에 대해 Add network interface를 선택하고, Network card index에서 다음 사용하지 않는 인덱스를 선택한 다음 Device index = 1과 Interface type = EFA with ENA 또는 EFA-only를 선택합니다.
  8. (선택 사항) Storage 섹션에서 필요에 따라 볼륨을 구성합니다.
  9. Advanced details 섹션의 Placement group name에서 인스턴스를 실행할 클러스터 배치 그룹을 선택합니다. 새 클러스터 배치 그룹을 만들어야 한다면 Create new placement group을 선택합니다.
  10. 오른쪽 Summary 패널에서 Number of instances에 실행하려는 EFA 활성화 인스턴스 수를 입력한 다음 Launch instance를 선택합니다.

이전 콘솔

클러스터 배치 그룹에 EFA 및 NCCL 활성화 인스턴스 실행하기
  1. Amazon EC2 콘솔을 엽니다.
  2. Launch Instance를 선택합니다.
  3. Choose an AMI 페이지에서 My AMIs를 선택하고, 이전에 만든 AMI를 찾은 다음 Select를 선택합니다.
  4. Choose an Instance Type 페이지에서 p3dn.24xlarge를 선택한 다음 Next: Configure Instance Details를 선택합니다.
  5. Configure Instance Details 페이지에서 다음을 수행합니다.
    • Number of instances에 실행하려는 EFA 및 NCCL 활성화 인스턴스 수를 입력합니다.
    • Network와 Subnet에서 인스턴스를 실행할 VPC와 서브넷을 선택합니다.
    • Placement group에서 Add instance to placement group을 선택합니다.
    • Placement group name에서 Add to a new placement group을 선택한 다음 배치 그룹에 대한 설명적인 이름을 입력합니다. 그런 다음 Placement group strategy에서 cluster를 선택합니다.
    • EFA에서 Enable을 선택합니다.
    • Network Interfaces 섹션의 디바이스 eth0에서 New network interface를 선택합니다. 선택적으로 기본 IPv4 주소와 하나 이상의 보조 IPv4 주소를 지정할 수 있습니다. 연결된 IPv6 CIDR 블록이 있는 서브넷에 인스턴스를 실행하는 경우 기본 IPv6 주소와 하나 이상의 보조 IPv6 주소를 선택적으로 지정할 수 있습니다.
  6. Next: Add Storage를 선택합니다.
  7. Add Storage 페이지에서 AMI가 지정한 볼륨(루트 디바이스 볼륨 등)에 추가로 인스턴스에 연결할 볼륨을 지정합니다. 그런 다음 Next: Add Tags를 선택합니다.
  8. Add Tags 페이지에서 인스턴스에 대한 태그(사용자 친화적인 이름 등)를 지정한 다음 Next: Configure Security Group을 선택합니다.
  9. Configure Security Group 페이지의 Assign a security group에서 Select an existing security group을 선택한 다음 이전에 만든 보안 그룹을 선택합니다.
  10. Review and Launch를 선택합니다.
  11. Review Instance Launch 페이지에서 설정을 검토한 다음 Launch를 선택해 키 페어를 선택하고 인스턴스를 실행합니다.

Step 13: 패스워드 없는 SSH 활성화

참고 — 기본 SSH 사용자는 운영 체제에 따라 다릅니다: Ubuntu는 ubuntu, Debian은 admin, Amazon Linux와 RHEL은 ec2-user.

애플리케이션이 클러스터의 모든 인스턴스에서 실행되게 하려면 리더 노드에서 멤버 노드로의 패스워드 없는 SSH 접근을 활성화해야 합니다. 리더 노드는 애플리케이션을 실행하는 인스턴스입니다. 클러스터의 나머지 인스턴스는 멤버 노드입니다.

클러스터의 인스턴스 간 패스워드 없는 SSH 활성화하기
  1. 클러스터에서 한 인스턴스를 리더 노드로 선택하고 연결합니다.
  2. 리더 노드에서 strictHostKeyChecking을 비활성화하고 ForwardAgent를 활성화합니다. 선호하는 텍스트 편집기로 ~/.ssh/config를 열고 다음을 추가합니다.
Host *
    ForwardAgent yes
Host *
    StrictHostKeyChecking no
  1. RSA 키 페어를 생성합니다.
$ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

키 페어는 $HOME/.ssh/ 디렉토리에 생성됩니다. 4. 리더 노드에서 프라이빗 키의 권한을 변경합니다.

$ chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/config
  1. 선호하는 텍스트 편집기로 ~/.ssh/id_rsa.pub을 열고 키를 복사합니다.
  2. 클러스터의 각 멤버 노드에 대해 다음을 수행합니다.
    • 인스턴스에 연결합니다.
    • 선호하는 텍스트 편집기로 ~/.ssh/authorized_keys를 열고 이전에 복사한 공개 키를 추가합니다.
  3. 패스워드 없는 SSH가 예상대로 작동하는지 테스트하려면 리더 노드에 연결하고 다음 명령을 실행합니다.
$ ssh member_node_private_ip

키나 패스워드를 묻지 않고 멤버 노드에 연결되어야 합니다.

더 알아보기

  • EFA와 MPI 시작하기
  • EFA와 NIXL 시작하기