GDRCopy: NVIDIA가 공개한, 초저지연 GPU 메모리 복사 라이브러리 (feat. GPUDirect RDMA)

GDRCopy 라이브러리 소개

NVIDIA의 GDRCopy는 초저지연 GPU 메모리 복사를 가능하게 하는 오픈소스 유저 공간 라이브러리입니다. 이 라이브러리는 NVIDIA의 GPUDirect 기술군, 그 중에서도 GPUDirect RDMA에서 파생된 접근 방식을 바탕으로, GPU 메모리를 사용자 공간에서 직접 매핑하여 일반 메모리처럼 읽고 쓸 수 있는 기능을 제공합니다.

GDRCopy는 cudaMemcpy() 함수보다 훨씬 낮은 오버헤드로 GPU 메모리 복사를 수행합니다. cudaMemcpy()는 내부적으로 동기화, 캐시 관리, 컨텍스트 전환이 발생할 수 있어 짧은 데이터 전송에 오버헤드가 큽니다. 반면, GDRCopy는 GPU 메모리를 CPU 공간으로 직접 매핑해 사용자 프로그램이 복사 작업을 직접 수행하도록 하여, 평균 6~7μs 수준의 복사 지연을 달성합니다. 이 방식은 실시간 데이터 처리, ping-pong 테스트, GPU 간 통신(MPI) 등에서 큰 이점을 제공합니다.

다만, 이 복사 방식은 메모리 고정(pin) 작업이 선행되어야 하며, 초기화 과정에서 메모리 크기에 따라 10μs~1ms 정도의 비용이 소모됩니다. 이후 매핑된 메모리에 직접 접근하는 구조이므로, 대역폭 측면에서도 매우 우수한 성능을 보입니다(H→D 방향 기준 6~8GB/s).

GDRCopy는 GPUDirect RDMA처럼 외부 네트워크 장치와 직접 상호작용하지는 않지만, 내부적으로 NVIDIA의 커널 드라이버(nvidia-peermem) 및 바이트 주소 공간(BAR)을 활용해 GPU 메모리에 대한 직접 접근을 가능하게 합니다. 이를 통해 CPU가 중개하지 않고 GPU 메모리로 바로 DMA 전송을 수행할 수 있어, 불필요한 복사 제거, 낮은 레이턴시, CPU 자원 절감이라는 세 가지 핵심 이점을 제공합니다.

GDRCopy 프로젝트는 고성능 컴퓨팅(HPC), GPU 기반 통신 라이브러리(MPI over InfiniBand 등), 머신러닝 트레이닝 시스템, 실시간 데이터 스트리밍 등 GPU-CPU 간의 고속 데이터 전송이 필요한 다양한 분야에 적합합니다. GPUDirect와 CUDA를 이미 사용하고 있는 환경이라면 GDRCopy는 추가 성능 최적화 수단으로 활용될 수 있습니다.

GDRCopy는 일반적인 cudaMemcpy() 함수보다 훨씬 더 낮은 복사 지연을 제공합니다. 기존의 cudaMemcpy()는 내부적으로 다양한 GPU-CPU 동기화와 캐시 관리가 필요해 오버헤드가 발생합니다. 반면, GDRCopy는 CPU에서 GPU 메모리를 직접 매핑하고 복사 작업을 수행하므로 이런 과정을 최소화할 수 있습니다.

또한, GPUDirect Storage(GDS)와는 다르게, GDRCopy는 디스크 I/O가 아닌 GPU 메모리와 CPU 메모리 간의 직접적인 복사를 목표로 하며, 특히 짧은 메시지 전송이나 핑퐁 테스트 같은 저지연 상황에 특화되어 있습니다.

기술 목적 사용 예시 복사 대상 OS
GDRCopy 저지연 CPU↔GPU 복사 ping-pong, MPI over GPU GPU ↔ CPU Linux
GPUDirect RDMA GPU↔장치 직접 전송 NIC ↔ GPU 통신 GPU ↔ NIC Linux
GPUDirect Storage 디스크 ↔ GPU 직접 로딩 NVMe, NVMe-oF GPU ↔ SSD Linux
GPUDirect for Video 영상 스트림 수신 캡처 카드 ↔ GPU GPU ↔ FrameGrabber Windows
GPUDirect P2P GPU 간 직접 복사 Multi-GPU 학습 GPU ↔ GPU Linux

