Amazon EC2에서 추론 워크로드를 위한 EFA 및 NIXL 시작하기

Amazon EC2에서 추론 워크로드를 위한 EFA 및 NIXL 시작하기

**NVIDIA Inference Xfer Library(NIXL)**는 분리형(disaggregated) 추론 워크로드를 위해 특별히 설계된 고처리량, 저지연 통신 라이브러리예요. NIXL은 EFA 및 Libfabric과 함께 사용해 프리필(prefill) 노드와 디코드(decode) 노드 간의 KV-캐시 전송을 지원할 수 있으며, 다양한 스토리지 계층 간의 효율적인 KV-캐시 이동을 가능하게 합니다. 자세한 내용은 NIXL 웹사이트를 참고하세요.

요구사항 (Requirements)

  • 지원되는 기본 AMI: Amazon Linux 2023, Ubuntu 24.04, Ubuntu 22.04.
  • EFA는 NIXL 1.0.0 이상만 지원합니다.

출처: 문서

본문

NVIDIA Inference Xfer Library(NIXL)는 분리형 추론 워크로드를 위해 특별히 설계된 고처리량, 저지연 통신 라이브러리입니다. NIXL은 EFA 및 Libfabric과 함께 사용해 프리필 노드와 디코드 노드 간의 KV-캐시 전송을 지원할 수 있으며, 다양한 스토리지 계층 간의 효율적인 KV-캐시 이동을 가능하게 합니다. 자세한 내용은 NIXL 웹사이트를 참고하세요.

Steps

Step 1: EFA 활성화 보안 그룹 만들기

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

Important
이 보안 그룹은 테스트 목적으로만 사용하기 위한 것입니다. 프로덕션 환경에서는 연결하는 IP 주소(예: 컴퓨터의 IP 주소) 또는 로컬 네트워크의 IP 주소 범위에서만 트래픽을 허용하는 인바운드 SSH 규칙을 만들 것을 권장합니다.

다른 시나리오는 Security group rules for different use cases을 참고하세요.

EFA 활성화 보안 그룹을 만들려면

  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 Security Groups를 선택하고 Create security group을 선택합니다.
  3. Security group name에 EFA-enabled security group 같은 설명적인 이름을 입력합니다.
  4. (선택 사항) Description에 보안 그룹에 대한 간단한 설명을 입력합니다.
  5. VPC에 EFA 활성화 인스턴스를 시작하려는 VPC를 선택합니다.
  6. Create security group을 선택합니다.

인바운드 규칙을 추가하려면

  1. 만든 보안 그룹을 선택합니다.
  2. Inbound rules 탭에서 Edit inbound rules를 선택합니다.
  3. Add rule을 선택합니다.
  4. Type에서 All traffic을 선택합니다.
  5. Source type에서 Custom을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.
  6. Add rule을 선택합니다.
  7. Type에서 SSH를 선택합니다.
  8. Source type에서 Anywhere-IPv4를 선택합니다.
  9. Save rules를 선택합니다.

아웃바운드 규칙을 추가하려면

  1. Outbound rules 탭에서 Edit outbound rules를 선택합니다.
  2. Add rule을 선택합니다.
  3. Type에서 All traffic을 선택합니다.
  4. Destination type에서 Custom을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.
  5. Save rules를 선택합니다.

Important
자체 참조 인바운드 및 아웃바운드 규칙(보안 그룹 자체로부터/로의 모든 트래픽 허용)은 EFA가 작동하는 데 필수입니다. 이러한 규칙이 없으면 인스턴스 간 EFA 트래픽이 차단됩니다.

Step 2: 임시 인스턴스 시작하기

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

임시 인스턴스를 시작하려면

  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 AMIs를 선택하고 EFA 및 NIXL을 지원하는 기본 AMI를 찾아 선택합니다.
  3. 생성한 보안 그룹을 선택하고 인스턴스를 시작합니다.
  4. Subnet에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 인스턴스를 EFA용으로 활성화할 수 없습니다.
  5. **Firewall (security groups)**에서 Select existing security group을 선택한 다음, 이전 단계에서 만든 보안 그룹을 선택합니다.
  6. 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를 선택합니다.

