๐ก ์ค์ LLM ์ ํ ํธ์คํ ๋ฐฐํฌ ๊ฐ์ด๋๋ถ
์กฐ์ง ๋๋ ๊ฐ์ธ์ด ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ์์ฒด์ ์ผ๋ก ๋ฐฐํฌ(Self-hosting)ํ๊ณ ์ด์ํ ๋ ํ์ํ ํต์ฌ ์ง์นจ์ ์ ๋ฆฌํ ์ค๋ฌด ๊ฐ์ด๋์ ๋๋ค.
์ ํ๋ธ ์ค๋ช ๋งํฌ : https://youtu.be/YiCqDJFExEE
๐ 1. ์ Self-Hosting์ ๊ณ ๋ คํด์ผ ํ๋๊ฐ?
์กฐ๊ฑด | Self-hosting ๊ณ ๋ ค ๋์ ์ฌ๋ถ |
---|---|
๋๊ท๋ชจ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค | โ Yes |
API ๋น์ฉ์ด ๋ถ๋ด๋๋ค | โ Yes |
๋ณด์/์ปดํ๋ผ์ด์ธ์ค ์ด์๊ฐ ์๋ค | โ Yes |
ํน์ ๋๋ฉ์ธ ํนํ ๋ชจ๋ธ์ด ํ์ํ๋ค | โ Yes |
๋ฒกํฐ ๊ฒ์/์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ด์ํ๋ค | โ Yes |
โ ์ ํญ๋ชฉ ์ค ํ๋๋ผ๋ ํด๋น๋๋ฉด, self-hosting์ ํ์ค์ ์ธ ๋์์ด ๋ ์ ์์ต๋๋ค.
๐ง 2. ๋ฐฐํฌ ์ค๋น: ์ธํ๋ผ ๊ฒฝ๊ณ ์ ์
๐ ๋ฐฐํฌ ์ ์ ๋ค์ ์ง๋ฌธ์ ๋ตํด๋ณด์ธ์:
- ์ด๋ ์ ๋์ GPU/CPU ์์์ ์ธ ์ ์๋๊ฐ?
- ๋ชฉํ ์ง์ฐ ์๊ฐ(latency)๊ณผ ๋์ ์ฌ์ฉ์ ์๋?
- ์ด๋ค ์ ํ์ ๋ชจ๋ธ๊ณผ ์ํฌ๋ก๋๋ฅผ ๋ค๋ฃจ๋๊ฐ?
โ ๋ชฉํ ๋ฌธ์ฅ ์์:
"์ 100๋ง ์ ์ดํ ๋น์ฉ์ผ๋ก, 4์ด ์ดํ ์๋ต ์๋๋ก, 100๋ช ๋์ ์ฌ์ฉ์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค."
์ด ๋ฌธ์ฅ์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ธ ํฌ๊ธฐ, ํ๋กฌํํธ ์ต์ ํ, ์๋น ๋ฐฉ์ ๋ฑ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๐ฆ 3. ์์ํ ๋ชจ๋ธ ์ ๊ทน ํ์ฉํ๊ธฐ
์ฅ์ | ์ค๋ช |
---|---|
๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ | 4bit ์์ํ๋ก ๋ํ ๋ชจ๋ธ๋ ๋จ์ผ GPU์ ์ ์ฌ ๊ฐ๋ฅ |
์ฑ๋ฅ ์ ์ง | ์ ํ๋ ์์ค ์์ด ์๋ ํฅ์ (๋ ผ๋ฌธ: The Case for 4-bit Precision) |
๋น์ฉ ์ ๊ฐ | ๊ฐ์ GPU์์ ๋ ๋ง์ ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
๐ง ์ถ์ฒ ์ ์ฅ์:
- Hugging Face:
TheBloke
,nousresearch
,mlx-community
- ํฌ๋งท:
GGUF
,GPTQ
,AWQ
๐ 4. GPU ํ์ฉ๋ฅ ์ ๋์ด๋ ๋ฐฐ์น ์ ๋ต
โ ํ์ง ๋ง ๊ฒ:
- ์์ฒญ๋ง๋ค 1ํ ์คํ (No Batching)
- ์ ์ ๋ฐฐ์น๋ง ์ฌ์ฉ (Spiky Utilization)
โ ์ถ์ฒ ์ ๋ต: Continuous Batching
- ํ ํฐ ๋จ์๋ก ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ GPU๋ฅผ ๊ณ์ ํ์ฉ
- vLLM ๋ฑ ํ๋ ์์ํฌ์์ ์ง์
โ๏ธ 5. ์ํฌ๋ก๋ ์ต์ ํ ๊ธฐ์
๊ธฐ์ | ์ค๋ช | ํจ๊ณผ |
---|---|---|
Prefix Caching | ๊ณต์ ๋๋ ๊ธด ํ๋กฌํํธ ์บ์ ์ฌ์ฌ์ฉ | ์๋ต ์๋ ์ต๋ 7๋ฐฐ ํฅ์ |
SSD (Speculative Decoding) | ๋ฐ๋ณต๋๋ ์ถ๋ ฅ ํจํด ์บ์ฑ | JSON ์ถ์ถ ๋ฑ์์ 2.5๋ฐฐ ์ฑ๋ฅ ํฅ์ |
๋ด ์ํฌ๋ก๋๋ฅผ ์๋ ๊ฒ์ API ์ ๊ณต์๊ฐ ์ ๋ ๋ฐ๋ผ์ฌ ์ ์๋ ์ฅ์ ์ ๋๋ค.
๐ง 6. ๋ชจ๋ธ ์ ํ ์ ๋ต
- LLM์ ์ ์ฒด ํ์ดํ๋ผ์ธ์ ์ผ๋ถ์ผ ๋ฟ
- ๊ฒ์(Retrieval) ์ฑ๋ฅ์ด ์ข๋ค๋ฉด ์์ ๋ชจ๋ธ๋ก๋ ์ถฉ๋ถ
๐ง ์ถ์ฒ ๋ชจ๋ธ
- ์ํ:
Gemma 2B
,TinyLlama
,Phi-2
- ์คํ:
Llama 2 7B
,Mistral
,Qwen 7B
- ๋ํ:
Mixtral
,Llama 2 70B
(์ ๋ง ํ์ํ ๋๋ง)
๐๏ธ 7. ์กฐ์ง ๋ด ์ธํ๋ผ ํตํฉ ์ ๋ต
โ ๋์ ์:
- ํ๋ง๋ค Ollama, vLLM, HuggingFace ๋ฐ๋ก ์ด์
- GPU ์ค๋ณต ์ฌ์ฉ, ์ด์ ๋ณต์ก๋ ์ฆ๊ฐ
โ ์ข์ ์: ์ค์ API ์์คํ
๋ด๋ถ OpenAI API ๋๋ Bedrock์ ๋ง๋ค์ด, ๋ชจ๋ ํ์ด ๊ณต์ API๋ก ์ฌ์ฉ
๊ตฌ์ฑ ์์ | ์ค๋ช |
---|---|
์ถ๋ก ์๋ฒ | vLLM ๊ธฐ๋ฐ ํตํฉ ๋ชจ๋ธ API |
๋ชจ๋ธ ์ข ๋ฅ | ๋ํ + ์คํ + ์ํ + ๋ณด์กฐ ๋ชจ๋ธ(์๋ฒ ๋ฉ ๋ฑ) |
๋ด๋ถ ์ฌ์ฉ์ | ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์, ML ์์ง๋์ด ๋ฑ |
๐ฏ โ์๋น์ ์ด๋ ต๋ค. ํ ๋ฒ๋ง ์ ํ๊ณ ๋ชจ๋๊ฐ ๊ณต์ ํ์.โ
๐ vLLM์ด๋?
vLLM = "Very Fast LLM"
์คํ์์ค๋ก ๊ฐ๋ฐ๋ LLM ์ถ๋ก ์ต์ ํ ํ๋ ์์ํฌ์ ๋๋ค.
Meta, Google, Microsoft ๊ฐ์ ๋๊ธฐ์ ๋ค๋ ์ฐธ๊ณ ํ ์ ๋๋ก ์ฑ๋ฅ์ด ๋ฐ์ด๋ฉ๋๋ค.
- ๊ณต์ ๊นํ๋ธ: https://github.com/vllm-project/vllm
๐ฏ ์ vLLM์ด ์ค์ํ๊ฐ์?
vLLM์ ๊ธฐ์กด Hugging Face transformers๋ Text Generation Inference๋ณด๋ค๋ ํจ์ฌ ๋ ๋น ๋ฅธ ์ถ๋ก ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
โ ํต์ฌ ํน์ง:
Continuous Batching | ์ฌ๋ฌ ์์ฒญ์ ํ ํฐ ๋จ์๋ก ์ค์๊ฐ ๋ฐฐ์น โ GPU ์ฌ์ฉ๋ฅ ๊ทน๋ํ |
PagedAttention | ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ง ๋์ ์ผ๋ก ํ ๋นํด์ ์ฌ์ฉ โ ํฐ ๋ชจ๋ธ๋ ํจ์จ์ ์ผ๋ก ๋๋ฆผ |
Prefix Caching ์ง์ | RAG์ฒ๋ผ ๋์ผํ ๋งฅ๋ฝ์ ๋ฐ๋ณต ์ฌ์ฉํ๋ ์์ ์์ ์ฑ๋ฅ ๋ํญ ํฅ์ |
OpenAI API์ ๊ฑฐ์ ๋์ผํ ์ธํฐํ์ด์ค | chat/completions ์๋ํฌ์ธํธ ๊ทธ๋๋ก ์ง์ (GPT์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ) |
๋ค์ํ ๋ชจ๋ธ ์ง์ | LLaMA, Mistral, Falcon, Baichuan ๋ฑ Hugging Face ๋ชจ๋ธ ๋๋ถ๋ถ ํธํ |
๋น ๋ฅธ ์ถ๋ก ์๋ | GPU ํ ์ฅ์ผ๋ก๋ ์์ญ ๋ช ์ ๋์ ์ฌ์ฉ์ ์๋ต ๊ฐ๋ฅ |
๐ก ์ค์ ์ฌ์ฉ ์์
์ด์ http://localhost:8000/v1/chat/completions ์ผ๋ก OpenAI์ฒ๋ผ API ์์ฒญ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ ์ฑ๋ฅ ์์ (์ค์ ๋ฒค์น๋งํฌ)
์ถ๋ก ์๋ | ๋๋ฆผ (100ms/token ์ด์) | ๋น ๋ฆ (10~20ms/token) |
GPU ํ์ฉ๋ฅ | ๋ฎ์ (~30%) | ๋์ (70~90%) |
๋์ ์์ฒญ ์ฒ๋ฆฌ | ์ ํ์ | ์์ญ~์๋ฐฑ ๋์ ์์ฒญ ๊ฐ๋ฅ |
โจ vLLM ์ถ์ฒ ์ํฉ
- ๊ณ ์ฑ๋ฅ์ด ํ์ํ ์น ์๋น์ค ๊ธฐ๋ฐ ์ฑ๋ด ์ด์
- RAG ๊ธฐ๋ฐ ๋ฌธ์ ์ง์์๋ต ์์คํ
- GPU๊ฐ ์ ํ๋ ํ๊ฒฝ์์ ํจ์จ์ ์ผ๋ก ๋ชจ๋ธ์ ๋๋ ค์ผ ํ๋ ๊ฒฝ์ฐ
- OpenAI API์ฒ๋ผ chat/completion REST API ์๋ฒ๋ฅผ ์ง์ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ
๐ซ ์ฐธ๊ณ ๋ก ์ด๋ฐ ๊ฑด ์ง์ ์ ํด์ค๋๋ค
- **๋ชจ๋ธ ํ์ต(training)**์ ์ง์ํ์ง ์์ โ ์ถ๋ก (inference)๋ง!
- ์์ ํ AI ํ์ดํ๋ผ์ธ ํ๋ ์์ํฌ(X) โ ์ถ๋ก ์๋ฒ ์ ์ฉ(O)
โ vLLM์์ ํ์ธํ๋ ๋ชจ๋ธ์ ์๋นํ ์ ์๋ ์กฐ๊ฑด
vLLM์ ๊ธฐ๋ณธ์ ์ผ๋ก Hugging Face Transformers ํ์์ ๋ชจ๋ธ์ ์๋นํฉ๋๋ค.
ํ์ธํ๋ ํ์ vLLM์ผ๋ก ์๋นํ๋ ค๋ฉด ๋ค์ ์๊ฑด์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค:
1. โ ๋ชจ๋ธ ํฌ๋งท: transformers compatible (.bin, safetensors, gguf๋ X)
- vLLM์ transformers ํ์์ config.json, pytorch_model.bin ๋ฑ์ ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ํ์ธํ๋์ PEFT, LoRA, QLoRA ๋ฑ์ผ๋ก ํ๋ค๋ฉด โ ์ต์ข ๋ณํฉ(merge) ํ ์๋นํด์ผ ํฉ๋๋ค.
2. โ LoRA๋ฅผ ๋ณํฉํด์ผ ํจ (merge)
- vLLM์ ํ์ฌ LoRA adapter๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํด์ inferenceํ์ง ๋ชปํฉ๋๋ค.
- ์ฆ, LoRA๋ QLoRA๋ก ํ์ธํ๋ํ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ๋ฒ ์ด์ค ๋ชจ๋ธ๊ณผ ๋ณํฉํ ๋ชจ๋ธ์ export ํด์ผ ํฉ๋๋ค.
# ์์: peft + transformers ํ๊ฒฝ์์ ๋ณํฉ
from peft import PeftModel
from transformers import AutoModelForCausalLM
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
ft_model = PeftModel.from_pretrained(base_model, "./lora-checkpoint")
ft_model = ft_model.merge_and_unload()
ft_model.save_pretrained("./merged-model")
โ vLLM์ผ๋ก ํ์ธํ๋ ๋ชจ๋ธ ์คํํ๋ ๋ฐฉ๋ฒ
python3 -m vllm.entrypoints.openai.api_server \
--model ./merged-model \
--dtype float16 \
--gpu-memory-utilization 0.90 \
--max-model-len 4096
POST http://localhost:8000/v1/chat/completions
Authorization: Bearer ...
Content-Type: application/json
๐ ์์ฝ: ํ์ธํ๋ ๋ชจ๋ธ vLLM ์๋น ์ฒดํฌ๋ฆฌ์คํธ
๋ชจ๋ธ์ด Transformers ํธํ ํฌ๋งท์ธ๊ฐ? | HuggingFace ํ์ (config.json, tokenizer ํฌํจ) | โ ํ์ |
LoRA/QLoRA ์ฌ์ฉ ์ ๋ณํฉํ๋๊ฐ? | .merge_and_unload() ํ์ | โ ํ์ |
GPU ๋ฉ๋ชจ๋ฆฌ ์ต์ ํํ๋๊ฐ? | quantization or dtype ์ค์ | โ๏ธ ์ฑ๋ฅ ํฅ์ |
ํ ํฌ๋์ด์ ํฌํจํ๋๊ฐ? | tokenizer.json, vocab ํ์ผ ๋ฑ | โ ํ์ |
๐ณ ์ค์ : vLLM ๋์ปค ํ ํ๋ฆฟ + ECS ๋ฐฐํฌ ์์
๐ฆ Dockerfile ์์
FROM nvidia/cuda:12.1.1-runtime-ubuntu22.04
RUN apt update && apt install -y git python3 python3-pip
RUN pip install vllm transformers accelerate
# ๋ชจ๋ธ์ ์ฌ์ ์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ๋ณผ๋ฅจ ๋ง์ดํธ ํ์
COPY ./merged-model /models/merged-model
CMD ["python3", "-m", "vllm.entrypoints.openai.api_server", "--model", "/models/merged-model"]
๐ณ Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ๋ก์ปฌ ์คํ
docker build -t my-vllm-image .
docker run --gpus all -p 8000:8000 my-vllm-image
โ๏ธ AWS ECS (Fargate GPU) ๋ฐฐํฌ ์์ฝ
- ECR์ Docker ์ด๋ฏธ์ง ํธ์
- ECS ํด๋ฌ์คํฐ ์์ฑ (GPU ์ธ์คํด์ค ํฌํจ)
- Task Definition ์์ฑ (GPU ์ค์ + ํฌํธ 8000)
- ์๋น์ค ์์ฑ + Load Balancer ์ฐ๊ฒฐ
- ๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฐ HTTPS ์ ์ฉ (Route53 + ACM)
โ ์๋ฃ ํ์๋
http://{your-domain}/v1/chat/completions
ํํ๋ก OpenAI API ํธํ ๊ฐ๋ฅ
๐งฉ ๋ถ๋ก: ์ค๋ฌด ์ ์ฉ์ ์ํ ํดํท
๋ชฉ์ | ๋๊ตฌ |
---|---|
์๋น ์์ง | vLLM , Text Generation Inference , TGI |
๋ก๋ฉ/ํ๋กฌํํธ ๋๊ตฌ | LangChain , LLM Client , Outlines , LMFE |
๋ฒกํฐ DB | Weaviate , Qdrant , FAISS , Pinecone |
๋ชจ๋ธ ์ ์ฅ์ | Hugging Face , Open LLM Leaderboard , Civitai |
โ ์์ฝ: ์ ํ ํธ์คํ ์ค์ ์ ๋ต 6๊ฐ์ง
- ๋ฐฐํฌ ๊ฒฝ๊ณ๋ฅผ ํ์ ํ๊ณ ์ญ์ค๊ณํ๋ผ
- ์์ํ ๋ชจ๋ธ์ ์ ๊ทน ํ์ฉํ๋ผ
- ๋ฐฐ์น ์ ๋ต์ ์ ๊ตํ๊ฒ ๊ตฌ์ฑํ๋ผ
- ์ํฌ๋ก๋ ๊ธฐ๋ฐ ์บ์ฑ ๊ธฐ์ ์ ํ์ฉํ๋ผ
- ๋ชจ๋ธ์ ์๊ณ ํจ์จ์ ์ผ๋ก ์ ํํ๋ผ
- ์กฐ์ง ์ธํ๋ผ๋ฅผ ํตํฉํ๊ณ ์ค์ API๋ฅผ ์ ๊ณตํ๋ผ
์ด ๊ฐ์ด๋๋ ์ค๋ฌด ์ ์ฉ์ ์ํ ์ถ๋ฐ์ ์ ๋๋ค. ํ๊ฒฝ์ ๋ง๊ฒ ์กฐ์ ํ๊ณ , ์ค์ ํ๋ก์ ํธ์ ์ต์ ํ๋ ๊ตฌ์ฑ์ ์คํํด๋ณด์ธ์. ํ์์ ๋์ปค ๋ฐฐํฌ ์์, API ์๋ฒ ๊ตฌ์ฑ ์์๋ ์ ๊ณต ๊ฐ๋ฅํฉ๋๋ค.
'AWS Cloud' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AWS ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฉ (0) | 2024.12.10 |
---|---|
AWS Lambda Scheduler serverless.yml (0) | 2020.04.08 |
AWS Parameter Store ์ Serverless Framework (0) | 2020.04.08 |
Serverless Setting (0) | 2020.04.08 |