MLOps/GPU

GPUDirect RDMA와 vGPU

DanielZZI 2024. 6. 11. 03:53
728x90

먼저 RDMA부터 알아보자

RDMA (Remote Direct Memory Access)

RDMA는 네트워크를 통해 데이터 전송 시, CPU의 개입을 최소화하고 메모리 대 메모리 전송을 직접 수행하는 기술입니다. 주요 특징은 다음과 같습니다:

  1. 낮은 지연 시간: 데이터 전송 중에 CPU가 관여하지 않기 때문에 지연 시간이 매우 짧습니다.
  2. 높은 대역폭: 네트워크 인터페이스 카드(NIC)가 직접 메모리에 접근하여 데이터를 전송하기 때문에 높은 대역폭을 제공합니다.
  3. 낮은 CPU 오버헤드: CPU의 개입이 최소화되어 CPU 사용률이 낮아집니다.
  4. 제로 카피: 데이터가 직접 전송되므로 추가적인 데이터 복사가 필요 없습니다.

RDMA는 인피니밴드(InfiniBand), RoCE (RDMA over Converged Ethernet), iWARP (Internet Wide Area RDMA Protocol) 등의 프로토콜을 통해 구현됩니다.

다음 GPUDirect RDMA를 알아보자

GPUDirect RDMA

GPUDirect RDMA는 NVIDIA의 기술로, RDMA를 GPU 메모리에 직접 적용하여 GPU와 네트워크 장치 간의 데이터 전송을 효율화합니다. 주요 특징은 다음과 같습니다:

  1. GPU와 네트워크 장치 간의 직접 데이터 전송: 데이터가 GPU와 네트워크 장치 간에 직접 전송되므로, CPU 메모리로의 불필요한 전송 단계를 제거합니다.
  2. 낮은 지연 시간: 데이터 전송 중에 CPU 개입을 최소화하여 지연 시간을 줄입니다.
  3. 높은 대역폭: GPU 메모리와 네트워크 장치 간의 고속 데이터 전송을 가능하게 합니다.
  4. 효율적인 자원 사용: CPU 자원 사용을 줄이고, 데이터 전송 효율성을 극대화합니다.

GPUDirect RDMA를 사용하기위해서는 다음과 같은 것들이 필요하다.

1.GPU

  • RDMA 지원 NVIDIA GPU like Tesla, Quadro, A시리즈 등

2.NIC

  • Infiniband, RoCE를 지원하는 NIC. 대표적으로 Mellanox의 ConnetX시리즈를 많이 사용한다.

3.SW

  • Linux kernel특정버전 호환성 확인필요
  • driver 및 library: Nvidia GPU Driver, CUDA 툴킷, Mellanox OFED 드라이버(MOFED) 등
    -> NVIDIA GPU Operator 및 Netwokr Operator를 통해 container로 셋업가능하다.

vGPU와 GPUDirect RDMA 활용

먼저 VM 구성시 옵션을 통한 RoCE또는 물리적 NIC 연결필요

pciPassthru.allowP2P = true: PCI 장치 간의 P2P 통신 허용.
pciPassthru.RelaxACSforP2P = true: ACS 규칙을 완화하여 P2P 통신 허용.
pciPassthru.use64bitMMIO = true: 64비트 MMIO 주소 공간 사용.
pciPassthru.64bitMMIOSizeGB = 128: 64비트 MMIO 주소 공간 크기를 128GB로 설정.

SR-IOV 설정
SR-IOV는 물리적 NIC를 여러 가상 NIC(VF)로 나누어 VM이 직접 NIC에 접근할 수 있게 하는 기술

  • 커널파라미터 설정
    he host is booted with intel_iommu=on or amd_iommu=on on the kernel command line.
    /etc/default/grub 파일을 편집하여 커널 파라미터에 IOMMU 설정을 추가합니다.
    bash
    코드 복사
    GRUB_CMDLINE_LINUX="... intel_iommu=on" # Intel
    GRUB_CMDLINE_LINUX="... amd_iommu=on" # AMD
    그런 다음, GRUB 설정을 업데이트하고 시스템을 재부팅합니다.
    bash
    코드 복사
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    sudo reboot

  • 물리 NIC에서 SR-IOV VF(가상스위치)생성

1.command로 생성
echo 8 > /sys/class/net/<PF 인터페이스 이름>/device/sriov_numvfs

2.ui를 통한 생성 참고
https://www.juniper.net/documentation/kr/ko/software/vmx/vmx-vmware/topics/task/vmx-sriov-enabling-vmware.html

완벽하진 않으나, 일단 정리..