NVIDIA의 GPUDirect 소개

NVIDIA의 GPUDirect®는 GPU 중심의 데이터 처리에서 데이터 이동 병목을 해소하기 위해 개발된 기술 집합입니다. GPU는 CPU보다 데이터 소비 속도가 빠르며, 이로 인해 IO 병목 현상이 자주 발생합니다. 이를 해결하기 위해 GPUDirect는 네트워크 어댑터나 저장장치가 GPU 메모리에 직접 읽기/쓰기할 수 있게 하여 불필요한 CPU 메모리 복사 과정을 제거하고 CPU 부하 감소지연 최소화를 실현합니다.

GPUDirect는 단일 기술이 아니라, Magnum IO 플랫폼 하위의 여러 기술군으로 구성되어 있으며, 주요 기술로는 GPUDirect Storage, GPUDirect RDMA, GPUDirect Peer-to-Peer, GPUDirect for Video가 있습니다. 각 기술들은 특정 시나리오에 맞춰 GPU의 데이터 처리 성능을 극대화합니다:

  • GPUDirect Storage: GPUDirect Storage는 스토리지에서 GPU 메모리로 직접 데이터를 전송할 수 있게 하는 기술입니다. 기존에는 NVMe 등의 저장장치에서 읽은 데이터를 먼저 CPU 메모리로 복사한 뒤 다시 GPU 메모리로 전달했지만, GPUDirect Storage는 이러한 중간 복사 과정을 제거하여 데이터 경로를 단축시킵니다.
    이 기술은 DMA(Direct Memory Access) 엔진을 활용하여, NIC(Network Interface Card)나 저장장치에서 직접 GPU 메모리로 데이터를 이동시킵니다. 그 결과, CPU 자원이 절약되고 지연시간이 대폭 줄어들며, GPU는 보다 빠르게 연산을 시작할 수 있습니다. 특히 대용량 이미지나 영상 처리, 머신러닝 데이터셋 처리 등에 매우 유용합니다.

  • GPUDirect RDMA: GPUDirect RDMA(Remote Direct Memory Access)는 PCIe 장치가 GPU 메모리에 직접 접근하여 데이터를 읽고 쓸 수 있도록 허용합니다. 이 기술은 멀티 노드 GPU 클러스터 간의 통신에서 특히 유용하며, GPU-to-GPU 간의 직접 데이터 전송이 가능해지므로 버퍼 복사와 시스템 메모리 사용을 제거할 수 있습니다.
    GPUDirect RDMA를 통해 GPU 간의 통신 지연을 줄이고 최대 10배 향상된 성능을 기대할 수 있습니다. 주로 Infiniband 환경에서 MPI 통신 최적화를 위해 활용되며, GDRCopy 같은 오픈소스 라이브러리도 이 기술 기반 위에서 구현됩니다.

  • GPUDirect Peer-to-Peer (P2P): GPUDirect Peer-to-Peer는 동일 시스템 내의 여러 GPU 간 직접 메모리 접근을 지원합니다. 예를 들어, 두 GPU 간에 데이터를 복사할 때 CPU를 거치지 않고 직접 메모리 로드/스토어를 수행할 수 있습니다. 이는 특히 NVLink와 같은 고속 인터커넥트가 있는 환경에서 더욱 효과적입니다.
    CUDA 드라이버에서 기본적으로 지원되며, 여러 GPU가 설치된 시스템에서 다중 GPU 학습이나 데이터 분산 처리에 매우 적합한 기술입니다.

  • GPUDirect for Video: 이 기술은 영상 프레임 기반 장치(프레임 그래버, HD-SDI 캡처 장비 등)에서 GPU 메모리로 직접 비디오 프레임을 전송할 수 있게 합니다. Windows 환경에서 지원되며, 실시간 비디오 스트리밍, 방송 송출 장비, 의료 영상 장비 등에 활용됩니다.