Note
EFA 인스턴스를 시작하려면 서브넷을 선택해야 해요.

  1. Storage 섹션에서 필요에 따라 볼륨을 구성합니다. Nvidia CUDA Toolkit용으로 추가로 10~20GiB의 스토리지를 프로비저닝해야 합니다. 충분한 스토리지를 프로비저닝하지 않으면 Nvidia 드라이버와 CUDA 툴킷을 설치하려고 할 때 디스크 공간 부족 오류가 발생합니다.
  2. 오른쪽의 Summary 패널에서 Launch instance를 선택합니다.

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

Important
AMI에 이미 Nvidia GPU 드라이버, CUDA 툴킷, cuDNN이 포함되어 있거나 비 GPU 인스턴스를 사용한다면 이 단계를 건너뛰세요.

Amazon Linux 2023

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN을 설치하려면

  1. 현재 실행 중인 커널 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.
$ sudo dnf upgrade -y && sudo reboot
$ sudo dnf groupinstall 'Development Tools' -y && sudo dnf install -y dkms kernel-devel-$(uname -r) kernel-headers-$(uname -r)
  1. /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
  1. 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
  1. NVIDIA CUDA 저장소를 추가합니다.
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
  1. NVIDIA 드라이버를 설치합니다.
$ 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
  1. CUDA 툴킷과 cuDNN을 설치합니다.
$ sudo dnf install -y cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-devel-cuda-13
  1. NVIDIA 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
  1. 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
  1. 다음 명령을 실행해 NVIDIA GPU 드라이버가 작동하는지 확인합니다. 이 명령은 NVIDIA GPU, NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit에 대한 정보를 반환해야 합니다.
$ nvidia-smi -q | head

Ubuntu 24.04 및 Ubuntu 22.04

NVIDIA GPU 드라이버, NVIDIA CUDA Toolkit, cuDNN을 설치하려면

  1. 현재 실행 중인 커널 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get update && sudo apt-get install build-essential -y
  1. /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
  1. 선호하는 텍스트 편집기로 /etc/default/grub을 열고 다음을 추가합니다.
GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
  1. GRUB 구성을 다시 빌드합니다.
$ sudo update-grub
  1. CUDA 저장소 키링 추가 및 저장소를 구성합니다.

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 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 /' \
&& sudo apt-get update

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
  1. NVIDIA 드라이버, CUDA 툴킷, cuDNN을 설치합니다.
$ sudo apt-get install -y nvidia-open-580 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
  1. NVIDIA Fabric Manager를 설치하고 시작합니다.
$ sudo apt-get install -y nvidia-fabricmanager-580 \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  1. 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
  1. 다음 명령을 실행해 NVIDIA GPU 드라이버가 작동하는지 확인합니다.
$ nvidia-smi -q | head

Step 4: GDRCopy 설치하기

Important
AMI에 이미 GDRCopy가 포함되어 있거나 비 GPU 인스턴스를 사용한다면 이 단계를 건너뛰세요.

GPU 기반 플랫폼에서 Libfabric의 성능을 향상시키려면 GDRCopy를 설치합니다. GDRCopy에 대한 자세한 내용은 GDRCopy repository을 참고하세요.

Amazon Linux 2023

GDRCopy를 설치하려면

  1. 필요한 종속성을 설치합니다.
$ sudo yum -y install dkms rpm-build make check check-devel
  1. 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
  1. GDRCopy RPM 패키지를 빌드합니다.
$ CUDA=/usr/local/cuda ./build-rpm-packages.sh
  1. 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 24.04 및 Ubuntu 22.04

GDRCopy를 설치하려면

  1. 필요한 종속성을 설치합니다. Ubuntu 22.04에서만 이러한 추가 종속성을 설치합니다.
$ sudo apt-get install -y build-essential devscripts debhelper fakeroot pkg-config dkms

Note
Ubuntu 22.04에서만:

$ sudo apt-get install -y check libsubunit-dev
  1. 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
  1. 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

Step 5: EFA 소프트웨어 설치하기

Important
AMI에 이미 최신 EFA 설치 프로그램이 포함되어 있다면 이 단계를 건너뛰세요.

인스턴스에서 EFA를 지원하는 데 필요한 EFA 활성화 커널, EFA 드라이버, Libfabric 스택을 설치합니다.

