오픈소스 LLM을 직접 서빙하려고 하면 이 두 개를 반드시 마주치게 됩니다.
"sglang이랑 vLLM 중에 뭐 써야 하지?"
둘 다 LLM을 HTTP API로 서빙하는 프레임워크인데, 설계 철학과 강점이 달라요. 이번 글에서는 실전 관점에서 두 프레임워크를 비교해 드릴게요.
먼저 둘 다 뭔지부터
vLLM은 2023년 UC Berkeley에서 발표한 LLM 서빙 프레임워크예요. PagedAttention이라는 메모리 관리 기법을 처음 도입해서 GPU 메모리 효율을 획기적으로 높인 프레임워크입니다. OpenAI API와 호환되는 엔드포인트를 제공해서 기존 코드를 거의 수정 없이 연결할 수 있어요.
sglang은 2024년 Stanford에서 발표한 프레임워크예요. RadixAttention이라는 KV 캐시 공유 기법을 도입해서 특정 시나리오에서 vLLM보다 빠른 처리 속도를 냅니다. 특히 system prompt가 길거나 같은 prefix를 반복 사용하는 경우에 강력해요.
핵심 기술 비교
구분 vLLM sglang
| 핵심 기술 | PagedAttention | RadixAttention |
| KV 캐시 방식 | 페이지 단위 메모리 관리 | Prefix 공유 캐시 |
| API 호환성 | OpenAI API 완벽 호환 | OpenAI API 호환 |
| Continuous Batching | 지원 | 지원 |
| JSON 출력 강제 | 지원 | 지원 (더 빠름) |
| 멀티모달 | 지원 | 지원 |
PagedAttention vs RadixAttention
PagedAttention (vLLM)
GPU 메모리를 고정 크기 페이지로 나눠서 관리하는 방식이에요. KV 캐시를 동적으로 할당하기 때문에 메모리 낭비가 줄어들고, 더 많은 요청을 동시에 처리할 수 있어요. vLLM 이전에는 KV 캐시 메모리를 미리 예약해야 해서 낭비가 심했는데 이걸 해결한 거예요.
RadixAttention (sglang)
여러 요청이 동일한 prefix를 공유할 때 KV 캐시를 재사용하는 방식이에요. 예를 들어 system prompt가 같은 요청이 100개 들어오면, system prompt 부분의 KV 캐시를 한 번만 계산하고 100개가 공유합니다. 멀티 에이전트 시스템처럼 같은 system prompt를 반복 사용하는 환경에서 속도가 확 올라가요.
실전 성능 차이
sglang이 유리한 경우
- system prompt가 길고 반복되는 경우 (멀티 에이전트, RAG)
- JSON 출력을 강제해야 하는 경우 (structured output)
- 같은 prefix를 공유하는 배치 처리
vLLM이 유리한 경우
- 다양한 요청이 섞이는 범용 서빙
- 모델 지원 범위가 중요한 경우
- 안정성과 레퍼런스가 중요한 프로덕션 환경
설치 및 실행
vLLM
pip install vllm
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000
sglang
pip install sglang[all]
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000
둘 다 OpenAI 호환 엔드포인트를 제공하기 때문에 클라이언트 코드는 동일하게 쓸 수 있어요.
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="dummy"
)
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[{"role": "user", "content": "안녕하세요"}]
)
JSON 출력 강제 비교
LLM 에이전트에서 JSON 출력을 강제하는 건 중요한 기능이에요. 둘 다 지원하는데 방식이 달라요.
vLLM
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[...],
response_format={"type": "json_object"}
)
sglang
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[...],
response_format={
"type": "json_schema",
"json_schema": {
"name": "output",
"schema": {
"type": "object",
"properties": {
"result": {"type": "string"},
"reasoning": {"type": "string"}
}
}
}
}
)
sglang은 JSON schema 수준까지 강제할 수 있어서 더 정밀해요. 멀티 에이전트 시스템에서 LLM 출력을 파싱해야 할 때 파싱 실패율이 낮아집니다.
멀티 GPU 설정
대형 모델을 서빙할 때 Tensor Parallelism으로 여러 GPU에 분산할 수 있어요.
vLLM
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--tensor-parallel-size 4
sglang
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-72B-Instruct \
--tp 4
어떤 걸 선택해야 하나
sglang을 선택해야 할 때
멀티 에이전트 시스템을 구축하고 있거나, system prompt가 길고 반복적으로 사용되는 환경이라면 sglang이 유리해요. JSON schema 수준의 출력 강제가 필요한 경우에도 sglang이 더 편합니다.
vLLM을 선택해야 할 때
모델 지원 범위가 넓어야 하거나, 커뮤니티 레퍼런스가 중요한 프로덕션 환경이라면 vLLM이 안전해요. 다양한 요청 패턴이 섞이는 범용 서빙 환경에서도 vLLM이 더 안정적입니다.
마무리
둘 다 OpenAI API 호환이라 클라이언트 코드를 바꾸지 않고 프레임워크만 교체할 수 있어요. 처음 시작한다면 레퍼런스가 많은 vLLM으로 시작하고, system prompt 재사용이 많은 구조라면 sglang으로 전환하는 것을 추천드립니다. 😄
'LLM' 카테고리의 다른 글
| 구글의 딥시크: 터보퀀트(TurboQuant) 완전 분석 — 메모리 6배 절감이 반도체 주가를 흔든 이유 (0) | 2026.03.27 |
|---|---|
| [기초] LLM이 더 똑똑하게 생각하게 만드는 법 — CoT, ToT, Self-Consistency 완전 비교 (0) | 2026.03.26 |
| [기초] LLM이 도구를 직접 호출한다 — Function Calling 원리와 구현 완전 정리 (0) | 2026.03.25 |
| LLM 성능 평가는 어떻게 할까? MT-Bench부터 HELM까지 (0) | 2026.03.24 |
| AI 모델의 실력을 정확히 평가하는 방법: LLM 수동 평가 완벽 가이드 (1) | 2026.03.24 |