이러한 기술들은 단순히 GPU의 연산 성능을 높이는 것이 아니라, 데이터 전달의 병목을 줄임으로써 전체 시스템의 처리율을 향상시키는 데 초점을 맞춥니다. 특히 최신의 대용량 데이터 워크로드에서는 데이터 전송 자체가 성능 병목으로 작용하는 경우가 많기 때문에 GPUDirect는 필수적인 요소로 자리 잡고 있습니다.

GPUDirect와 관련한 더 자세한 내용은 NVIDIA의 GPUDirect 문서를 참고해주세요:

GDRCopy의 주요 기능

  • GPU 메모리 매핑 기반 복사: GDRCopy는 GPU 메모리를 사용자 공간 주소 공간에 매핑하여 CPU에서 일반 메모리처럼 접근할 수 있도록 합니다. 이 매핑은 cudaMalloc()으로 할당된 GPU 메모리에 한하며, 64KB 페이지 정렬이 요구됩니다. CPU에서 직접 복사할 수 있기 때문에 cudaMemcpy()를 호출하지 않고도 데이터 이동이 가능하며, 레이턴시 최소화에 특히 효과적입니다.

  • 제공되는 테스트 도구:

    • gdrcopy_sanity: 라이브러리와 드라이버의 유닛 테스트
    • gdrcopy_copybw: 특정 버퍼 크기의 읽기/쓰기 대역폭 측정
    • gdrcopy_copylat: 다양한 버퍼 크기에 대한 지연 측정
    • gdrcopy_apiperf: GDRCopy API 호출 지연 측정
    • gdrcopy_pplat: GPU-CPU 간 핑퐁 복사 왕복 지연 측정
  • NUMA 구조 영향: NUMA 아키텍처를 사용하는 서버 환경에서는 GPU가 연결된 CPU 소켓에 가까운 코어에서 복사 연산을 수행하는 경우 더 높은 성능을 기대할 수 있습니다. 다음과 같이 numactl 명령어를 통해 메모리/프로세스 affinity를 조정하여 최적의 CPU에서 복사 작업을 실행할 수 있습니다:

    numactl --cpunodebind=0 --membind=0 ./gdrcopy_copylat
    

GDRCopy 설치 및 빌드 방법

필수 요구사항

  • NVIDIA RTX 또는 Data Center GPU (Kepler 이상)
  • CUDA 6.0 이상, GPU Driver 418.40 이상
  • Linux (x86_64, ppc64le, arm64)
  • RHEL8/9, Ubuntu 20.04/22.04, SLE15, Leap 15.x
  • root 권한 필요
  • DKMS 또는 kmod를 통한 커널 모듈 설치

설치 방식

  • rpm 패키지 (RHEL, SLE): ./build-rpm-packages.sh 사용
  • deb 패키지 (Debian 기반): ./build-deb-packages.sh 사용
  • 소스에서 직접 빌드: make prefix=<경로> CUDA=<CUDA 경로> all install 실행 후 insmod.sh 사용

드라이버 소스 및 빌드 시 주의사항

  • NVIDIA 드라이버의 proprietary/opensource 여부에 따라 성능과 호환성이 다릅니다.
  • opensource 드라이버로 컴파일 시 일부 환경에서 로딩이 불가능할 수 있습니다.
  • Confidential Computing(CC) 환경에서는 제한 사항이 존재하며 Intel 플랫폼에서는 완전한 기능 지원이 어려울 수 있습니다.

제약 사항 및 알려진 이슈

  • cudaMalloc로 할당된 메모리만 지원하며, CUDA Managed Memory는 지원하지 않습니다.
  • gdr_map()을 사용할 때 GPU 페이지 정렬이 요구되며, 유저가 직접 주소 정렬을 보장해야 합니다.
  • 여러 번 pinning 할 경우 BAR1 공간이 중복 사용되어 낭비될 수 있습니다.
  • 특정 CUDA/드라이버 버전과 하드웨어 조합에서 성능 이슈가 발생할 수 있습니다.

라이선스

GDRCopy 프로젝트는 3-Clause BSD License로 공개 및 배포되고 있습니다.

:github: GDRCopy 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요

최소 2개 이상의 gpu에서 작동하겠죠?