EFA 소프트웨어를 설치하려면

  1. 인스턴스에 연결한 뒤 EFA 설치 프로그램을 다운로드합니다.
$ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.50.0.tar.gz
  1. 설치 프로그램을 추출합니다.
$ tar -xf aws-efa-installer-1.50.0.tar.gz && rm -rf aws-efa-installer-1.50.0.tar.gz && cd aws-efa-installer
  1. GPG 공용 키를 다운로드합니다.
$ wget https://efa-installer.amazonaws.com/aws-efa-installer.key
  1. 키 경로를 내보냅니다. 그런 다음 다음 단계에서 설치 명령에 --check-signatures를 추가하고 환경 변수를 보존하려면 sudo 대신 sudo -E를 사용합니다.
$ export EFA_INSTALLER_KEY=$(pwd)/aws-efa-installer.key

RPM 기반 시스템(Amazon Linux, RHEL, Rocky Linux, SUSE)에서 설치 프로그램은 rpm --checksig로 각 RPM을 확인합니다. DEB 기반 시스템(Ubuntu, Debian)에서 설치 프로그램은 GPG 서명 확인으로 각 DEB를 확인합니다.

패키지 확인이 실패하면 설치가 즉시 중단되어 손상되거나 악의적인 패키지로부터 시스템을 보호합니다.

Note
--check-signatures 플래그는 선택 사항입니다. 이 플래그가 없으면 설치 프로그램은 개별 서명 확인을 수행하지 않아요.

  1. EFA 설치 프로그램을 실행합니다.
$ sudo ./efa_installer.sh -y
  1. EFA가 설치되었는지 확인합니다.
$ fi_info -p efa -t FI_EP_RDM

단일 네트워크 인터페이스가 있는 p3dn.24xlarge의 예시 출력:

provider: efa
fabric: EFA-fe80::94:3dff:fe89:1b70
domain: efa_0-rdm
version: 2.0
type: FI_EP_RDM
protocol: FI_PROTO_EFA

여러 네트워크 인터페이스가 있는 p4d.24xlarge 및 p5.48xlarge의 예시 출력:

provider: efa
fabric: EFA-fe80::c6e:8fff:fef6:e7ff
domain: efa_0-rdm
version: 111.0
type: FI_EP_RDM
protocol: FI_PROTO_EFA
provider: efa
fabric: EFA-fe80::c34:3eff:feb2:3c35
domain: efa_1-rdm
version: 111.0
type: FI_EP_RDM
protocol: FI_PROTO_EFA
provider: efa
fabric: EFA-fe80::c0f:7bff:fe68:a775
domain: efa_2-rdm
version: 111.0
type: FI_EP_RDM
protocol: FI_PROTO_EFA
provider: efa
fabric: EFA-fe80::ca7:b0ff:fea6:5e99
domain: efa_3-rdm
version: 111.0
type: FI_EP_RDM
protocol: FI_PROTO_EFA

Step 6: NIXL 설치하기

NIXL을 설치합니다. NIXL에 대한 자세한 내용은 NIXL repository을 참고하세요.

사전 빌드된 배포판 (Pre-built distributions)

PyPI를 사용해 NIXL을 설치하려면

  • Amazon Linux 2023:
$ sudo dnf install -y python3.11 python3.11-pip
  • Ubuntu 24.04 및 Ubuntu 22.04:
$ sudo apt install pip
  • Amazon Linux 2023:
$ pip3.11 install nixl
  • Ubuntu 24.04 및 Ubuntu 22.04:
$ pip install nixl

소스에서 빌드 (Build from source)

소스에서 NIXL을 빌드하고 설치하려면

  1. 빌드 종속성을 설치합니다.

Amazon Linux 2023

$ sudo dnf install -y cmake gcc-c++ git pkgconf-pkg-config ninja-build libaio-devel hwloc-devel numactl-devel python3-devel python3.11 python3.11-devel python3.11-pip \
&& sudo pip3.11 install meson ninja pybind11

Ubuntu 24.04 및 Ubuntu 22.04

$ sudo apt install cmake pkg-config meson pybind11-dev libaio-dev nvidia-cuda-toolkit pip libhwloc-dev \
&& pip install meson ninja pybind11
  1. (Amazon Linux 2023만 해당) Libfabric 설치용 lib 심링크를 만듭니다. Amazon Linux 2023에서 EFA 설치 프로그램은 Libfabric 라이브러리를 /opt/amazon/efa/lib64에 두지만, NIXL 빌드는 lib에서 찾을 것으로 예상합니다.
