vLLM

[์›๋ณธ ๋งํฌ]

vLLM์€ LLM ์„œ๋น™์„ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์ตœ์ ํ™” ์—”์ง„ ์ค‘ ํ•˜๋‚˜๋‹ค.
์˜คํ”ˆ๋ชจ๋ธ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ์˜ฌ๋ ค์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋‹ค๋งŒ ๊ฐ€๋ณ๊ณ  ์ž‘๊ฒŒ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

vLLM์ด ์–ด๋–ค ์ ‘๊ทผ๋ฒ•์œผ๋กœ ๋ชจ๋ธ์„ ํšจ์œจ์ ์œผ๋กœ ์„œ๋น™ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ์ •๋„๋ฅผ ๋Œ€๋žต ์ •๋ฆฌํ•ด๋ณธ๋‹ค.




๊ธฐ์กด ๋ชจ๋ธ ์„œ๋น™ ๋ฐฉ์‹์˜ ๋ฌธ์ œ

์ง์ ‘ ๋ชจ๋ธ์„ ๋ฐ›์•„์„œ ์„œ๋น™ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณดํ†ต ํ—ˆ๊น…ํŽ˜์ด์Šค Transformer ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ ๋‹นํžˆ ํŒŒ์ด์ฌ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ด ๋ฐฉ์‹์€ ์ž˜ ๋™์ž‘ํ•˜๊ธด ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ชจ๋กœ ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„๋“ค์ด ๋งŽ๋‹ค.


  1. ๋™์‹œ ์š”์ฒญ์— ๋Œ€ํ•œ GPU ํ™œ์šฉ๋ฅ  ๋‚ฎ์Œ

  2. ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ์‹ฌํ•จ

  3. Batch ์ฒ˜๋ฆฌ์˜ ๋น„ํšจ์œจ์„ฑ ์กด์žฌ

  4. ๊ทธ๋ƒฅ ์ „๋ฐ˜์ ์œผ๋กœ ๋А๋ฆผ



vLLM์€ ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค์„ ์ข€ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” ๊ณ„์ธต์ด๋‹ค.




vs Ollama

Ollama๋„ ๋ชจ๋ธ์„ ์„œ๋น™ํ• ๋•Œ ๊ธฐ์ดˆ์ ์ธ ์ตœ์ ํ™”๋ฅผ ์ข€ ํ•ด์ฃผ๊ธด ํ•œ๋‹ค.
llama.cpp๋ฅผ ์‚ฌ์šฉํ•ด์„œ KV Cache ์ฒ˜๋ฆฌ, Batch ์ตœ์ ํ™”๋ฅผ ํ•ด์ฃผ๋Š”๋ฐ, ์ „๋ฐ˜์ ์ธ ์ตœ์ ํ™” ๋Šฅ๋ ฅ์€ vLLM์ด ๋” ์ข‹์€ ํŽธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์„ฑ๋Šฅ์ด๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•„์š”ํ•˜๋‹ค๋ฉด vLLM์ด ์„ ํ˜ธ๋œ๋‹ค.

๋ฐ”๋กœ ์ด์–ด์„œ vLLM์ด ๋ชจ๋ธ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.




KV Cache: PagedAttention

LLM ๋ชจ๋ธ๋“ค์€ ๋ณดํ†ต KV ์บ์‹œ๋ฅผ ํ†ตํ•ด์„œ ์ถ”๋ก  ์ค‘์˜ ์ตœ์ ํ™”๋ฅผ ๋งŽ์ด ๊ฐ€์ ธ๊ฐ€๋Š” ํŽธ์ด๋‹ค.
ํ† ํฐ๋งˆ๋‹ค ๋ฒกํ„ฐ๊ฐ’์„ ์—ฌ๋ถ„์˜ GPU VRAM์— ์บ์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ์ด๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ฒด๋“ค์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์บ์‹œ๋ฅผ ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋นผ๋‹ค๋ณด๋ฉด ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ถ• ๋– ์„œ, ๊ณต๊ฐ„์ด ๋‚จ์•„๋„ ๋„ฃ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
GC ๋Ÿฐํƒ€์ž„์ด๋‚˜ ์–ธ์–ด, OS ๋ ˆ๋ฒจ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นํ•ด์ œ๋กœ ๋‹จํŽธํ™”๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๋ฌธ์ œ ์›๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค.

