[MLOps] GPU 모니터링 지표와 SM 활동률
GPU 사용률과 SM 활동률의 차이를 살펴보고, 운영 환경에서 수집할 지표의 의미와 선택 기준을 정리합니다.
GPU 사용률만으로 부족한 이유
GPU 사용률이 100%여도 처리량은 기대보다 낮을 수 있습니다.
특히 vLLM으로 sLLM을 배포하는 경우 99~100% 사용량을 흔히 볼 수 있습니다.
GPU 사용률과 처리량은 측정하는 대상이 다르기 때문입니다.
- GPU 사용률은 측정 구간 중 하나 이상의 커널이 실행된 시간 비율입니다.
- 일부 연산 자원만 사용하는 커널이 계속 실행돼도 100%로 표시될 수 있습니다.
- 따라서 GPU 내부 자원의 활용 정도는 SM 활동률로, 처리량은 tokens/s 같은 지표로 함께 확인해야 합니다.
이번 글에서는 GPU 지표의 해석 기준과 현재 수집 중인 지표를 선택한 이유를 정리했습니다.
SM이란?
SM(Streaming Multiprocessor)는 GPU 안에서 여러 스레드의 명령을 실행하는 하드웨어 블록입니다.
GPU 하나는 여러 SM으로 구성되며 SM 하나와 CUDA 코어 하나는 다릅니다.
- CUDA 코어 → SM → GPU (작은 구성 요소부터)
- 하나의 SM에는 여러 CUDA 코어와 스케줄러 등이 있습니다.
SM 활동률은 각 SM에 활성 warp가 있었던 시간 비율을 전체 SM에 걸쳐 평균한 값입니다.
- warp는 GPU가 스레드 32개를 묶어 실행하는 단위
- 메모리 응답을 기다리는 warp도 활성 상태에 포함됩니다.
SM이 100개인 GPU를 예로 들겠습니다.
- 20개 SM이 관측 시간 내내 활성 상태 → SM 활동률 약 20%
- 100개 SM이 관측 시간의 20% 동안 활성 상태 → SM 활동률 약 20%
같은 활동률이어도 작업이 배치된 방식과 실행 시간은 다를 수 있습니다.
SM 개수 확인
CUDA를 사용할 수 있는 PyTorch 환경에서는 장치 속성의 multi_processor_count로 SM 개수를 확인할 수 있습니다.
GPU 서버나 GPU 접근 권한이 있는 컨테이너에서 아래 명령을 실행합니다.
python3 - <<'PY'
import torch
for i in range(torch.cuda.device_count()):
device = torch.cuda.get_device_properties(i)
print(f"CUDA 장치 {i}: {device.name}, SM {device.multi_processor_count}개")
PY
- 출력은 현재 프로세스에 보이는 CUDA 장치 기준입니다. 장치 번호가 호스트의 GPU 번호와 같다고 가정하면 안 됩니다.
- MIG 장치에 접근하는 환경이라면 해당 인스턴스에 할당된 SM 개수를 확인합니다. 물리 GPU 전체 개수와 구분합니다.
- CUDA Runtime API에서는 같은 정보를
cudaDeviceProp.multiProcessorCount로 조회합니다.
우선 수집할 기본 지표
기본 운영 상태를 확인하려면 아래 GPU Metric부터 수집하는 구성을 권장합니다.
-
GPU 작업 유무 —
DCGM_FI_DEV_GPU_UTIL
커널이 실행된 시간 비율로 일반적으로 0~100%로 표시합니다. 최대 연산 성능을 얼마나 사용했는지와는 다릅니다. -
메모리 용량 —
DCGM_FI_DEV_FB_USED,DCGM_FI_DEV_FB_FREE
MiB 단위의 사용량과 여유량입니다. 메모리 용량 사용률과 메모리 송수신 활동을 구분합니다. -
온도·전력 —
DCGM_FI_DEV_GPU_TEMP,DCGM_FI_DEV_POWER_USAGE
각각 °C, W 단위입니다. 부하 변화와 함께 확인합니다. -
동작 클록 —
DCGM_FI_DEV_SM_CLOCK,DCGM_FI_DEV_MEM_CLOCK
MHz 단위입니다. 성능이 떨어지면 온도·전력 상태와 대조합니다. -
GPU 오류 —
DCGM_FI_DEV_XID_ERRORS
마지막 Xid 오류 코드입니다. 오류 발생 횟수로 계산하지 않습니다. -
메모리 오류 —
DCGM_FI_DEV_ECC_SBE_VOL_TOTAL,DCGM_FI_DEV_ECC_DBE_VOL_TOTAL
ECC 오류 누계입니다. 초기화 조건과 장비 지원 여부를 확인합니다.
필드명은 기존 DCGM Exporter에서 사용하는 이름을 기준으로 했습니다.
설치 버전에 따라 지원 여부와 출력 이름이 다를 수 있으므로 /metrics에 나온 값을 확인합니다.
성능 분석에 추가할 지표
-
SM 활동률 —
DCGM_FI_PROF_SM_ACTIVE
SM이 얼마나 활성 상태였는지 확인합니다. 메모리 대기도 포함합니다. -
Tensor 활동률 —
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE
Tensor 연산 파이프의 활동 비율입니다. 최대 FLOPS 대비 실효 성능과 같지는 않습니다. -
DRAM 활동률 —
DCGM_FI_PROF_DRAM_ACTIVE
장치 메모리 송수신이 발생한 사이클 비율입니다. 메모리 용량 사용률과 다릅니다. -
SM occupancy —
DCGM_FI_PROF_SM_OCCUPANCY
상주 warp 수가 최대 수용 가능한 warp 수에서 차지하는 비율입니다. 병목 분석의 보조 지표이며, 높을수록 항상 빠른 것은 아닙니다.
지표를 함께 읽는 방법
- GPU 사용률은 높고 SM 활동률은 낮음: 일부 SM에만 작업이 배치되거나 작은 커널이 반복되는지 확인합니다.
- SM·DRAM 활동률이 모두 높음: 메모리 접근 특성과 처리량을 대조합니다.
- Tensor 활동률이 낮음: 해당 연산이 Tensor Core를 사용하는지부터 확인합니다.
- 메모리 용량은 많이 쓰지만 활동률은 낮음: 모델·캐시가 메모리를 점유한 채 요청을 기다리는 상황인지 확인합니다.
이 조합만으로 병목 원인이 확정되지는 않습니다.
LLM 서비스라면 tokens/s, 요청 처리량, 첫 토큰 지연시간도 같은 부하 조건에서 비교해야 합니다.
필요할 때 추가할 항목
- 여러 GPU 간 통신:
DCGM_FI_PROF_PCIE_TX_BYTES,DCGM_FI_PROF_PCIE_RX_BYTES,DCGM_FI_PROF_NVLINK_TX_BYTES,DCGM_FI_PROF_NVLINK_RX_BYTES- 초당 전송량을 나타내는 gauge입니다. 누적 counter로 보고
rate()를 적용하지 않습니다.
- 초당 전송량을 나타내는 gauge입니다. 누적 counter로 보고
- 발열·효율 분석: 메모리 온도, 에너지 누계, 전력·온도 제한 지표를 추가합니다.
- 수집 상태: Prometheus의
up=1과 필요한 GPU 지표의 존재 여부를 함께 확인합니다.- 수집 요청이 성공해도 필요한 지표가 빠져 있을 수 있습니다.
현재 수집 중인 지표를 선택한 이유
현재 구성은 GPU 사용률, 메모리 사용량·여유량, 온도, 전력, Xid 오류 코드, ECC 이중 비트 오류 누계의 7개 지표를 수집하도록 설정했습니다.
GPU가 작업을 수행하고 있는지, 자원 여유가 있는지, 장비에 이상 징후가 있는지를 우선 확인하려는 구성입니다.
- GPU 사용률은 커널이 실행되고 있는지와 부하 변화를 보기 위해 선택했습니다. 처리량이나 내부 연산 자원의 활용 정도까지 이 값 하나로 판단하지는 않습니다.
- 메모리 사용량·여유량은 모델과 캐시가 차지하는 용량, 추가 작업을 올릴 여유를 확인하려고 함께 수집합니다.
- 온도·전력은 작업 부하에 따라 장비 상태가 어떻게 변하는지 보고, 평소와 다른 변화가 생겼을 때 살펴볼 단서로 사용합니다.
- Xid 오류 코드·ECC 이중 비트 오류 누계는 GPU 오류와 메모리 오류 징후를 확인하기 위해 선택했습니다. 오류 코드와 누적 횟수는 구분해서 읽습니다.
현재는 기본 지표로 GPU의 부하와 장비 상태를 확인합니다.
SM 활동률은 필수 수집 항목으로 두지 않고, GPU 사용률과 처리량 사이의 차이를 분석할 필요가 있을 때 추가로 검토할 계획입니다.
처리량은 tokens/s 같은 애플리케이션 지표로 함께 판단해야 합니다.