$ sudo ln -s /opt/amazon/efa/lib64 /opt/amazon/efa/lib
  1. 홈 디렉터리로 이동합니다.
$ cd $HOME
  1. 공식 NIXL 저장소를 인스턴스에 복제하고 로컬 복제 저장소로 이동합니다.
$ sudo git clone https://github.com/ai-dynamo/nixl.git && cd nixl
  1. NIXL을 빌드하고 설치하며, Libfabric 설치 디렉터리 경로를 지정합니다.
$ sudo meson setup . nixl --prefix=/usr/local/nixl -Dlibfabric_path=/opt/amazon/efa
$ cd nixl && sudo ninja && sudo ninja install

Step 7: NIXL Benchmark 설치 및 테스트

NIXL Benchmark를 설치하고 테스트를 실행해 임시 인스턴스가 EFA 및 NIXL에 대해 제대로 구성되었는지 확인합니다. NIXL Benchmark를 사용하면 NIXL이 올바르게 설치되었고 예상대로 작동하는지 확인할 수 있습니다. 자세한 내용은 nixlbench repository을 참고하세요.

NIXL Benchmark(nixlbench)는 클라이언트와 서버 간의 조정을 위해 ETCD가 필요합니다. NIXL과 함께 ETCD를 사용하려면 ETCD Server와 Client, ETCD CPP API가 필요합니다.

Docker에서 빌드 (Build from Docker)

Docker를 사용해 NIXL Benchmark를 설치하고 테스트하려면

  1. nixl 저장소를 복제합니다.
$ git clone https://github.com/ai-dynamo/nixl.git
$ cd nixl/benchmark/nixlbench/contrib
  1. Docker를 설치합니다.

Amazon Linux 2023

$ sudo dnf install -y docker \
&& sudo systemctl enable --now docker

Ubuntu 24.04 및 Ubuntu 22.04

$ sudo apt install docker.io -y
  1. nixlbench Docker 이미지를 빌드합니다.
$ ./build.sh
  1. 조정을 위한 ETCD 서버를 시작합니다.
$ docker run -d --name etcd-server \
    -p 2379:2379 -p 2380:2380 \
    quay.io/coreos/etcd:v3.5.18 \
    /usr/local/bin/etcd \
    --data-dir=/etcd-data \
    --listen-client-urls=http://0.0.0.0:2379 \
    --advertise-client-urls=http://0.0.0.0:2379 \
    --listen-peer-urls=http://0.0.0.0:2380 \
    --initial-advertise-peer-urls=http://0.0.0.0:2380 \
    --initial-cluster=default=http://0.0.0.0:2380
  1. ETCD 서버가 실행 중인지 확인합니다. 예상 출력:
$ curl -L http://localhost:2379/health
{"health":"true"}
  1. 인스턴스에 두 개의 터미널을 엽니다. 두 터미널 모두에서 다음 명령을 실행해 설치를 확인합니다. 이 명령은 같은 인스턴스의 ETCD 서버를 사용하고, Libfabric을 백엔드로 사용하며, GPU 메모리를 사용해 작동합니다. 비 GPU 인스턴스에는 VRAM 대신 DRAM 값을 사용하세요.
$ docker run -it --gpus all --network host nixlbench:latest \
    nixlbench --etcd_endpoints http://localhost:2379 \
    --backend LIBFABRIC \
    --initiator_seg_type VRAM \
    --target_seg_type VRAM

소스에서 빌드 (Build from source)

Important
Step 6에서 Build from source를 선택한 경우에만 이 탭을 따르세요.

NIXL Benchmark를 설치하려면

  1. ETCD 종속성을 설치합니다.
  • Amazon Linux 2023:
$ sudo dnf install -y gflags-devel
  • Ubuntu 24.04 및 Ubuntu 22.04:
$ sudo apt install libgflags-dev
  1. ETCD를 설치합니다. Amazon Linux 2023은 ETCD 패키지를 제공하지 않습니다. 사전 빌드된 릴리스 바이너리를 다운로드해 설치합니다.
