세 가지 AI 서비스를 하나의 24GB GPU에 올렸더니 사용량은 17.8GB였습니다. 무엇이 가능한지 알아봤습니다.
요약
본 글은 단일 GPU에 여러 AI 서비스를 동시에 구동할 때의 실제 VRAM 사용량을 측정했습니다. RTX 3090 (24GB)에 Whisper ASR, TTS, 임베딩 모델 세 가지를 상주시키자 평균적으로 17.5GB가 사용되었으며, 최대 사용량은 23.4GB로 확인되었습니다. 이는 단일 모델 사양서만으로는 알 수 없는 다중 테넌트 환경에서의 GPU 자원 할당에 대한 실질적인 가이드를 제공합니다.
핵심 포인트
- 단일 모델 VRAM 요구량 외, 여러 서비스를 동시에 구동하는 것이 중요함.
- Whisper ASR, TTS, 임베딩 등 3가지 서비스가 24GB 중 평균 17.5GB를 사용함.
- 최대 부하 시에는 23.4GB까지 사용 가능하여 GPU 용량 계획에 참고할 수 있음.
하나의 24GB GPU에 세 가지 AI 서비스를 올렸습니다. 사용량은 17.8이었습니다. 무엇이 가능한지 알아봅니다.
로컬 LLM 연구소 — 파트 9
한 번의 통제된 실험. 하나의 수치. 그리고 최종 결론.
인터넷에서 "얼마나 많은 VRAM이 필요한가"에 대한 조언은 한 가지 유형으로 나타납니다: 사양서(spec sheet)입니다. "27B 모델을 FP8로 돌리려면 28GB가 필요합니다. 70B 모델을 Q4로 돌리려면 42GB가 필요합니다. 48GB 카드를 구매하세요."
이것은 단일 모델에 대한 답변일 뿐입니다. 실제 사용 중인 스택 — 즉, 전사(transcription) 서비스, 임베딩 모델, 소형 채팅 모델 —을 하나의 카드에서 실행하려고 할 때 무슨 일이 발생하는지 아무도 알려주지 않습니다. 여러분이 찾는 답변들은 추측일 뿐인데, 왜냐하면 아무도 다중 테넌트(multi-tenant) GPU를 측정해 본 적이 없기 때문입니다.
저는 해봤습니다. 지난 한 주 동안 제 RTX 3090 (24GB)은 세 가지 AI 서비스를 동시에 실행하고 있었습니다: Whisper ASR 웹 서비스, 소형 TTS 음성 모델, 그리고 RAG 파이프라인을 위한 임베딩 모델입니다. 저는 전체 VRAM 이력과 테넌트별 할당량(per-tenant attribution)을 추출했습니다. 이것이 카드가 실제로 보유하고 있는 것, 그리고 가정용 GPU 크기를 결정하는 데 있어 그 수치가 무엇을 의미하는지 보여줍니다.
설정 (The setup)
- 카드: NVIDIA RTX 3090, 24GB (24,576 MB), 전력 제한 390W
- 테넌트 (모두 상주, 모두 Docker):
- Whisper ASR 웹 서비스 (WhisperX, large-v3) — 음성 메모, 회의, 팟캐스트 클립을 위해 제가 사용하는 도구들이 호출하는 전사 엔드포인트(transcription endpoint)
- 소형 TTS 음성 모델 — 동일한 어시스턴트 스택용 텍스트-음성 변환(text-to-speech)
- nomic-embed-text (Ollama) — RAG 파이프라인을 위한 임베딩
- 원격 측정 데이터 (Telemetry): 2시간 간격으로 기록된 7일간의 VRAM / 전력 / 사용률, 그리고 호출자별 할당량
- 박스 안의 모든 것: 55개의 컨테이너, 92개의 systemd 유닛, 56 스레드 Xeon 프로세서, 64GB RAM. GPU는 위의 세 가지 테넌트만 인식합니다.
이 세 가지 서비스가 선택된 이유는 이것이 가정용 AI 스택의 실제 형태이기 때문입니다: 크기가 어느 정도 있는 상주 모델(ASR), 중간 크기의 상주 모델(TTS), 그리고 아주 작은 상주 모델(임베딩). 채팅 모델은 없습니다. 27B 채팅 모델은 두 개의 3090을 가진 다른 장치에서 작동합니다. 그것은 또 다른 글의 주제입니다.
수치 (The number)
해당 카드는 24GB 중 17.8GB를 사용하며 72%를 차지하고 세 가지 모델이 상주(resident)하고 있으며, 주간 최대 사용량은 23.4GB였습니다. 시스템 RAM으로 단 한 바이트도 넘치지 않았습니다.
| 테넌트 | 평균 VRAM (7일) | 최대 VRAM (7일) |
|---|---|---|
| Whisper ASR (large-v3) | 7,871 MB (~7.7 GB) | 10,558 MB (~10.3 GB) |
| ... |
작성 시점의 측정된 현재 상태는 24,576MB 중 17,775MB를 사용하며 카드 용량의 72%입니다. 세 테넌트가 각각 7.87GB + 4.96GB + 4.67GB = 17.5GB를 차지하고 있으며, 여기에 카드의 CUDA 컨텍스트 오버헤드가 추가된 수치입니다.
최대 사용량인 23.4GB가 흥미로운 수치입니다. 이는 Whisper 서비스가 대용량 오디오 파일 배치(batch)를 받는 동시에 TTS 모델이 긴 응답을 렌더링할 때 발생했습니다. 두 개의 큰 테넌트가 함께 급증했고, 임베딩 모델은 4.6GB를 유지했으며, 카드는 용량의 한계까지 1.2GB 차이로 다다랐습니다. 하지만 버텼습니다. 넘침(spill)도 없고, OOM(Out of Memory)도 없고, 충돌도 없었습니다. 왜냐하면 최대 부하가 지속적인 부하가 아니라 몇 초간의 순간적인 것이었기 때문입니다.
각 테넌트가 실제로 차지하는 용량
모델의 '이론적 VRAM(paper VRAM)'은 가중치(weights)를 의미합니다. 측정된 VRAM은 가중치에 작업 집합(working set)과 프레임워크 오버헤드가 더해진 것입니다. 테넌트별로 그 차이를 살펴보겠습니다:
Whisper large-v3. FP16 기준 가중치는 약 3.1GB입니다. 측정된 평균 사용량은 7.7GB로, 가중치의 2.5배에 달합니다. 이 차이는 인코더의 오디오 특징 버퍼(긴 파일과 대기 중인 파일이 더 많은 용량을 차지함), WhisperX가 함께 실행되는 VAD 및 정렬 모델, 그리고 CUDA 컨텍스트 때문입니다. 10.3GB라는 최대 사용량은 처리 중인 대용량 파일 배치 때문입니다.
TTS 음성 모델. 가중치 약 4.5GB인데 비해 측정된 용량은 4.7~4.8GB입니다. 이 모델은 요청 간에 상태를 유지하지 않는(stateless) TTS의 특성상 이론적인 수치에 근접합니다. 긴 컨텍스트나 대기 버퍼가 없기 때문입니다. 따라서 카드에서 가장 '정직한' 테넌트라고 할 수 있습니다.
nomic-embed-text. 137M 파라미터의 임베딩 모델입니다. 이론적 가중치는 약 0.3GB입니다. 측정된 용량은 4.5~4.7GB입니다. 이 차이는 Ollama 런타임, CUDA 컨텍스트, 그리고 임베딩 배치를 위해 사전에 할당하는 KV 공간 때문입니다. '300MB가 필요하다'고 하는 모델이 실제 상주 서비스로 작동할 때는 4.6GB를 필요로 합니다. 이것은 사람들이 절대 언급하지 않는 수치입니다.
패턴: 실제 측정된 서비스의 VRAM은 가중치 크기의 1.2~2.5배이며, 이 배율은 가장 많은 상태(state)를 가진 모델에서 가장 크게 나타납니다. 따라서 카드 용량을 책정할 때는 가중치가 아닌 실제 측정된 수치를 기준으로 예산을 잡아야 합니다.
누가 호출했는가 (Who is calling it)
7일간의 기여도 분석은 TTS 모델이 더 큰 '스파이크(spike)' 기여자임에도 불구하고, 왜 Whisper 테넌트가 카드 사용 시간의 가장 큰 비중을 차지하는지 보여줍니다.
| 호출 주체 (Caller) | 7일간 카드 사용 시간 (Seconds on the card) |
|---|---|
| 자체 어시스턴트 코어 (whisper 프록시 경유) | 4,970 |
| ... |
이 카드는 단일 앱이 아니라 공유 서비스입니다. 일주일 동안 여섯 개의 다른 호출 주체가 Whisper 엔드포인트를 사용했습니다. TTS와 임베딩 테넌트는 각각 하나의 호출 주체(어시스턴트 스택)를 가집니다. 이러한 기여도 분석은 'GPU가 바쁘다'는 것을 '누가 바쁜지'로 바꿔주며, 이는 단순히 훑어보는 대시보드와 실제로 조치할 수 있는 대시보드의 차이를 만듭니다.
반론: 72%는 많은 비율이다
합리적인 반박은 이렇습니다. VRAM의 72%를 사용하고 피크 시 1.2 GB의 여유 공간을 가진 카드는 더 큰 파일이 들어오는 날 실패할 카드입니다. 여유 공간(Headroom)은 보험과 같고, 12%는 얇은 보험입니다.
맞습니다. 하지만 측정 결과가 말해주는 것은 이 보험이 일주일간 실제 사용에서 얼마나 가치가 있었는지입니다. 피크는 3초짜리 이벤트였으며, 카드는 이를 흡수했습니다. 지속적인 상태(sustained state)는 약 17 GB로, 이는 7.5 GB의 여유 공간을 남겨주어 카드 용량의 31%를 차지합니다. 23.4 GB의 피크는 실제로 발생한 최악의 경우가 아니라, 발생할 수 있는 최악의 경우입니다.
여유 공간에 대한 솔직한 버전은 이렇습니다: 실제로 실행하게 될 가장 큰 '지속적인(sustained)' 작업 집합 크기(working set)를 기준으로 하고, 여기에 50%의 여유 공간을 더해야 합니다. 상상할 수 있는 가장 큰 스파이크가 아닙니다. 만약 여러분의 스택의 지속적인 작업 집합 크기가 17 GB라면, 24 GB 카드는 지속적 사용량 대비 1.4배이므로 충분합니다. 여기에 7B 채팅 모델을 같은 카드에 추가하여 (지속적 약 8 GB), 지속적인 작업 집합은 25 GB가 되고 24 GB 카드는 작동을 멈춥니다. 이것이 실제 실패 모드입니다: 스파이크가 아니라 새로운 테넌트의 추가입니다.
지금 내가 구매할 것
만약 제가 오늘 이 스택을 구축한다면:
- 허브 카드 (ASR + TTS + 임베딩): 24 GB. 지속적인 작업 세트(Sustained working set)는 17 GB, 최대 피크는 23.4 GB였습니다. 16 GB 카드는 충분하지 않습니다—TTS 모델만으로도 Whisper 서비스에 과부하가 걸릴 수 있습니다. 32 GB 카드가 편안하겠지만 비용이 더 들고 적절한 용량의 워크로드에는 너무 뜨겁게 작동합니다.
- 채팅 카드(들): 채팅 모델용 크기. 27B 모델을 FP8로 구동하려면 24 GB 카드 두 개(또는 48 GB 카드 한 개)가 필요합니다. 이는 허브 카드를 공유하지 않습니다.
- 규칙: 워크로드 클래스별로 하나의 카드가 필요합니다—상주 서비스는 한 곳에, 대형 채팅 모델은 다른 곳에 배치해야 합니다. 각 클래스의 측정된 작업 세트 크기에 50% 여유 공간을 더한 것이 필요한 용량입니다.
24 GB의 3090이 중고 시장에서 여전히 가장 가격 대비 성능(price-per-GB)이 좋기 때문에 가정용 스택에 어디에나 배치되어 있습니다. 하지만 '가장 좋은 가격 대비 성능'은 채팅 머신에 대한 주장입니다. 허브의 경우, 주장은 '추가 테넌트(tenant)를 위한 여유 공간을 포함하여 내 상주 서비스의 측정된 작업 세트를 수용할 수 있는 크기'이며—제 스택의 경우, 이는 16 GB도 아니고 48 GB도 아닌 24 GB입니다.
결론 (Verdict)
하나의 24 GB GPU에 세 가지 AI 서비스 구동: 지속 사용량 17.8 GB, 최대 피크 23.4 GB, 7일 동안 오버플로우 없음. 상주 서비스의 측정된 VRAM은 가중치(weights)의 1.2–2.5배이며, 피크는 지속적인 부하가 아닌 몇 초간 발생하는 현상입니다. 카드의 크기는 지속 작업 세트와 50% 여유 공간을 고려하여 결정하고, 대형 채팅 모델은 별도의 카드에 배치해야 합니다. 사양표(spec sheet)는 하나의 모델이 무엇을 필요로 하는지 알려줍니다. 미터기(meter)는 당신의 스택이 무엇을 필요로 하는지 알려줍니다.
The Local LLM Lab은 가정용 GPU 스택에서 측정된 실험 시리즈입니다. 이 기사에 있는 모든 숫자는 추정치가 아니라 카드에서 7일 동안 수집한 VRAM 원격측정 데이터(telemetry)를 기반으로 했습니다. 다음 내용은 실제로 GPU 자원을 얼마나 사용하는지—'GPU가 바쁘다'는 것을 이름 목록으로 바꾸는 호출자 수준의 귀속(caller-level attribution)입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기