예약은 만석, 손님은 없음 — nvidia-smi 0%의 정체
VRAM은 거의 꽉 찼는데 GPU-Util은 0%. 고장이 아니라 서빙 엔진이 KV 풀을 미리 예약해 둔 상태입니다. 모델 적재·추론·사전 예약을 눌러보며 메모리 점유와 연산 사용률이 별개임을 확인합니다. 단순화한 시뮬레이션이며 실제 GPU 측정값이 아닙니다.

목차
nvidia-smi를 보면 메모리는 거의 꽉 찼는데 GPU 사용률(GPU-Util)은 0%인 순간이 있습니다.
이 조합만으로 고장이라고 볼 수는 없습니다. 결론부터 말하면 메모리 점유(VRAM)와 연산
사용률은 서로 다른 지표입니다. 메모리에 뭔가 올라가 있다고 GPU가 계산하고 있는 건 아닙니다.
왜 메모리가 차나
세 가지가 VRAM을 차지합니다.
- 가중치: 모델 파라미터. 대략
파라미터 수 × dtype 바이트입니다. 7B 모델을 fp16(2바이트)로 올리면 약 14GB이고, 이건 모델이 올라가 있는 동안 계속 자리를 차지합니다. - KV 캐시: 생성 중 토큰마다 층별로 K·V를 저장한 것. 요청이 길고 배치가 클수록 커집니다. (동일한 층수·토큰수·헤드 차원인 MHA와 비교하면, GQA/MQA 모델은 KV 헤드 수가 적어 이보다 작습니다.)
- 사전 예약: vLLM 같은 서빙 엔진은 설정된 GPU 메모리 예산(
gpu_memory_utilization) 안에서 가중치와 실행에 필요한 비-KV 메모리를 뺀 나머지를 KV 캐시 풀로 미리 할당합니다. 그래서 요청이 하나도 없어도 메모리는 이미 차 있는 것처럼 보입니다.
왜 사용률은 0인가
nvidia-smi의 GPU-Util은 직전 샘플 구간 동안 GPU 커널이 실행된 시간의 비율입니다. 즉
"지금 계산하고 있는가"를 보는 값이지, 메모리를 얼마나 썼는지를 보는 값이 아닙니다. 모델을
올려두기만 하고 아무 요청도 처리하지 않으면 커널이 돌지 않으니 0%가 됩니다.
실제 서버에서는 세 화면을 함께 봅니다
한 번의 nvidia-smi 화면만 보고 결론을 내리기보다 시간 흐름과 프로세스를 함께
확인해야 합니다.
# 1초마다 GPU 사용률과 메모리 사용량을 함께 기록
nvidia-smi \
--query-gpu=timestamp,utilization.gpu,memory.used,memory.total \
--format=csv -l 1
# 어떤 프로세스가 GPU 메모리를 잡고 있는지 확인
nvidia-smi pmon -s um
메모리는 계속 높고 요청할 때만 사용률이 솟는다면 모델과 예약 풀이 대기하는 정상적인 서빙 패턴일 수 있습니다. 반대로 요청이 있는데도 사용률이 계속 낮다면 CPU 전처리, 디스크·네트워크 입력, 작은 배치, 요청 스케줄링을 함께 확인합니다. 모르는 프로세스가 메모리를 차지한다면 먼저 그 프로세스의 소유자와 작업을 확인해야 합니다.
사용률은 샘플 구간의 비율이므로 아주 짧은 커널 실행은 관측 시점 사이에 지나가 보이지 않을 수 있습니다. 한 번의 0%보다 여러 초의 흐름, 처리량과 요청 지연을 같이 보는 편이 안전합니다.
데모 사용법
첫 화면은 이 현상을 바로 보여주기 위해 모델 적재와 사전 예약이 켜진 상태입니다. 처음부터 비교하려면 ‘모델 내리기’와 ‘사전 예약 끄기’를 차례로 눌러 보세요.
- 모델 적재: 가중치가 VRAM을 차지합니다. 이때 GPU-Util은 데모에서는 0으로 단순화했습니다 (실제로는 초기화·변환 커널이 실행되면 일시적으로 오를 수 있지만, 단순 메모리 전송만으로 오른다는 보장은 없습니다).
- 사전 예약 켜기: 프레임워크가 KV 풀을 미리 확보합니다. 메모리는 거의 가득 차지만 사용률은 여전히 0% — 예약은 만석인데 손님은 없는 상태입니다.
- 추론 요청: 그제서야 커널이 돌아 사용률이 치솟고, 사용 중 KV가 늘어납니다. 끝나면 다시 0%로 내려갑니다.
예약을 켠 상태에서는 요청이 끝나도 그 블록은 풀에 반환될 뿐, 미리 확보한 풀 자체는 유지되어 메모리 점유는 그대로입니다.
정리
서빙 엔진이 의도적으로 KV 풀을 예약했다면 높은 메모리 점유는 정상일 수 있습니다. 반대로 다른 프로세스 점유, 멈춘 작업, OOM 직전 상태일 수도 있으니, "메모리 사용량"과 "연산 사용률"을 따로 봐야 병목이 어디인지 알 수 있습니다. 놀고 있는데 메모리만 찬 거라면 모델·예약이 자리를 잡은 것이고, 사용률이 낮은데 처리량이 안 나온다면 배치·요청 스케줄링을 봐야 합니다.
이 데모는 원리를 분리해 보여주기 위한 단순화한 시뮬레이션이며, 실제 GPU에서 측정한 값이 아닙니다. 추론 사용률(예: 92%)은 설명용 부하 예시이고, 실제 vLLM은 non-Torch 메모리· peak activation·CUDA Graph 여유분까지 시작 시 프로파일링해 KV 풀을 정합니다.
참고:
NVIDIA NVML — utilization.gpu 정의,
NVIDIA nvidia-smi 공식 문서,
vLLM 메모리 설정(gpu_memory_utilization),
Hugging Face — KV 캐시
관련 글

양자 미니랩 1/4 · 비트를 뒤집는 건 양자도 똑같다
양자 미니랩 첫 번째(입문). 일반 비트를 뒤집는 NOT과, 큐비트를 뒤집는 X 게이트가 |0>·|1>에서는 같은 일을 한다는 걸 두 줄로 나란히 눌러봅니다. 이상적 1큐비트 시뮬레이션.
2026.07.22
양자 미니랩 2/4 · 측정하기 전엔 정해지지 않은 큐비트
양자 미니랩 두 번째(입문). H 게이트를 건 큐비트를 1·10·100·1,000회 측정하며, 한 번의 결과(0 또는 1)와 반복이 만드는 50:50 분포가 어떻게 다른지 눌러봅니다. 이상적 1큐비트 시뮬레이션.
2026.07.22