7월에 Llama 2 나온 뒤로 다들 셀프호스팅 한번씩 해보는 분위기. 나도 13B chat 모델을 vLLM으로 올려봤다.
환경
- GPU: A100 40GB 1장
- 모델:
meta-llama/Llama-2-13b-chat-hf - vLLM 0.1.4
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-2-13b-chat-hf \
--dtype float16 \
--max-model-len 4096 \
--gpu-memory-utilization 0.90 \
--tensor-parallel-size 1
vLLM이 신기한 건 PagedAttention. KV cache를 page 단위로 쪼개서 관리하니까 batch가 커져도 OOM이 잘 안 난다. 기존 HuggingFace generate()로 돌릴 때 대비 throughput이 4~5배 차이.
측정
| 조건 | throughput (tok/s) | p50 latency |
|---|---|---|
| concurrency 1 | 42 | 720ms TTFT |
| concurrency 8 | 285 | 980ms TTFT |
| concurrency 32 | 640 | 1.9s TTFT |
실전에서 걸린 것들
첫 번째: chat template. Llama 2 chat은 [INST] ... [/INST] 포맷이 있는데, 이거 안 맞추면 모델이 헛소리. Tokenizer의 apply_chat_template이 아직 없던 시절이라 수동으로 조립했다.
두 번째: stop token. </s>랑 [INST]를 stop에 안 박으면 계속 생성됨. 유저 턴까지 스스로 만들어버리는 "self-dialogue" 현상.
세 번째: OpenAI 대비 품질. 13B chat 정도로는 gpt-3.5-turbo 대체가 안 된다. 특히 한국어는 눈에 띄게 어색. 70B 올리면 달라지는데 A100 2장 필요.
결론: 완전한 OpenAI 대체는 무리. 민감 데이터만 사내로 넘기고 나머진 API 쓰는 하이브리드가 현실적. 그래도 vLLM이 있으니 서빙 자체는 생각보다 할 만하다.