$ ETCD_VER=v3.5.18 \
&& curl -L https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd.tar.gz \
&& sudo mkdir -p /usr/local/etcd \
&& sudo tar -xzf /tmp/etcd.tar.gz -C /usr/local/etcd --strip-components=1 \
&& sudo ln -sf /usr/local/etcd/etcd /usr/local/bin/etcd \
&& sudo ln -sf /usr/local/etcd/etcdctl /usr/local/bin/etcdctl
  • Ubuntu 24.04 및 Ubuntu 22.04:
$ sudo apt install -y etcd-server etcd-client
  1. cpprest 및 protobuf 종속성을 설치합니다.
  • Amazon Linux 2023:
$ sudo dnf install -y boost-devel openssl-devel grpc-devel grpc-plugins protobuf-devel protobuf-compiler
  • Ubuntu 24.04 및 Ubuntu 22.04:
$ sudo apt install libboost-all-dev libssl-dev libgrpc-dev libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc libcpprest-dev
  1. (Amazon Linux 2023만 해당) C++ REST SDK(cpprest)는 Amazon Linux 2023 리포지토리에 없으므로 소스에서 빌드하고 설치합니다.
$ cd $HOME
$ git clone https://github.com/microsoft/cpprestsdk.git
$ cd cpprestsdk
$ git submodule update --init
$ mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DWERROR=OFF
$ sudo make -j$(nproc) && sudo make install
  1. ETCD CPP API를 복제하고 설치합니다.
$ cd $HOME
$ git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
$ cd etcd-cpp-apiv3
$ mkdir build && cd build
$ cmake ..
$ sudo make -j$(nproc) && sudo make install
  1. nixlbench를 빌드하고 설치합니다.
$ sudo meson setup . $HOME/nixl/benchmark/nixlbench -Dnixl_path=/usr/local/nixl/
$ sudo ninja && sudo ninja install

EFA 및 NIXL 구성을 테스트하려면

  1. 프리필 노드에서 ETCD를 시작합니다.
$ etcd --listen-client-urls "http://0.0.0.0:2379" \
    --advertise-client-urls "http://localhost:2379" &
  1. ETCD가 실행 중인지 확인합니다.
$ curl -L http://localhost:2379/health
{"health":"true"}
  1. nixlbench 바이너리 디렉터리로 이동합니다.
$ cd /usr/local/nixlbench/bin/
  1. nixlbench를 실행합니다.
  • NIXL_LOG_LEVEL=INFO — 자세한 디버깅 출력을 활성화합니다. 오류 메시지만 받으려면 WARN을 지정할 수도 있습니다.
  • LD_LIBRARY_PATH — NIXL 라이브러리의 경로를 설정합니다.
$ export NIXL_LOG_LEVEL=INFO
$ export LD_LIBRARY_PATH=/usr/local/nixl/lib/$(gcc -dumpmachine):$LD_LIBRARY_PATH

$ nixlbench --etcd-endpoints 'http://localhost:2379' \
    --backend 'LIBFABRIC' \
    --initiator_seg_type 'VRAM' \
    --target_seg_type 'VRAM'

Amazon Linux 2023에서는 NIXL이 라이브러리를 lib64에 설치합니다. 대신 다음과 같이 라이브러리 경로를 설정합니다.

$ export LD_LIBRARY_PATH=/usr/local/nixl/lib64:/usr/local/nixl/lib64/plugins:$LD_LIBRARY_PATH

Note
비 GPU 인스턴스에는 VRAM 대신 DRAM 값을 사용하세요.

Step 8: 머신 러닝 애플리케이션 설치하기

임시 인스턴스에 머신 러닝 애플리케이션을 설치합니다. 설치 절차는 특정 머신 러닝 애플리케이션에 따라 다릅니다.

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

Step 9: 임시 인스턴스에서 AMI 만들기

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

임시 인스턴스에서 AMI를 만들려면

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

이 시점에서 시작한 임시 인스턴스는 더 이상 필요하지 않습니다. 인스턴스를 종료해 요금이 발생하지 않도록 할 수 있습니다.

임시 인스턴스를 종료하려면

  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 Instances를 선택합니다.
  3. 만든 임시 인스턴스를 선택하고 Actions, Instance state, Terminate instance를 선택합니다.
  4. 확인을 묻는 메시지가 표시되면 Terminate를 선택합니다.

