무거운 모델들을 어떻게 렉 없이 초고속으로 굴릴 것인가에 대해 알아봅시다
로컬에서 오픈소스 LLM을 서비스하려고 할 때 무조건 짚고 넘어가야 하는 핵심 엔진, 바로 vLLM
1. Continuous Batching (쉬지 않고 일함 노동...ㅋ)
- 정의: 앞사람의 질문이 끝날 때까지 기다리지 않고, 빈자리가 생기면 실시간으로 다음 사람의 토큰을 끼워 넣어서 처리하는 기법임.
- 원리: 기존에는 3명이 질문하면 제일 긴 답변이 끝날 때까지 다 같이 기다려야 했음(Static Batching). 근데 Continuous Batching은 짧은 답변이 먼저 끝나면 바로 그 자리에 4번째 사람의 질문을 밀어 넣음. GPU가 1초도 쉬지 않게 풀가동 돌려버리는 거임 !
2. PagedAttention (ㄹㅇ 진짜 핵심! vLLM의 존재 이유)
vLLM에서 'v'가 Virtual(가상)의 약자임 !!!! 이게 바로 컴퓨터 운영체제의 가상 메모리(Virtual Memory) 개념을 LLM에 끌고 온 거임!
- 기존의 문제점: AI가 대화의 문맥을 기억하려고 메모리(KV Cache)를 엄청 쓰는데, 원래는 이걸 '이만큼 쓰겠지?' 하고 무식하게 통째로 미리 잡아뒀음. 그래서 빈 공간이 펑펑 낭비되고, 유저 몇 명만 들어와도 GPU 메모리가 꽉 차서 뻗어버림 (OOM 에러 발생).
- 해결 원리: 통째로 잡지 말고, 메모리를 '페이지(Page)'라는 아주 작은 블록으로 잘게 쪼개서 관리함. 필요할 때마다 블록을 딱딱 할당해주니까 낭비되는 메모리가 거의 제로에 수렴함. 덕분에 똑같은 GPU 사양으로 훨씬 더 많은 사람의 요청을 동시에 버틸 수 있게 됨 !
3. KV Cache Reuse (캐시 재사용)
- 정의: 공통적으로 들어가는 시스템 프롬프트(예: "너는 친절한 회사 CS 비서야")를 매번 새로 계산하지 않고, 한 번 계산해둔 걸 기억했다가 복붙해서 쓰는 거임.
- 효과: 사용자가 질문을 던졌을 때 AI가 첫 글자를 뱉어내는 속도(TTFT)가 미친 듯이 빨라짐. 굳이 했던 연산 또 안 하니까 돈도 굳고 시간도 굳음!
KV Cache Reuse는 최적화할때 많이 사용한다고 들었음.
코드로 보는 vLLM 세팅 !
vLLM 구동 및 최적화 예시 코드
from vllm import LLM, SamplingParams
# 모델 이름만 넣어주면 Continuous Batching이랑 PagedAttention은 알아서 가동댐
llm = LLM(
model="meta-llama/Llama-3-8b-Instruct",
)
#샘플링파라미터들은 아래 링크 참고하기 !
sampling_params = SamplingParams(temperature=0.7, top_p=0.95)
prompts = [
"ㅎㅇ? 넌 누구야?",
"회사 서버에 AI 구축할 때 주의할 점 3가지만 알려달라."
]
# 한 방에 여러 개 던져도 PagedAttention 덕에 괜찮음
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"질문: {prompt}\n답변: {generated_text}\n---")
* vLLM SamplingParams 링크
https://docs.vllm.ai/en/latest/api/vllm/sampling_params/
대체로 코딩용은 이런식으로 작성
SamplingParams(
temperature=0.1,
top_p=0.9,
repetition_penalty=1.05,
max_tokens=2048
)
대체로 챗봇용은 이런식으로 작성
SamplingParams(
temperature=0.7,
top_p=0.95,
max_tokens=1024
)
사내 데이터를 다뤄야 해서 API 연동은 안 되고 로컬 모델을 돌려야 할 때, 혹은 비싼 클라우드 GPU 비용을 어떻게든 뽕뽑아야 할 때 vLLM은 선택이 아니라 필수라고 생각함
그냥 순정으로 모델 다운받아서 쓰는 거랑은 차원이 다른 엔터프라이즈급 처리량을 보여주니까, 기업용 AI 아키텍처를 설계한다면 무조건 도입하는 해야되지 않을까 라는 생각이 듬 !!
아무튼 vLLM의 핵심 기술들에 대해 알아보았음 !
