데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
vLLM은 LLM(Large Language Model) 추론 서빙을 위한 고성능 라이브러리입니다. PagedAttention 알고리즘을 통해 메모리 효율성을 극대화하고, 수천 개의 동시 요청을 처리할 수 있는 처리량(throughput)을 제공합니다.
KV 캐시를 페이지 단위로 관리하여 메모리 단편화를 해결하고 GPU 메모리 사용률을 60~70%까지 향상시킵니다.
요청이 들어올 때마다 동적으로 배치를 구성하여 GPU 활용도를 극대화하고 지연 시간(latency)을 줄입니다.
OpenAI 호환 API, 자체 서버, Hugging Face 통합 등 다양한 방식으로 배포할 수 있습니다.
기존 LLM 서빙 솔루션 대비 vLLM의 장점을 비교합니다.
| 솔루션 | 장점 | 단점 | vLLM 대비 |
|---|---|---|---|
| Hugging Face Transformers | 간편한 사용, 모델 다양성 | 낮은 처리량, 메모리 비효율 | 처리량 24배 향상 |
| Text Generation Inference (TGI) | Continuous Batching, 토큰 스트리밍 | 설정 복잡, 리소스 요구량 높음 | 유사 성능, 더 가벼운 아키텍처 |
| TorchServe | 프로덕션 준비, 모니터링 | LLM 최적화 부족, 높은 지연 시간 | LLM 특화 최적화 |
| 기본 API 서버 | 커스터마이징 용이 | 낮은 동시성, 관리 부담 | 아키텍처 오버헤드 제거 |
# CUDA 12.1 기준 (가상환경 권장)
pip install vllm
# 특정 버전 설치
pip install vllm==0.6.0
# 추가 기능 포함 (AWQ, GPTQ 등)
pip install vllm[all]
# CLI로 서버 실행 (Meta-Llama-3-8B-Instruct 예시)
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
--port 8000 \
--max-model-len 8192 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9
from vllm import LLM, SamplingParams
# 모델 로드
llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct",
max_model_len=8192,
gpu_memory_utilization=0.9)
# 샘플링 파라미터 설정
sampling_params = SamplingParams(temperature=0.7,
top_p=0.95,
max_tokens=512)
# 추론 실행
prompts = [
"대한민국의 수도는?",
"파이썬에서 리스트를 정렬하는 방법은?"
]
outputs = llm.generate(prompts, sampling_params)
# 결과 출력
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated: {output.outputs[0].text}\n")
import openai
# vLLM 서버를 OpenAI 클라이언트로 연결
client = openai.OpenAI(
api_key="token-abc123", # 임의 값
base_url="http://localhost:8000/v1"
)
# 채팅 완성 요청
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-8B-Instruct",
messages=[
{"role": "user", "content": "안녕! 너의 이름은 뭐야?"}
],
temperature=0.7,
max_tokens=100
)
print(response.choices[0].message.content)
| 파라미터 | 기본값 | 설명 | 실무 권장값 |
|---|---|---|---|
--max-model-len |
모델별 상이 | 모델이 처리할 수 있는 최대 시퀀스 길이 | 모델 컨텍스트 길이의 80~90% |
--gpu-memory-utilization |
0.9 | GPU 메모리 사용률 목표 (0.0~1.0) | 0.85~0.95 (OOM 발생 시 낮춤) |
--tensor-parallel-size |
1 | 텐서 병렬 처리에 사용할 GPU 수 | 모델 크기에 따라 (7B:1, 70B:4) |
--block-size |
16 | PagedAttention 블록 크기 (토큰 수) | 8~32 (성능 테스트 권장) |
--max-num-batched-tokens |
2560 | 한 배치에서 처리할 최대 토큰 수 | GPU 메모리에 따라 조정 |
--max-num-seqs |
256 | 최대 동시 처리 시퀀스 수 | 동시 사용자 수 예측하여 설정 |
--quantization |
없음 | 양자화 방법 (awq, gptq, squeezellm) | 메모리 절약 필요 시 awq |
증상: CUDA out of memory 에러 발생.
해결:
--gpu-memory-utilization 값을 0.8 이하로 낮춤--max-model-len 줄이기증상: 토큰 생성 속도가 느림.
해결:
--block-size 조정 (보통 16)--max-num-batched-tokens 증가증상: 클라이언트에서 연결 끊김.
해결:
--host 명시적 설정--max-num-seqs와 --max-num-batched-tokens를 튜닝해야 합니다.
# GPU 메모리 사용량 확인
nvidia-smi --query-gpu=memory.used,memory.total --format=csv
# vLLM 서버 메트릭 (활성화 시)
curl http://localhost:8000/metrics
# 로그 확인 (상세 로깅 활성화)
vllm serve ... --log-level debug