[카테고리:] 미분류

  • NVIDIA SuperPOD

    대규모 AI와 HPC에서 자주 듣는 말이 있다. 여러 개의 GPU를 하나처럼 묶는다. 하지만 이 문장을 액면 그대로 받아들이면 곤란하다. 실제로는 분산된 물리 메모리와 다중 디바이스를, 단일 가상 주소와 일관된 실행 모델로 다루게 해주는 계층형 기술 스택이 맞다. 이 글은 SuperPOD급 인프라에서 그 “하나처럼 보이게” 만드는 핵심 메커니즘—메모리 모델, 스케줄링, 통신, 운영—을 기술적으로 정리한다.


    1) 스케일-업 vs. 스케일-아웃: 같은 “확장”이라도 다른 물리

    • 스케일-업(Scale-Up): 한 노드 또는 한 랙 안에서 NVLink/NVSwitch로 GPU들을 조밀하게 묶는다. 여기서는 **로드/스토어 기반의 직접 접근(P2P)**과 **단일 가상 주소 공간(UVA)**이 작동해 “거의 하나의 장치처럼” 느껴진다.
    • 스케일-아웃(Scale-Out): 랙/노드를 넘어 클러스터 전체로 확장할 때는 InfiniBand(RDMA) 또는 이더넷(RoCE) 위에서 메시지 패싱·집단통신을 쓴다. 프로그래밍 모델은 NCCL·MPI/UCX가 표준이다.

    요약하면, NVLink 도메인메모리를 직접 읽고 쓰는 세계, InfiniBand 도메인메시지를 주고받는 세계다. 같은 “확장”이지만 언어가 다르다.


    2) “단일 HBM”은 없다: 단일 가상 주소 공간이 핵심

    여러 GPU를 “단일 GPU”처럼 말할 때 가장 오해를 부르는 지점이 메모리다.

    • 물리 메모리(각 GPU의 HBM)는 분산되어 있다. 이것을 물리적으로 합쳐 하나의 거대 HBM을 만드는 일은 없다.
    • 대신 **Unified Virtual Addressing(UVA)**가 CPU·모든 GPU를 아우르는 64비트 가상 주소 공간을 제공한다. 포인터 하나로 다른 GPU의 메모리에 합법적으로 접근할 수 있게 “보여주는” 것이다.
    • **P2P(피어 투 피어)**가 열리면 원격 GPU 메모리직접 LD/ST, 원격 원자연산까지 가능하다. 다만 **완전한 캐시 일관성(coherence)**을 제공하지 않기 때문에, 원격 쓰기 뒤에는 fence/동기화가 필요하다.
    • **Unified Memory(UM)**는 cudaMallocManaged로 할당한 메모리를 페이지 단위GPU↔GPU/CPU 사이에서 이동·복제하거나, 원격 접근을 열어준다. cudaMemAdvise로 선호 위치·읽기 전용·공유 접근 같은 배치 정책 힌트를 주면 런타임이 이행한다.

    정신모델: 분산 물리 메모리 + 단일 가상 주소 + 정책 기반의 이동/복제/원격 접근.


    3) “중앙의 운영체제”가 아니라 계층형 스케줄러/관리자의 협연

    SuperPOD에는 무대 감독이 한 명 더 있는 게 아니라, 각 층의 스케줄러·관리자가 역할을 나눠 맡는다.

    1. GPU 내부(온-디바이스)
      • 워프/스레드블록 스케줄러, 복수의 카피 엔진(DMA), L2/메모리, 필요 시 프리엠션까지 마이크로 스케줄러가 작동한다.
      • 개발자는 CUDA 스트림/우선순위/그래프로 힌트를 주고, 드라이버가 하드웨어 큐에 밀어 넣는다.
    2. 노드 레벨(리눅스 커널 + NVIDIA 드라이버/런타임)
      • 리눅스가 프로세스/스레드를 스케줄.
      • NVIDIA 드라이버/런타임이 GPU 컨텍스트, 가상 메모리 매핑, DMA 엔진 같은 GPU 자원을 관리한다. **UVA/UM(HMM)**은 페이지 폴트 기반으로 이동/매핑을 수행한다. 중앙 “메인 GPU”가 있는 게 아니라 각 GPU의 MMU·페이지 테이블을 드라이버가 조율한다.
    3. 한 GPU를 여러 워크로드가 공유할 때
      • MPS(Multi-Process Service): 다수 프로세스를 공유 풀로 묶어 컨텍스트 스와핑 오버헤드를 줄이고 동시성을 높이는 소프트 공유.
      • MIG(Multi-Instance GPU): SM/L2/HBM을 하드하게 분할해 **격리(QoS)**를 보장한다(아키텍처별 분할 수 상이).
    4. 클러스터 레벨
      • NCCL·MPI/UCX가 메시지 패싱/집단통신을 수행.
      • Slurm/Kubernetes가 잡 스케줄링·큐잉·자원 할당을 담당.
      • **NVIDIA Base Command(Manager)**가 이미지 배포, 사용자 워크스페이스, 소프트웨어 스택 업데이트, 전체 오케스트레이션을 일원화한다.
      • DCGM은 텔레메트리, 전력/클럭 정책, 건강도(health) 모니터링 등 거버넌스를 제공한다.

    결론: 단일 OS가 모든 걸 지휘하는 대신, **디바이스 → 드라이버/런타임 → 노드 공유(MPS/MIG) → 클러스터 스케줄러 → 관제(DCGM)**로 이어지는 다층 교통정리가 SuperPOD의 실체다.


    4) 통신 스택: NVLink의 로드/스토어 vs. InfiniBand의 메시지

    • NVLink/NVSwitch: 동일 도메인 내에서 원격 메모리 LD/ST원격 원자연산이 가능해 커널이 다른 GPU의 텐서를 직접 참조한다. 토폴로지(풀-커넥트/패브릭)는 세대가 올라갈수록 대역과 지연 특성이 개선된다.
    • NCCL: NVLink/IB 토폴로지를 인지하고 all-reduce/bcast/gather 등을 최적 링·트리·패턴으로 자동 구성한다.
    • GPUDirect RDMA: NIC↔GPU 메모리를 직접 잇는다. CPU bounce buffer를 제거해 지연과 CPU 부하를 낮춘다.
    • NVSHMEM: GPU에서 PGAS(Partitioned Global Address Space) 프로그래밍을 가능케 하는 put/get/collective 프리미티브로, 스케일-업에서의 ‘하나처럼’ 체감을 강화한다.

    5) 스토리지·I/O: 데이터 공장에는 GDS가 필요하다

    SuperPOD의 병목은 종종 계산이 아니라 데이터 공급에서 생긴다.

    • **Magnum IO GPUDirect Storage(GDS)**는 NVMe/병렬 파일시스템에서 GPU 메모리로 직결 I/O 경로를 연다.
    • 대형 학습/대규모 추론에서는 파일 시스템 병렬성(Striping), 프리페치, 파이프라이닝, 그리고 **데이터 레이아웃(샤딩)**이 성패를 가른다.
    • 체크포인트/리주메 설계, 샘플링 일관성(Shuffle/Determinism), 메타데이터 캐시 전략은 스케일이 클수록 중요해진다.

    6) 운영 패턴별 설계 관점

    (A) 초대형 모델 학습

    • 노드 내부: NVLink 도메인에서 텐서/파이프라인 병렬을 구성, 커뮤니케이션은 NCCL로.
    • 노드 간: 데이터 병렬+체크포인트 전략, 오케스트레이션은 Slurm/K8s + Base Command.
    • 메모리: 파이프라인 스테이지 경계에 활성화 체크포인트(gradient checkpointing), optimizer state sharding(예: ZeRO) 고려.
    • I/O: GDS + 병렬 FS, 샤딩/프리페치, 학습 로그·모니터링은 DCGM/프로파일러로 연동.

    (B) 다수 동시 추론/에이전트

    • MIG고립된 슬라이스 제공 → QoS/보안·멀티테넌시 용이.
    • MPS소프트 공유로 처리량을 끌어올리는 용도. 소규모 잡 폭주 시에는 MIG+MPS 혼합도 가능.
    • K8s에서 디바이스 플러그인으로 MIG 바인딩, HPA와 큐잉 레이어로 오토스케일.

    7) 성능을 좌우하는 실전 체크리스트

    1. 데이터 지역성: 로컬 HBM ≫ NVLink 원격 ≫ PCIe/호스트 순. 핫 데이터는 로컬에, 원격 접근은 스트리밍/일괄 중심으로.
    2. UM 정책: cudaMemAdviseSetPreferredLocation, SetAccessedBy, SetReadMostly이동/복제를 힌트. 무심코 쓰면 페이지 스래싱이 난다.
    3. 동기화: 원격 쓰기 후 메모리 장벽(__threadfence_system() 등) 또는 NVSHMEM/NCCL의 암묵 동기로 가시성 확보.
    4. 집단통신 토폴로지: NCCL 자동 최적화를 믿되, 랙·노드 상호연결 구조를 이해하고 장애/성능 편차 시 재구성.
    5. I/O 파이프라인: GDS 활성화 여부, 파일시스템 스트라이핑, 워커·프리페처 수, 배치 크기와의 균형.
    6. 전력/냉각/클럭 정책: DCGM으로 전력 캡/클럭을 정책화해 스루풋/안정성 균형점 찾기.
    7. 장애 도메인 분리: 노드·랙·스위치 단위로 페일오버/리트라이를 설계. 체크포인트 주기와 MTBF의 타협이 필수.
    8. 프로파일링: 커널 레벨(CUDA 프로파일러) + 시스템 레벨(DCGM·NCCL 디버그·IB 카운터)을 동시에 본다. 한쪽만 보면 병목을 놓친다.

    8) 흔한 오해와 바로잡기

    • “SuperPOD = 하나의 거대 메모리”
      → 아니다. 가상 주소의 통일이지 물리 HBM 통합이 아니다. 정책 기반 이동/복제/원격 접근으로 “거의” 하나처럼 다룬다.
    • “중앙 메인 GPU가 전체 메모리 맵을 관리”
      → 아니다. 각 GPU의 MMU·페이지 테이블드라이버/런타임이 조율한다.
    • “클러스터도 로드/스토어만 쓰면 되지 않나”
      → 노드 밖은 메시지 패싱 세계다. NCCL/MPI/UCX + GPUDirect RDMA가 정답이다.
    • “MPS면 QoS 보장”
      MPS는 소프트 공유다. QoS·격리가 필요하면 MIG로 하드 분할해야 한다.

    9) 최소 예시(개념 스케치)

    // 다중 GPU P2P 열기 (NVLink 도메인 전제)
    int n = 0; cudaGetDeviceCount(&n);
    for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (i != j) {
      int can = 0; cudaDeviceCanAccessPeer(&can, i, j);
      if (can) { cudaSetDevice(i); cudaDeviceEnablePeerAccess(j, 0); }
    }
    
    // Unified Memory 할당 + 배치 힌트
    size_t N = 1ull << 28; // 예: float 2^28개
    float* p = nullptr;
    cudaMallocManaged(&p, N * sizeof(float));
    cudaMemAdvise(p, N*sizeof(float), cudaMemAdviseSetPreferredLocation, /*gpu=*/0);
    cudaMemAdvise(p, N*sizeof(float), cudaMemAdviseSetAccessedBy,       /*gpu=*/1); // GPU1도 직접 접근
    
    // 커널에서는 p를 로컬/원격 혼합 접근 가능
    // 원격 쓰기 후엔 필요 시 가시성 보장을 위한 fence/동기화 수행
    

    10) SuperPOD 관점의 전체 스택 정리

    • 연산: DGX/HGX/랙-스케일(NVL 계열 포함)
    • 스케일-업 연결: NVLink/NVSwitch
    • 스케일-아웃 연결: InfiniBand(RDMA)/RoCE
    • 메모리 모델: UVA + P2P + Unified Memory(페이지 이동/복제/원격 접근)
    • 프로그래밍: CUDA 스트림/그래프, NCCL, NVSHMEM, MPI/UCX
    • I/O: GPUDirect Storage + 병렬 FS
    • 공유/격리: MPS(공유 동시성), MIG(하드 격리·QoS)
    • 스케줄링/오케스트레이션: Slurm/Kubernetes + Base Command
    • 가시성/정책: DCGM(텔레메트리/전력/클럭)
    • 신뢰성: 체크포인트/리커버리, 장애 도메인 분리, 재시도·우회 경로

    맺음

    SuperPOD은 스케일-업의 로드/스토어 세계스케일-아웃의 메시지 패싱 세계단일 워크플로로 연결한다. 하부에서는 분산 물리 자원이 그대로 존재하지만, 상부로 갈수록 가상화·정책·스케줄링이 결합돼 사용자에게 “하나처럼” 느껴지는 경험을 제공한다. 이때 성능과 안정성은 데이터 지역성, 통신 토폴로지, I/O 파이프라인, 공유/격리 정책, 관제 텔레메트리를 얼마나 정교하게 맞추느냐에 의해 갈린다.