콘텐츠로 이동

GPU 서버 기초 정리

CPU 대비 GPU 구조 차이부터 HBM 세대, PCIe와 SXM 폼팩터, HGX와 DGX 서버 형태까지 정리했다. CUDA 스택과 nvidia-smi 사용률 지표도 다룬다.

GPU 서버란

GPU 서버란 대규모 병렬 산술을 처리하는 데이터센터 GPU를 한 대에 여러 장 얹어 학습·추론 같은 가속 워크로드를 돌리는 서버

모델 크기가 단일 GPU 메모리를 넘어서면서 여러 GPU를 고속으로 묶는 서버 단위 설계가 필요해짐

  • CPU만으로는 행렬 연산 처리량이 부족 → 병렬 코어가 수천 개인 GPU로 오프로드
  • 모델·배치가 커지면 한 장의 VRAM으로 부족 → 여러 GPU에 나눠 싣고 GPU 간 통신으로 합침
  • GPU 간 통신이 병목 → PCIe보다 빠른 전용 인터커넥트(NVLink)로 연결
  • 전력·발열이 일반 서버보다 훨씬 큼 → 냉각·전원 설계가 서버 형태를 가름

CPU vs GPU 구조

CPU는 소수의 큰 코어로 순차 로직을 빠르게 처리하고, GPU는 작은 코어를 수천 개 두어 같은 연산을 대량으로 병렬 처리하는 구조

비교 항목 CPU GPU
코어 성격 소수의 대형 코어, 고클럭·복잡한 제어부 다수의 소형 연산 코어
코어 수 규모 수개~수십개 수천개(A100은 CUDA 코어 6,912개)
실행 모델 코어별 독립 스레드 SIMT, warp 단위 동일 명령 실행
최적 작업 분기 많은 순차 로직, 낮은 지연 대규모 병렬 산술(행렬 연산)
면적 배분 캐시·제어부에 크게 투자 연산 유닛에 집중, 캐시·제어부 작음
주 메모리 DDR, 대용량·상대적 저대역폭 HBM, 고대역폭

SM과 SIMT

  • GPU의 연산 코어는 SM(Streaming Multiprocessor)이라는 묶음으로 구성됨 → A100은 108개 SM, SM당 FP32 CUDA 코어 64개
  • H100 SXM은 132개 SM, SM당 128개 → 풀 다이 144개 SM 중 수율을 위해 일부만 활성화하는 방식
  • SIMT(Single Instruction, Multiple Threads)는 32개 스레드를 묶은 warp가 하나의 명령을 함께 실행하는 모델
  • warp 안에서 스레드 분기(if/else)가 갈리면 각 경로를 순차 실행 → 분기 발산(divergence)이 병렬 효율을 떨어뜨림
  • 그래서 GPU는 조건 분기 많은 로직보다 같은 연산을 대량 반복하는 작업에 유리

VRAM과 HBM

VRAM은 GPU 패키지에 붙은 전용 메모리를 가리키고, 데이터센터 GPU는 그 구현으로 HBM(High Bandwidth Memory)을 씀

  • HBM은 메모리 다이를 수직 적층해 실리콘 인터포저로 GPU 옆에 근접 배치 → 배선이 짧고 넓어 대역폭이 큼
  • 대역폭이 학습 속도를 좌우 → 행렬 연산은 연산량보다 메모리에서 데이터를 얼마나 빨리 공급하느냐에 자주 묶임
  • 세대가 오를수록 스택 용량·속도가 오르며, 같은 GPU도 폼팩터에 따라 HBM 세대가 갈림
세대 대표 적용 GPU 비고
HBM2 A100 40GB 1,555GB/s
HBM2e A100 80GB, H100 PCIe HBM2 개량, 스택 용량·속도↑
HBM3 H100 SXM 3.35TB/s로 대역폭 대폭 상승
HBM3e B200, H200 스택당 용량·속도 추가 상승

PCIe 카드 vs SXM 모듈

같은 세대 GPU라도 표준 슬롯에 꽂는 PCIe 카드와 전용 소켓에 직결하는 SXM 모듈은 전력·대역폭·냉각·GPU 간 연결이 크게 다름