vLLM์€ ์—ญ์‹œ ๊ณ ์ „์ ์ธ ์ ‘๊ทผ๋ฒ•์œผ๋กœ VRAM ๋‹จํŽธํ™” ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•œ๋‹ค.
GPU VRAM์„ ์šด์˜์ฒด์ œ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋†“๊ณ , ํŽ˜์ด์ง€์— ๋ถ„์‚ฐํ•ด์„œ ์บ์‹œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
vLLM์€ ์ด๊ฑธ PagedAttention๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์‚ฌ์‹ค ๊ทธ๋ƒฅ ํŽ˜์ด์ง•์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ๋„ ๋  ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ ์•„๋ฌดํŠผ.

์ด๋ฅผ ํ†ตํ•ด ์ €์žฅ ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค.




Prefix Caching

Prefix Caching์€ ๋ง ๊ทธ๋Œ€๋กœ ํ”„๋กฌํ”„ํŠธ์˜ ์•ž๋ถ€๋ถ„์„ ์บ์‹ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด๊ฒŒ ์™œ ์˜๋ฏธ๊ฐ€ ์žˆ์„๊นŒ?

์‚ฌ์‹ค ์ƒ๋‹น์ˆ˜์˜ ์œ ์ €๋“ค์€ ํ”„๋กฌํ”„ํŠธ ์ง€์‹œ์–ด๋ฅผ ์œ„์—๋‹ค๊ฐ€ ๊ณ ์ •ํ•ด๋†“๊ณ  ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.

[์š”์ฒญ 1]
Translate:
Hello world

[์š”์ฒญ 2]
Translate:
Good morning

[์š”์ฒญ 3]
Translate:
Thank you

์ด๋Ÿฐ ํŒจํ„ด์˜ ๊ฒฝ์šฐ์—๋Š” Translate:์— ๋Œ€ํ•œ ๋ฒกํ„ฐ ์บ์‹œ๋งŒ ์Œ“์•„๋†“๊ณ  ์žฌ์‚ฌ์šฉํ•ด๋„, ์Œ“์ด๋ฉด ๊ฝค ๋งŽ์€ ์ถ”๋ก ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€์‹  vRAM ์†Œ๋น„๋Ÿ‰์ด ์ข€ ์ฆ๊ฐ€ํ•œ๋‹ค. ์ด๊ฑด ์ถ”๋ก ์ด ๋๋‚˜๋„ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๋ฐ˜์˜๊ตฌ ์บ์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




Continuous Batching

vLLM์€ Batch ์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ๋„ ๊ฝค ๊ณต๊ฒฉ์ ์ธ ์ตœ์ ํ™”๋ฅผ ํ•ด์ค€๋‹ค.
๊ทธ๋ƒฅ ์ ๋‹นํžˆ Batch ์ตœ์ ํ™”๋ฅผ ํ• ๋•Œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต A, B, C์— ๋Œ€ํ•ด ๋ฐฐ์น˜ ์ถ”๋ก ์„ ๋‚ ๋ฆฌ๋ฉด, ์ด ๋ฐฐ์น˜ ์ถ”๋ก ์€ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ถ”๋ก  ๋‹จ์œ„๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๋ธ”๋Ÿญ๋œ๋‹ค.
๋‹ค์‹œ ๋งํ•ด์„œ, A, B ์ถ”๋ก ์ด ๋๋‚˜๋”๋ผ๋„, C๊ฐ€ ๋๋‚˜์ง€ ์•Š์œผ๋ฉด A, B ๊ณต๊ฐ„์€ ๋†€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

vLLM์€ ์ด ๋ถ€๋ถ„์„ ํ•€ํฌ์ธํŠธ๋กœ ์ตœ์ ํ™”ํ•œ๋‹ค. C๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜๋”๋ผ๋„, ๋‹ค ๋๋‚˜๊ณ  ๋†€๊ณ  ์žˆ๋˜ A, B ์ž๋ฆฌ์—๋„ D, E ์—ฐ์‚ฐ์„ ๋ฐ”๋กœ ์šฐ๊ฒจ๋„ฃ์–ด์„œ ํŒŒ์ดํ”„๋ผ์ธ์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ํ† ํฐ ์ถ”๋ก ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

https://www.redhat.com/ko/blog/meet-vllm-faster-more-efficient-llm-inference-and-serving

