📌 Executive Summary
- 초고속 LLM/SLM 서빙 엔진: vLLM은 PagedAttention 알고리즘을 도입하여 KV 캐시의 메모리 낭비를 가상 메모리 페이징 기법으로 96% 이상 줄이고, 기존 Hugging Face 대비 최대 24배 이상의 동시 처리량(Throughput)을 제공합니다.
- 로컬 SLM(소형 언어 모델)과의 최적 궁합: Qwen2.5-7B, Llama-3.2, Gemma-3 등 1B
7B 급 SLM을 vLLM으로 구동하면 단일 GPU(VRAM 816GB) 환경에서도 극도로 낮은 지연 시간(Low Latency)과 실시간 스트리밍 처리가 가능합니다.- OpenAI 표준 API 기본 내장: 추가 코드 없이 서버 구동 즉시
/v1/chat/completions엔드포인트를 제공하여 기존 상용 LLM 클라이언트 코드를 그대로 재사용할 수 있습니다.
📊 리포트 개요 및 프레임워크 비교
| 항목 | 세부 내용 |
|---|---|
| 보고서 주제 | vLLM 기반 로컬 소형 언어 모델(SLM) 고성능 추론 및 서빙 최적화 가이드 |
| 핵심 기술 | PagedAttention, Continuous Batching, AWQ/GPTQ 양자화, OpenAI API Server |
| 사전 요구사항 | NVIDIA GPU (최소 8GB+ VRAM 권장), Python 3.8+ / CUDA 12.x 또는 Docker |
| 추천 대상 모델 | Qwen2.5-7B-Instruct, Llama-3.2-3B, Gemma-2-9B 등 |
🥊 vLLM vs Ollama 핵심 비교 분석
| 비교 항목 | vLLM (프로덕션/서빙 특화) | Ollama (로컬 개발/개인 챗봇 특화) |
|---|---|---|
| 주요 목적 | 고처리량 프로덕션 서빙, 멀티 유저 API 백엔드 | 초간편 로컬 테스트, 개인용 CLI 대화 |
| 추론 백엔드 엔진 | PagedAttention + CUDA 커스텀 커널 | llama.cpp (GGUF 기반 CPU/GPU 하이브리드) |
| 동시 다중 요청 처리 | 연속 배치(Continuous Batching) 로 동시 요청 극대화 | 제한적 동시성 (단일 요청 순차 처리에 최적화) |
| 모델 형식 지원 | Hugging Face SafeTensors, AWQ, GPTQ, FP8 | GGUF 단일 바이너리 파일 |
| API 호환성 | OpenAI REST API 네이티브 100% 호환 | 독자 API + OpenAI 에뮬레이션 레이어 |
| 설치 및 운영 난이도 | Python 가상환경 / CUDA / Docker 필요 (중급) | 원클릭 인스톨러 / CLI 기반 (초급) |
| 권장 사용처 | 사내 서비스 API 백엔드, RAG 에이전트 다중 접속 | 로컬 PC 개인 테스트, 데스크톱 UI 연동 |
🔍 핵심 분석
1. vLLM 아키텍처 및 SLM 서빙의 이점
대규모 언어 모델 서빙에서 가장 큰 병목은 생성 토큰마다 누적되는 KV(Key-Value) 캐시 메모리 낭비와 **요청 대기 지연(Latency)**입니다.
- PagedAttention: OS의 가상 메모리 페이징 기법을 응용하여 비연속적인 메모리 공간에 KV 캐시를 유연하게 할당함으로써 메모리 단편화를 제거합니다.
- 연속 배치 (Continuous Batching): 먼저 끝난 요청의 자리를 기다리지 않고 새로운 요청을 즉시 배치(Batch)에 합류시켜 GPU 유휴 시간을 제거합니다.
2. 환경별 설치 및 실행 가이드
방법 A: Python Pip 패키지 설치 (권장)
CUDA 12.1 이상 및 Python 3.9+ 환경에서 간단히 설치할 수 있습니다.
# 가상환경 생성 및 활성화
python -m venv vllm-env
source vllm-env/bin/activate # Windows: vllm-env\Scripts\activate
# PyTorch (CUDA 지원) 및 vLLM 설치
pip install --upgrade pip
pip install vllm
방법 B: Docker 컨테이너 실행 (격리된 환경)
NVIDIA Container Toolkit이 구성된 환경에서는 Docker를 통해 의존성 충돌 없이 즉시 기동할 수 있습니다.
docker run --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-7B-Instruct \
--gpu-memory-utilization 0.90 \
--max-model-len 4096
3. SLM 모델 선정 기준 및 VRAM 요구사항
로컬 서빙 환경에서 최고의 가성비를 내는 소형 언어 모델(SLM) 가이드입니다.
| 모델명 | 파라미터 크기 | 기본 정밀도 (FP16) | AWQ 4-bit 양자화 | 한국어/도구 호출 강점 |
|---|---|---|---|---|
| Qwen/Qwen2.5-7B-Instruct | 7.6B | ~15 GB VRAM | ~6.5 GB VRAM | 🏆 원픽 추천: 한국어 품질 최상, Function Calling 우수 |
| meta-llama/Llama-3.2-3B-Instruct | 3.2B | ~7 GB VRAM | ~3.5 GB VRAM | 초경량, 빠른 처리 속도, 8GB VRAM GPU에서도 여유 |
| google/gemma-2-9b-it | 9.2B | ~19 GB VRAM | ~8.5 GB VRAM | 고난도 추론, 코딩 및 수학적 문제 해결력 우수 |
| Qwen/Qwen2.5-Coder-7B-Instruct | 7.6B | ~15 GB VRAM | ~6.5 GB VRAM | 사내 코드 리뷰 및 자동 완성 백엔드 전용 |
💡 VRAM 절약 팁 (AWQ 양자화): 8GB VRAM을 가진 RTX 3060/4060 GPU에서도
--quantization awq옵션과 사전 양자화된 모델(예:Qwen/Qwen2.5-7B-Instruct-AWQ)을 사용하면 7B 모델을 완벽하게 서빙할 수 있습니다.
4. 고성능 서빙 설정 및 핵심 최적화 파라미터
vLLM 서빙 엔진을 가동할 때 처리량과 안정성을 결정짓는 주요 CLI 옵션입니다.
| 옵션 플래그 | 권장값 | 상세 설명 |
|---|---|---|
--model | 모델 ID/경로 | Hugging Face 모델 허브 ID 또는 로컬 가중치 폴더 경로 |
--port | 8000 | REST API 서비스 포트 |
--gpu-memory-utilization | 0.85 ~ 0.95 | 전체 VRAM 중 모델 및 KV 캐시로 할당할 비율 (SLM은 0.90 권장) |
--max-model-len | 4096 ~ 8192 | 최대 컨텍스트 윈도우 크기 (지나치게 크게 잡으면 메모리 소모 증가) |
--max-num-seqs | 128 ~ 256 | 동시에 연속 배치로 처리할 최대 세션 수 (처리량 향상) |
--quantization | awq / gptq / fp8 | 양자화 가속 엔진 지정 (해당 형식으로 변환된 모델 사용 시) |
--tensor-parallel-size | 1 (단일 GPU) | 멀티 GPU 분산 서빙 시 GPU 개수 (예: 2, 4) |
--trust-remote-code | 플래그 포함 | 신규 모델 아키텍처 커스텀 코드 실행 허용 |
실무 권장 서빙 기동 명령어
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--port 8000 \
--gpu-memory-utilization 0.90 \
--max-model-len 4096 \
--max-num-seqs 128 \
--trust-remote-code
5. OpenAI 호환 API 연동 및 클라이언트 코드
vLLM은 OpenAI의 API 스펙을 100% 따르므로, 기존 OpenAI SDK를 사용하는 모든 애플리케이션에서 base_url만 변경하여 즉시 사용할 수 있습니다.
Python 연동 예제 (동기 호출 & 실시간 스트리밍)
from openai import OpenAI
# 1. 로컬 vLLM 서버로 클라이언트 초기화
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY" # vLLM 기본 모드는 별도 API 키가 필요 없습니다.
)
# 2. 실시간 스트리밍 질의응답
response_stream = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[
{"role": "system", "content": "당신은 IT 인프라 전문 기술 어시스턴트입니다."},
{"role": "user", "content": "vLLM의 PagedAttention 핵심 원리를 3문장으로 설명해주세요."}
],
temperature=0.7,
max_tokens=512,
stream=True
)
print("[답변 출력]: ", end="")
for chunk in response_stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
print()
cURL 호출 예제
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [
{"role": "user", "content": "소형 언어 모델(SLM)의 장점을 알려줘."}
],
"temperature": 0.5
}'
🎯 결론 및 실무 권장사항
- 개발/개인 테스트는 Ollama, 서비스 배포는 vLLM: 로컬 개인 챗봇이나 단순 탐색 단계에서는 원클릭 구동이 가능한 Ollama를, 다중 접속자가 있거나 서비스 백엔드 API로 탑재할 때는 vLLM을 선택하는 것이 정석입니다.
- SLM + AWQ 조합의 경제성:
Qwen2.5-7B-Instruct-AWQ와 vLLM을 결합하면 100만 원 이하의 보급형 GPU에서도 초당 50~100토큰 이상의 놀라운 처리 속도로 사내 프라이빗 AI 서비스를 구축할 수 있습니다. - OpenAI SDK 재사용성: 프론트엔드나 에이전트 프레임워크(LangChain, LlamaIndex 등)를 교체할 필요 없이 백엔드 엔드포인트 URL 하나만 바꾸면 되므로 인프라 마이그레이션 비용이 제로에 수렴합니다.
⚠️ 한계 및 주의사항
- CUDA 버전 및 PyTorch 의존성: vLLM은 하드웨어 성능을 극한까지 끌어올리기 위해 커스텀 C++/CUDA 커널을 컴파일하므로, 호환되는 NVIDIA GPU 드라이버와 CUDA 툴킷 버전 매칭이 엄격합니다.
- CPU 전용 구동의 비효율: vLLM도 CPU 백엔드를 실험적으로 지원하지만, GPU 가속 환경에 최적화되어 있으므로 CPU 전용 환경이라면 llama.cpp / Ollama가 더 유리합니다.
- 슬라이딩 윈도우 및 긴 컨텍스트: 컨텍스트 창(
--max-model-len)을 32K 이상으로 무리하게 늘릴 경우 KV 캐시가 VRAM을 모두 점유하여 동시 요청 처리 가능 수량(Batch size)이 급격히 줄어들 수 있습니다.