항목 PCIe 카드 SXM 모듈
장착 표준 PCIe 슬롯 전용 소켓(베이스보드 직결)
최대 전력(H100 기준) 300~350W 700W
GPU 간 연결 PCIe 경유, 선택적 NVLink 브리지(쌍 단위) NVLink + NVSwitch 전이중 메시
NVLink 대역폭(H100) 브리지 600GB/s, 2장 연결에 한정 900GB/s 풀 연결
메모리·대역폭(H100) 80GB HBM2e, 약 2TB/s 80GB HBM3, 3.35TB/s
냉각 카드 단위 공랭 베이스보드 통합 냉각(고밀도 공랭·수랭)
확장 방식 서버당 소수, 혼합·교체 유연 8장 단위 베이스보드 고정 구성
  • PCIe 카드는 일반 서버에 몇 장 얹는 유연한 구성 → 도입이 쉽고 GPU 종류를 섞기 좋음
  • SXM은 높은 전력 한도와 NVSwitch 전이중 연결이 필요한 대규모 학습용 → 8장이 한 몸처럼 통신
  • PCIe에서 NVLink 브리지는 인접 2장만 이어줌 → 8장 전체를 all-to-all로 묶는 건 SXM+NVSwitch 구성에서만 가능

서버 형태

GPU 서버는 표준 서버에 PCIe 카드를 얹는 형태부터 SXM 베이스보드를 통합한 완제품까지 나뉘며, GPU 간 연결 방식과 커스터마이즈 자유도가 다름

형태 구성 GPU 연결 특징
일반 PCIe 서버 표준 서버에 PCIe GPU 장착 PCIe, 선택적 NVLink 브리지 소수 GPU, 구성 유연, 도입 쉬움
HGX 베이스보드 8-GPU SXM 베이스보드를 OEM 서버에 탑재 NVLink + NVSwitch 전이중 OEM이 CPU·스토리지·네트워크 커스터마이즈
DGX 완제품 NVIDIA가 설계·통합한 완제품 HGX 베이스보드 + NVSwitch 검증된 단일 구성, 소프트웨어·지원 번들
  • HGX는 NVIDIA가 제공하는 8-GPU SXM 베이스보드 → OEM이 이 위에 서버를 설계해 판매
  • DGX는 그 베이스보드를 NVIDIA가 직접 완제품 서버로 통합한 것 → 구성 선택폭 대신 검증·지원을 취함
  • HGX H100 8-GPU 베이스보드는 총 640GB(80GB×8) GPU 메모리, DGX H100도 동일
  • DGX B200은 8장 합쳐 1,440GB(180GB×8) → 세대가 오르며 장당·서버당 메모리가 늘어남

소프트웨어 스택

GPU 워크로드는 커널 드라이버부터 프레임워크까지 계층으로 쌓이며, 컨테이너에서는 드라이버 주입과 스케줄러 연동이 별도 경로로 붙음

graph TD
    APP["프레임워크<br>PyTorch·TensorFlow"] --> LIB["가속 라이브러리<br>cuDNN·cuBLAS·NCCL"]
    LIB --> CUDA["CUDA Toolkit<br>Runtime·Driver API"]
    CUDA --> DRV["커널 드라이버<br>nvidia.ko"]
    DRV --> HW["GPU 하드웨어<br>SM·HBM"]
    CT["NVIDIA Container Toolkit<br>드라이버·장치 주입"] -.-> DRV
    DP["device plugin<br>nvidia.com/gpu 광고"] -.-> CT
계층 구성 요소 역할
커널 드라이버 NVIDIA 드라이버(nvidia.ko) GPU 장치 노출(/dev/nvidia*), 커널·유저 통신
CUDA Toolkit nvcc, CUDA Runtime·Driver API 커널 컴파일·실행, GPU 프로그래밍 인터페이스
가속 라이브러리 cuDNN, cuBLAS, NCCL, TensorRT 딥러닝 연산·선형대수, 다중 GPU 통신, 추론 최적화
프레임워크 PyTorch, TensorFlow 모델 정의·학습, 하위 라이브러리 호출

컨테이너에서 GPU를 쓰려면 별도 두 조각이 붙음

구성 요소 역할
NVIDIA Container Toolkit 컨테이너에 호스트 드라이버·장치를 주입, 이미지엔 CUDA 런타임만 담음
NVIDIA device plugin 노드의 GPU를 nvidia.com/gpu 리소스로 광고해 파드에 할당
  • 드라이버는 호스트에, CUDA 런타임은 컨테이너 이미지에 위치 → 둘의 버전 호환을 맞춰야 함
  • 쿠버네티스는 GPU를 기본 인식하지 못함 → device plugin이 리소스로 등록해야 스케줄러가 배정
  • 후속 표준으로 DRA(Dynamic Resource Allocation)가 v1.34에서 GA → NVIDIA도 GPU Operator에 DRA 드라이버를 제공하나 아직은 device plugin이 기본
  • GPU Operator는 드라이버·Container Toolkit·device plugin·모니터링을 묶어 설치하는 운영 도구