vLLM์€ ์ด๋ฅผ ํ†ตํ•ด์„œ ํ†ต์ƒ์ ์œผ๋กœ 2๋ฐฐ, ๊ทน๋‹จ์ ์œผ๋กœ๋Š” 5~10๋ฐฐ ์ •๋„์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•œ๋‹ค.
vLLM์ด ์ฃผ๋ชฉ๋ฐ›์€ ์ฃผ์š” ์ง€์  ์ค‘ ํ•˜๋‚˜๋‹ค.




vLLM์˜ ๋‹จ์ 

์ด๊ฒŒ ์„ฑ๋Šฅ์€ ์ข‹์€๋ฐ, ์„ธํŒ…๋„ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์ด์Šˆ ํฌ์ธํŠธ๋„ ์ข€ ์žˆ๋‹ค.

์šฐ์„  GPU๋งˆ๋‹ค ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ข€ ์žˆ๋‹ค. ํŠน์ • ๋ชจ๋ธ๊ณผ ์–‘์žํ™”, vLLM์˜ ์กฐํ•ฉ์ด ์–ด๋–ค GPU ์žฅ๋น„์—์„œ๋Š” ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑด ์ž˜ ์ฒดํฌํ•ด๋ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, vRAM์€ ์ข€ ๋” ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. Prefix Cache ๊ฐ™์€ ์ ๊ทน์  ์บ์‹œ ๋ ˆ์ด์–ด๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๋ฌผ๋ก  ๋Œ ์ˆ˜๋„ ์žˆ์Œ)




vLLM์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ

OpenAI ํ˜ธํ™˜ ํ”„๋กœํ† ์ฝœ์„ ์ œ๊ณตํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋„๊ตฌ์— ์ถ”๊ฐ€์ ์ธ ์–ด๋Œ‘ํ„ฐ ์—†์ด ๋ถ™์—ฌ์“ธ ์ˆ˜ ์žˆ๋‹ค.

Prometheus Metrics๋„ ์ž˜ ์ง€์›ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”ํŠธ๋ฆญ์„ ์Œ“๊ณ  ์šด์˜ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.




Gemma4 ๊ตด๋ ค๋ณด๊ธฐ (with Docker)

์ง์ ‘ vllm ์จ์„œ ๋ชจ๋ธ ๋‹ค์šด๋ฐ›๊ณ  ์„œ๋น™ํ•ด๋„ ๋˜๋Š”๋ฐ, ๋Œ€์ค‘์ ์ธ ๋ชจ๋ธ๋“ค์€ ํ”„๋ฆฌ์…‹์œผ๋กœ ๋ง์•„๋†“์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.
gemma4์˜ ๊ฒฝ์šฐ์—๋Š” ํ—ˆ๊น…ํŽ˜์ด์Šค ํ† ํฐ๋งŒ ์žˆ์œผ๋ฉด ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

export HF_TOKEN=hf_*
sudo docker run -d --name gemma4-translate   --restart unless-stopped   --gpus all   --ipc=host   --network host   --shm-size 16G   -e HF_TOKEN=$HF_TOKEN   -v ~/.cache/huggingface:/root/.cache/huggingface   vllm/vllm-openai:latest   --model google/gemma-4-12B-it-qat-w4a16-ct   --host 0.0.0.0   --port 8001   --dtype bfloat16   --max-model-len 8192   --gpu-memory-utilization 0.90   --max-num-seqs 2

์ด๊ฑด GPU VRAM์„ 20GB ์ •๋„ ๋จน๋Š”๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” L4๋กœ ๋Œ๋ ธ๋Š”๋ฐ, ์—ฌ๋ ฅ์ด ์•ˆ๋œ๋‹ค๋ฉด ๋” ์ž‘์€ ๋ชจ๋ธ์„ ์ฐพ๋‹ค.

์•„๋ฌดํŠผ ์‹คํ–‰ํ•˜๋ฉด, ์•ฝ๊ฐ„์˜ ๋กœ๋“œํƒ€์ž„๊ณผ ํ•จ๊ป˜ ๋œฐ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ ์ž”๋œฉ ๋จน๊ณ 

HTTP API๋ฅผ ํ†ตํ•ด ์ฐ”๋Ÿฌ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ž˜ ๋™์ž‘ํ•œ๋‹ค.



์ฐธ์กฐ
https://github.com/vllm-project/vllm
https://arxiv.org/abs/2309.06180?utm_source=chatgpt.com
https://www.redhat.com/ko/blog/meet-vllm-faster-more-efficient-llm-inference-and-serving
https://docs.vllm.ai/en/stable/design/prefix_caching/
https://docs.vllm.ai/en/stable/design/metrics/