Step 10: EFA 및 NIXL 활성화 인스턴스 시작하기

Step 9에서 만든 EFA 활성화 AMI와 Step 1에서 만든 EFA 활성화 보안 그룹을 사용해 EFA 및 NIXL 활성화 인스턴스를 시작합니다.

EFA 및 NIXL 활성화 인스턴스를 시작하려면

  1. Amazon EC2 콘솔(https://console.aws.amazon.com/ec2/)을 엽니다.
  2. 탐색 창에서 AMIs를 선택하고 만든 EFA 활성화 AMI를 선택합니다.
  3. Subnet에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 인스턴스를 EFA용으로 활성화할 수 없습니다.
  4. **Firewall (security groups)**에서 Select existing security group을 선택한 다음 Step 1에서 만든 보안 그룹을 선택합니다.
  5. Advanced network configuration 섹션을 펼칩니다. Network interface 1에 대해 Network card index = 0, Device index = 0, Interface type = EFA with ENA를 선택합니다. (선택 사항) 멀티 카드 인스턴스 유형을 사용한다면 각 추가 네트워크 인터페이스에 대해 Add network interface를 선택하고 Device index = 1 및 Interface type = EFA with ENA 또는 EFA-only를 선택합니다.
  6. (선택 사항) Storage 섹션에서 필요에 따라 볼륨을 구성합니다.
  7. 오른쪽의 Summary 패널에서 Number of instances에 시작할 EFA 활성화 인스턴스 수를 입력한 다음 Launch instance를 선택합니다.

Step 11: 클러스터의 인스턴스 간 비밀번호 없는 SSH 활성화하기

애플리케이션이 클러스터의 모든 인스턴스에서 실행되도록 하려면 리더 노드에서 멤버 노드로 비밀번호 없는 SSH 액세스를 활성화해야 합니다. 리더 노드는 애플리케이션을 실행하는 인스턴스입니다. 클러스터의 나머지 인스턴스는 멤버 노드입니다.

클러스터의 인스턴스 간 비밀번호 없는 SSH를 활성화하려면

  1. 인스턴스에 연결합니다.
  2. ~/.ssh/config 파일에 다음을 추가합니다.
Host *
    ForwardAgent yes
Host *
    StrictHostKeyChecking no
  1. 리더 노드에서 SSH 키 쌍을 생성합니다.
$ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
  1. 권한을 설정합니다.
$ chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/config
  1. 공용 키를 클러스터의 각 멤버 노드에 추가합니다. 리더 노드에서 공용 키(~/.ssh/id_rsa.pub)를 복사합니다. 각 멤버 노드에서 ~/.ssh/authorized_keys를 선호하는 텍스트 편집기로 열고 이전에 복사한 공용 키를 추가합니다.
  2. 비밀번호 없는 SSH가 예상대로 작동하는지 테스트하려면 리더 노드에 연결하고 다음 명령을 실행합니다. 키나 비밀번호를 묻는 메시지 없이 멤버 노드에 연결되어야 합니다.
$ ssh member_node_private_ip

Step 12: (Build from source를 따른 경우) EFA 및 NIXL 구성 테스트하기

Important
Step 7을 따랐다면 Step 12를 따르세요.

인스턴스가 EFA 및 NIXL에 대해 제대로 구성되었는지 확인하는 테스트를 실행합니다.

Docker에서 빌드 (Build from Docker)

Docker를 사용해 인스턴스 간 EFA 및 NIXL 구성을 테스트하려면

  1. nixlbench 벤치마크를 실행할 두 호스트를 선택합니다. 메타데이터 교환을 위해 첫 번째 호스트의 IP 주소를 ETCD 서버 IP로 사용합니다.
  2. 호스트 1에서 ETCD 서버를 시작합니다.
$ docker run -d --name etcd-server \
    -p 2379:2379 -p 2380:2380 \
    quay.io/coreos/etcd:v3.5.18 \
    /usr/local/bin/etcd \
    --data-dir=/etcd-data \
    --listen-client-urls=http://0.0.0.0:2379 \
    --advertise-client-urls=http://0.0.0.0:2379 \
    --listen-peer-urls=http://0.0.0.0:2380 \
    --initial-advertise-peer-urls=http://0.0.0.0:2380 \
    --initial-cluster=default=http://0.0.0.0:2380
  1. ETCD 서버가 실행 중인지 확인합니다.
$ curl -L http://localhost:2379/health
{"health":"true"}
  1. 호스트 1에서 nixlbench 벤치마크를 실행합니다.
$ docker run -it --gpus all --network host nixlbench:latest \
    nixlbench --etcd_endpoints http://localhost:2379 \
    --backend LIBFABRIC \
    --initiator_seg_type VRAM
  1. 호스트 2에서 nixlbench 벤치마크를 실행합니다.
$ docker run -it --gpus all --network host nixlbench:latest \
    nixlbench --etcd_endpoints http://ETCD_SERVER_IP:2379 \
    --backend LIBFABRIC \
    --initiator_seg_type VRAM

소스에서 빌드 (Build from source)

Important
Step 6에서 Build from source를 선택한 경우에만 이 탭을 따르세요.

인스턴스 간 EFA 및 NIXL 구성을 테스트하려면

  1. nixlbench 벤치마크를 실행할 두 호스트를 선택합니다. 메타데이터 교환을 위해 첫 번째 호스트의 IP 주소를 ETCD 서버 IP로 사용합니다.
  2. 호스트 1에서 ETCD 서버를 시작합니다.
$ etcd --listen-client-urls "http://0.0.0.0:2379" \
    --advertise-client-urls "http://localhost:2379" &
  1. ETCD 서버가 실행 중인지 확인합니다.
$ curl -L http://localhost:2379/health
{"health":"true"}
  1. 호스트 1에서 nixlbench 벤치마크를 실행합니다. Amazon Linux 2023에서는 NIXL이 라이브러리를 lib64에 설치합니다. 대신 다음과 같이 라이브러리 경로를 설정합니다.
$ export LD_LIBRARY_PATH=/usr/local/nixl/lib64:/usr/local/nixl/lib64/plugins:$LD_LIBRARY_PATH
$ export NIXL_LOG_LEVEL=INFO
$ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

$ nixlbench \
    --etcd-endpoints http://localhost:2379 \
    --backend LIBFABRIC \
    --initiator_seg_type VRAM
  1. 호스트 2에서 nixlbench 벤치마크를 실행합니다. Amazon Linux 2023에서는 NIXL이 라이브러리를 lib64에 설치합니다. 대신 다음과 같이 라이브러리 경로를 설정합니다.
$ export LD_LIBRARY_PATH=/usr/local/nixl/lib64:/usr/local/nixl/lib64/plugins:$LD_LIBRARY_PATH
$ export NIXL_LOG_LEVEL=INFO
$ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

$ nixlbench \
    --etcd-endpoints http://ETCD_SERVER_IP:2379 \
    --backend LIBFABRIC \
    --initiator_seg_type VRAM

Step 13: vLLM으로 추론 워크로드 서빙하기

NIXL을 설치한 후 vLLM, SGLang, TensorRT-LLM 같은 LLM 추론 및 서빙 프레임워크를 통해 NIXL을 사용할 수 있습니다.

vLLM을 사용해 추론 워크로드를 서빙하려면

  1. vLLM을 설치합니다.
$ pip install vllm
  1. 다음 샘플 구성은 프로듀서(프리필러)와 컨슈머(디코더) 구성을 보여줍니다.

프로듀서(프리필러) 구성

$ vllm serve your-application \
    --port 8200 \
    --enforce-eager \
    --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'

컨슈머(디코더) 구성

$ vllm serve your-application \
    --port 8200 \
    --enforce-eager \
    --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'

앞의 샘플 구성은 다음을 설정합니다.

  • kv_role을 kv_both로 설정해 커넥터가 프로듀서와 컨슈머로 모두 작동할 수 있는 대칭 기능을 활성화합니다. 이는 실험적 설정과 역할 구분이 미리 정해지지 않은 시나리오에 유연성을 제공합니다.
  • kv_buffer_device를 cuda로 설정해 GPU 메모리 사용을 활성화합니다.
  • NIXL 백엔드를 LIBFABRIC으로 설정해 NIXL 트래픽이 EFA를 통해 이동할 수 있게 합니다.

더 알아보기 (Learn more)