데이터센터 GPU 세대

세대가 오를수록 SM 수·메모리 용량·대역폭·NVLink 대역폭·전력이 함께 오름

항목 A100 H100 B200
아키텍처 Ampere Hopper Blackwell
SM 수 108 132(SXM) 듀얼 다이 구성
메모리(SXM) 80GB HBM2e 80GB HBM3 180GB HBM3e
메모리 대역폭 약 2TB/s(2,039GB/s) 3.35TB/s 약 8TB/s
NVLink 세대·대역폭 3세대, 600GB/s 4세대, 900GB/s 5세대, 1.8TB/s
최대 TDP(SXM) 400W 700W 1000W
  • A100 40GB SXM은 HBM2에 1,555GB/s → 같은 A100이라도 80GB(HBM2e)는 2,039GB/s로 다름
  • H100 PCIe는 80GB HBM2e에 약 2TB/s → 같은 H100이라도 SXM(HBM3, 3.35TB/s)과 대역폭 차이가 큼
  • B200은 두 다이를 NV-HBI로 묶어 단일 GPU로 동작하는 듀얼 다이 → 장당 메모리·대역폭·전력이 이전 세대를 크게 넘어섬
  • 세대 비교의 핵심은 연산 수치보다 메모리 용량·대역폭·GPU 간 대역폭 → 큰 모델일수록 이쪽이 병목

nvidia-smi 주요 필드

nvidia-smi는 드라이버가 노출하는 GPU 상태를 요약해 보여주는 CLI로, 필드마다 측정 대상이 달라 해석에 주의가 필요함

필드 의미
GPU-Util(utilization.gpu) 최근 샘플 구간에서 커널이 하나 이상 실행된 시간 비율
Memory-Usage(memory.used/total) 할당된 VRAM 용량과 총량(MiB)
utilization.memory 메모리 컨트롤러가 읽기·쓰기로 바빴던 시간 비율(대역폭 수치 아님)
Pwr:Usage/Cap 현재 소비 전력 / 전력 한도(W)
Temp GPU 코어 온도
Compute M. 컴퓨트 모드(Default·Exclusive Process·Prohibited)
MIG M. MIG(Multi-Instance GPU) 분할 활성 여부
Processes GPU를 점유한 프로세스와 컨텍스트별 VRAM

utilization.gpu의 함정

GPU-Util 100%는 "커널이 쉬지 않고 돌았다"는 뜻이지 연산 유닛이 꽉 찼다는 뜻이 아님

  • NVML 정의 자체가 "샘플 구간 중 커널이 실행된 시간 비율" → 시간축 지표이지 용량축 지표가 아님
  • SM 하나만 쓰는 커널도 그 시간 동안 GPU-Util 100%로 표시 → 나머지 SM이 전부 놀아도 수치는 같음
  • 즉 utilization은 "언제 바빴나", saturation은 "얼마나 채웠나" → nvidia-smi는 앞쪽만 보여줌
  • 학습이 느린데 GPU-Util만 높으면 데이터 로딩·소형 배치·커널 실행 오버헤드로 SM이 노는 경우가 흔함
  • 실제 연산 포화도는 DCGM(Data Center GPU Manager)의 SM occupancy·텐서 코어 활성률·메모리 대역폭 사용률로 확인
  • 세밀한 병목은 Nsight 계열 프로파일러로 커널별 점유를 봐야 함 → nvidia-smi 한 줄로 판단하지 말 것

결론

  • CPU는 소수 대형 코어, GPU는 SM에 묶인 수천 개 소형 코어로 warp 단위 SIMT 병렬 처리 → 작업 성격이 다름
  • 같은 세대라도 PCIe 카드와 SXM 모듈은 전력·대역폭·NVLink·냉각이 갈리고, 서버는 PCIe 서버·HGX·DGX로 나뉨
  • GPU-Util은 "바쁜 시간 비율"일 뿐 연산 포화도가 아님 → 실제 활용도는 DCGM·프로파일러로 확인할 것