반응형
개요
대규모 언어 모델(LLM) 서빙을 위한 추론 서버들이 빠르게 발전하고 있습니다. 이 글에서는 가장 인기 있는 솔루션인 vLLM, TensorRT-LLM, SGLang을 비교하고, 기존 Triton Inference Server와의 차이점도 알아봅니다.
1. vLLM (PagedAttention 기반)

특징
PagedAttention
- 기존 방식: max_seq_len=2048로 설정하면 실제 100토큰만 생성해도 2048토큰 분량 메모리 할당 (80% 낭비)
- vLLM: 실제 사용한 만큼만 메모리 할당 → 동일 GPU로 4배 더 많은 요청 동시 처리
Continuous Batching
- 기존 Static Batching: 8개 요청 중 가장 긴 요청(30초) 끝날 때까지 전체 대기
- vLLM: 요청 완료 즉시 새 요청 투입 → GPU 유휴 시간 95% 감소
OpenAI 호환 API
vllm serve meta-llama/Llama-2-7b-hf --host 0.0.0.0 --port 8000
사용 예시
from vllm import LLM, SamplingParams
# 모델 로드
llm = LLM(
model="meta-llama/Llama-2-7b-hf",
tensor_parallel_size=2,
gpu_memory_utilization=0.9
)
# 대량 요청 처리
prompts = ["Hello!"] * 100
outputs = llm.generate(prompts, SamplingParams(max_tokens=100))
# HuggingFace 대비 10~20배 빠름
양자화 지원
# AWQ 양자화 (메모리 75% 절약)
llm = LLM(model="TheBloke/Llama-2-7B-AWQ", quantization="awq")
# GPTQ 양자화
llm = LLM(model="TheBloke/Llama-2-7B-GPTQ", quantization="gptq")
# FP8 양자화
llm = LLM(model="meta-llama/Llama-2-7b-hf", quantization="fp8")
장단점
| 높은 처리량 (HuggingFace 대비 13.5x) | 초기 로딩 시간 다소 김 |
| 메모리 효율성 (PagedAttention) | 대용량 모델은 여전히 충분한 GPU 필요 |
| 간단한 설치 및 사용 | |
| 다양한 모델 지원 | |
| 활발한 오픈소스 커뮤니티 |
2. TensorRT-LLM (NVIDIA 최적화)

특징
NVIDIA 전용 커널 최적화
- cuBLAS, cuDNN, FlashAttention 등 NVIDIA GPU 전용 커널 통합
- GEMM(행렬 연산)을 GPU 아키텍처에 맞게 자동 튜닝
- A100/H100에서 최대 2.5배 추가 성능 향상
다양한 양자화 지원
| FP8 | 50% | 1.5x | 거의 없음 |
| INT8 | 50% | 2x | 미세함 |
| INT4 | 75% | 3x | 일부 있음 |
In-flight Batching
- vLLM의 Continuous Batching과 유사
- GPU 유휴 시간 95% 감소
Multi-GPU Tensor Parallelism
- 모델을 여러 GPU에 분산
- A100 8대로 Llama-70B 실행 가능
사용 예시
# 1단계: 체크포인트 변환
python convert_checkpoint.py \
--model_dir ./llama-2-7b-hf \
--output_dir ./llama-2-7b-trt
# 2단계: 엔진 빌드
trtllm-build \
--checkpoint_dir ./llama-2-7b-trt \
--output_dir ./llama-2-7b-engine \
--quantization int8 \
--max_batch_size 128
# 3단계: 추론
from tensorrt_llm.runtime import ModelRunner
runner = ModelRunner.from_dir("./llama-2-7b-engine")
outputs = runner.generate(input_ids, max_new_tokens=100)
장단점
| NVIDIA GPU에서 압도적 성능 (vLLM 대비 1.5~2배) | NVIDIA GPU 전용 |
| 지연 시간 10~50ms (실시간 앱 가능) | 복잡한 워크플로우 (변환 → 빌드 → 실행) |
| INT4/INT8/FP8 양자화 완벽 지원 | 사용하기 어려움, 진입 장벽이 높음 |
| NVIDIA 공식 지원 | 엔진 빌드에 10~30분 소요 |
3. SGLang (Structured Generation Language)

