AWS Sagemaker Hyperpod에서의 고성능 GPU 메모리 전송
3200 Gbps를 향한 여정
현대적인 딥러닝 인프라에서는 머신 간 GPU 전반에 걸쳐 대량의 데이터를 전송해야 하는 경우가 많습니다. Perplexity에서는 머신 간 비연속적(non-contiguous) GPU 메모리 영역을 가능한 최대 속도로 효율적으로 전송해야 하는 독특한 기술적 과제에 직면했습니다. 대상 플랫폼인 AWS p5 인스턴스는 32개의 네트워크 카드를 통해 3200 Gbps라는 인상적인 네트워크 대역폭을 제공합니다. 이 글에서는 이론상 대역폭의 97.1%를 달성하는 맞춤형 고성능 네트워킹 솔루션을 구축한 여정을 공유합니다.
기술적 과제
당사의 유즈 케이스는 다음과 같은 몇 가지 주요 기술적 요구 사항을 제시했습니다:
- 원격 GPU 간의 비연속적 메모리 청크(chunk)에 대한 고대역폭 전송
- 진행 중인 작업을 중단하지 않고 Kubernetes 배포에서 노드를 동적으로 추가하거나 제거할 수 있는 기능
- 피어 투 피어(P2P) 통신 패턴 지원
NVIDIA의 NCCL 라이브러리는 분산 딥러닝의 사실상 표준이지만, 당사의 유즈 케이스에는 적합하지 않았습니다:
- NCCL은 집합 통신에 뛰어나지만 정적 "월드(world)" 설정을 요구하므로, 참여 노드를 조정할 때 전체 클러스터를 재시작해야 합니다.
- NCCL의 동기식 통신 모델은 비동기 작업 부하에 복잡성을 더합니다.
- 최적화를 위해 메모리 전송 패턴을 직접 제어하고자 했습니다.
- 자체 솔루션을 구축함으로써 귀중한 학습 기회를 얻었습니다.
현대적 고성능 네트워크
당사의 솔루션을 이해하기 위해 먼저 현대적인 고성능 네트워크가 기존 네트워킹과 어떻게 다른지 살펴보겠습니다.
우리가 일상에서 사용하는 대부분의 네트워크는 TCP/IP 프로토콜에 의존하며, 애플리케이션은 소켓을 사용하여 운영 체제 커널을 통해 네트워크 카드와 통신합니다. 그러나 고성능 네트워크는 RDMA(원격 직접 메모리 액세스)를 사용합니다. 이는 CPU를 거치지 않고 머신 간 직접적인 메모리 액세스를 가능하게 하는 완전히 다른 하드웨어 및 소프트웨어 스택입니다.
AWS는 Amazon의 SRD(확장 가능한 신뢰성 데이터그램)이라는 맞춤형 프로토콜을 구현하는 맞춤형 네트워크 인터페이스인 EFA(Elastic Fabric Adapter)를 제공합니다. 데이터가 사용자 스페이스, 커널 스페이스, 네트워크 버퍼 사이에서 여러 번 복사되어야 하는 기존 TCP/IP 네트워킹과 달리, RDMA를 사용하는 EFA는 GPU 메모리와 네트워크 카드 간의 직접적인 데이터 전송을 허용하여 CPU를 완전히 우회합니다.
고성능 네트워크 설계의 철학
고성능 네트워킹 시스템을 구축하려면 몇 가지 근본적인 가정을 재고해야 합니다:
- 버퍼 소유권: 커널이 네트워크 버퍼를 관리하고 사용자 스페이스와 커널 스페이스 간의 복사가 필요한 기존 소켓과 달리, RDMA는 애플리케이션이 직접 버퍼를 관리해야 합니다. 애플리케이션이 네트워크 작업을 시작하면 작업이 완료될 때까지 네트워크 카드에 버퍼 소유권을 이전하여 데이터 복사 필요성을 제거합니다.
- 메모리 등록: 애플리케이션은 운영 체제 커널에 메모리 영역을 등록해야 합니다. 커널은 CPU, GPU 및 네트워크 카드가 모두 동일한 가상 주소를 이해할 수 있도록 가상 주소 매핑을 설정합니다. 이 등록은 후속 제로 카피 데이터 전송을 가능하게 하는 일회성 작업입니다.
- 제어 평면 대 데이터 평면: 고성능 네트워크는 작업을 두 가지 범주로 분류합니다:
- 제어 평면 작업(연결 설정 및 메모리 등록 등)은 보안 보장을 위해 커널을 거칩니다.
- 데이터 평면 작업(실제 데이터 전송)은 최대 성능을 위해 커널을 우회합니다.
- 전송 전 수신: 커널 관리 버퍼가 없는 경우 애플리케이션은 들어오는 데이터를 어디에 배치할지 지정하여 수신 작업을 미리 게시(pre-post)해야 합니다. 이는 애플리케이션이 언제든지 데이터를 수신할 수 있는 소켓 모델과는 근본적으로 다릅니다.
- 폴링 기반 완료:
epoll과 같은 메커니즘을 통한 커널 알림을 기다리는 대신 애플리케이션이 하드웨어 완료 큐를 직접 폴링합니다. 이는 시스템 호출 오버헤드를 제거하고 완료된 작업에 즉각적으로 대응할 수 있게 합니다. - 하드웨어 토폴로지 인식: 최대 성능을 달성하려면 하드웨어 토폴로지를 이해하고 최적화하는 것이 중요합니다.
하드웨어 토폴로지 이해
AWS p5 인스턴스는 정교한 내부 아키텍처를 갖추고 있습니다. 아래와 같이 각 인스턴스에는 두 개의 NUMA 노드를 형성하는 두 개의 CPU 소켓이 포함되어 있으며, 각 NUMA 노드는 4개의 PCIe 스위치에 연결됩니다:
각 PCIe 스위치 아래에는 다음이 있습니다:
- 4개의 100 Gbps EFA 네트워크 카드
- 1개의 NVIDIA H100 GPU
- 1개의 NVMe SSD
TCP/IP 및 RDMA 전송의 데이터 경로는 접근 방식의 근본적인 차이를 보여줍니다:
TCP/IP(왼쪽)의 경우 데이터가 여러 번 복사되어야 합니다:
- GPU 메모리에서 사용자 스페이스의 애플리케이션 버퍼로
- 사용자 스페이스 버퍼에서 커널 버퍼로
- 커널 버퍼에서 네트워크 카드로
- 수신 측에서도 역과정이 발생합니다.
각 복사 작업은 CPU 주기와 메모리 대역폭을 소비합니다. 애플리케이션은 또한 각 네트워크 작업에 대해 사용자 스페이스와 커널 스페이스 간의 컨텍스트 스위칭을 수행해야 합니다.
대조적으로 RDMA(오른쪽)는 진정한 제로 카피(zero-copy) 데이터 전송을 제공합니다:
- 네트워크 카드가 GPU 메모리를 직접 읽습니다.
- 데이터가 원격 네트워크 카드로 직접 이동합니다.
- 원격 네트워크 카드가 대상 GPU 메모리에 직접 씁니다.
- 애플리케이션은 전송이 완료된 시점을 알기 위해 사용자 스페이스의 완료 큐(CQ)를 확인하기만 하면 됩니다.
RDMA 및 적절한 하드웨어 페어링을 사용하면 두 GPU 간의 데이터 전송 시 로컬 PCIe 스위치와 네트워크만 통과하면 됩니다:
반면, TCP/IP 전송은 데이터를 메인 메모리를 통해 여러 번 복사해야 하므로 상당한 PCIe 버스 혼잡을 유발합니다:
libfabric을 활용한 구축
우리는 패브릭 서비스를 위한 일반 인터페이스를 제공하는 프레임워크인 libfabric을 사용했습니다. 당사의 구현에서는 두 가지 유형의 RDMA 작업을 사용합니다:
- 메모리 영역에 대한 메타데이터(예: 오프셋 및 크기)를 전달하는 제어 메시지를 위한 양방향 RDMA(SEND/RECV).
- 실제 데이터 전송을 위한 단방향 RDMA WRITE(각 WRITE 작업은 하나의 연속적인 메모리 청크를 처리함).
최고 성능을 향한 여정
개발은 다음과 같은 몇 가지 단계를 거쳐 진행되었습니다:
- SEND/RECV를 사용한 기본 단방향 메시지 전송 구현
- 양방향 통신으로 확장
- 직접적인 GPU-GPU 전송을 위한 GPUDirect RDMA WRITE 추가
- 다중 동시 전송을 처리하도록 확장
- 견고성을 위해 작업 큐잉 도입
- 단일 네트워크 카드에서 97.4%의 대역폭 활용률 달성
32개의 네트워크 카드로 확장할 때 몇 가지 중요한 최적화를 구현했습니다:
- 작업 큐잉: 네트워크 카드에 직접 작업을 제출하는 대신 애플리케이션 수준의 큐를 유지합니다. 이는 네트워크 혼잡에 대한 견고성을 제공하고 프로그래밍 모델을 단순화합니다.
- 네트워크 웜업: 미리 연결을 설정하여 시작 성능을 개선했습니다.
- 멀티 스레딩: 각 GPU의 네트워크 작업을 위한 전용 스레드.
- CPU 코어 고정: NUMA 영향과 캐시 미스를 방지하기 위해 스레드를 특정 CPU 코어에 바인딩합니다.
- 상태 샤딩: 스레드 간 경쟁을 줄입니다.
- 작업 일괄 처리: 여러 작업을 함께 제출합니다.
- 지연 작업 게시: 작업은 먼저 애플리케이션에서 큐에 대기합니다. 완료 큐를 폴링한 후 보류 중인 작업을 네트워크 카드에 제출하여 네트워크 리소스를 효율적으로 사용합니다.
- NUMA 인식 리소스 할당: 메모리 액세스 지연 시간을 최소화하기 위해 올바른 NUMA 노드에 완료 큐와 같은 libfabric 리소스를 할당합니다.
이러한 최적화를 통해 최종적으로 이론상 최대 대역폭의 97.1%인 3,108 Gbps의 성능을 달성했습니다.
아래 비디오는 당사의 명령줄 프로그램이 작동하는 모습을 보여줍니다. 이 프로그램은 비연속적인 GPU 메모리 청크를 원격 노드로 전송하여 3108.283 Gbps의 전송 속도를 달성했으며, 네트워크 인프라의 이론상 대역폭 활용에 근접함을 증명합니다:
결론
고성능 네트워킹 시스템을 구축하려면 하드웨어 아키텍처와 시스템 설계 원칙을 모두 이해해야 합니다. NCCL과 같은 라이브러리는 일반적인 패턴에 탁월한 솔루션을 제공하지만, 때로는 특정 요구 사항을 위해 맞춤형 솔루션이 필요합니다.
당사의 여정은 시스템 아키텍처, 하드웨어 토폴로지 및 다양한 최적화 기술에 세심한 주의를 기울이면 이론상 최대 네트워크 성능 달성이 가능함을 보여줍니다. 핵심은 개별 구성 요소를 이해하는 것뿐만 아니라, 그것들이 상호 작용하여 어떻게 완전한 시스템을 형성하는지 이해하는 것입니다.
구현 세부 정보 및 코드 예제를 포함한 이 여정에 대한 전체 기술 심층 분석은 당사의 오픈 소스 저장소에서 확인할 수 있습니다.
인용
@online{perplexity2025HighPerformanceGpuMemoryTransferOnAwsSagemakerHyperpod,
author = {{Perplexity} and Lequn Chen and Phi Hoang},
title = {{High-performance GPU memory transfer on AWS Sagemaker Hyperpod}},
date = {2025-02-10},
url = {https://www.perplexity.ai/hub/blog/high-performance-gpu-memory-transfer-on-aws-sagemaker-hyperpod}
}