20230905

Llama 2 서빙 — vLLM 실전 구축

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 142720ms TTFT
concurrency 8285980ms TTFT
concurrency 326401.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이 있으니 서빙 자체는 생각보다 할 만하다.