특징
구조화된 생성
- JSON, XML 등 구조화된 출력에 특화
- JSON Schema 준수 보장
RadixAttention
- KV Cache 공유로 효율성 향상
- 동일 프롬프트 prefix를 가진 요청들 간 캐시 공유
Python DSL
- 직관적인 문법으로 복잡한 프롬프트 파이프라인 작성
사용 예시
import sglang as sgl
@sgl.function
def multi_turn_chat(s, question):
s += "System: You are a helpful assistant.\n"
s += "User: " + question + "\n"
s += "Assistant:" + sgl.gen("answer", max_tokens=100)
# JSON 형식 출력 강제
s += "\nJSON:" + sgl.gen("json", regex=r'\{.*\}')
result = multi_turn_chat.run(question="What is AI?")
print(result["answer"])
print(result["json"])
장단점
| 구조화된 출력에 최적화 | 상대적으로 새로운 프로젝트 |
| 복잡한 프롬프트 파이프라인 쉽게 구현 | 커뮤니티 규모가 작음 |
| 빠른 개발 속도 | |
| JSON Schema 준수 용이 |
4. Triton Inference Server와의 관계
Triton이란?
Triton은 범용 모델 서빙 플랫폼입니다:
- TensorFlow, PyTorch, ONNX, TensorRT 등 다양한 백엔드 지원
- REST/gRPC API 제공
- 동적 배치, 모델 버전 관리
- 멀티모델 서빙
핵심 차이
| 목적 | 범용 모델 서빙 플랫폼 | LLM 전용 추론 엔진 |
| 모델 범위 | 모든 ML 모델 | LLM만 |
| 최적화 | 백엔드에 의존 | LLM 특화 최적화 내장 |
| 사용 방식 | 서빙 플랫폼 | 추론 엔진 (서빙 포함 가능) |
+ Triton은 TensorRT-LLM을 백엔드로 사용할 수 있습니다
5. 성능 비교
A100 GPU 기준 (Llama-2-7B)
| 처리량 (tokens/sec) | 210 | 2,850 | 4,200 |
| 지연 시간 (100 req) | 142초 | 9.1초 | 5.8초 |
| GPU 메모리 활용률 | 35% | 94% | 95% |
| 동시 요청 수 | 16개 | 128개 | 128개 |
양자화 비교
| AWQ | O | X |
| GPTQ | O | X |
| INT8 | X | O |
| INT4 | X (AWQ로 대체) | O |
| FP8 | O | O |
6. 정리
| 빠른 개발/프로토타이핑 | vLLM |
| NVIDIA GPU + 최고 성능 | TensorRT-LLM |
| 구조화된 출력 필요 | SGLang |
| 여러 모델 타입 혼합 서빙 | Triton + TensorRT-LLM Backend |
| 기존 Triton 환경 활용 | Triton + TensorRT-LLM Backend |
| AMD GPU 사용 | vLLM |
| 메모리 부족 | vLLM (AWQ) 또는 TensorRT-LLM (INT4) |
- vLLM: 범용성, 사용 편의성, 높은 처리량. 시작하기에 가장 좋은 선택
- TensorRT-LLM: NVIDIA GPU에서 최고 성능. 프로덕션 대용량 서비스에 적합
- SGLang: 구조화된 출력, 에이전트 워크플로우에 특화
- Triton: 범용 서빙 플랫폼. 다양한 모델 타입을 통합 서빙할 때 적합
추천 접근: vLLM으로 시작하고, 성능이 중요해지면 TensorRT-LLM으로 마이그레이션. 이미 Triton을 사용 중이라면 TensorRT-LLM Backend를 추가.