[LLM 컨셉] Serving: 1초라도 더 빠르게 답변하는 인프라의 기술
**서빙(Serving)**은 학습된 모델을 서버에 올리고, 사용자의 요청(Request)을 받아 결과(Response)를 돌려주는 과정입니다. LLM 서빙은 일반적인 웹 서비스와 달리 메모리 소모가 극심하고 연산량이 방대하기 때문에, 이를 효율적으로 관리하는 전용 엔진이 필수적입니다.
1. 서빙의 핵심 성능 지표 (KPI)
고속 서빙을 평가할 때 가장 중요하게 보는 세 가지 지표입니다.
- TTFT (Time To First Token): 사용자가 질문한 뒤 첫 번째 글자가 보일 때까지의 시간. (사용자가 체감하는 대기 시간)
- TPOT (Time Per Output Token): 첫 글자 이후 다음 글자들이 생성되는 속도. (읽기 편한 속도인지 결정)
- Throughput (처리량): 서버 한 대가 초당 총 몇 명의 요청이나 몇 개의 토큰을 처리할 수 있는가? (비용 효율성 결정)
2. 고속 서빙을 위한 3대 핵심 기술
최신 서빙 프레임워크(vLLM, TGI 등)들이 성능을 수십 배 높인 비결입니다.
① PagedAttention (메모리의 혁명)
운영체제의 가상 메모리 관리 방식에서 아이디어를 얻은 기술입니다.
- 문제: 모델은 답변 시 이전 대화 내용(KV Cache)을 메모리에 저장하는데, 이 크기가 들쭉날쭉해서 메모리 낭비가 심했습니다.
- 해결: KV 캐시를 작은 '블록' 단위로 쪼개어 관리함으로써 메모리 낭비를 거의 0%로 줄였습니다. 덕분에 더 많은 사용자가 동시에 접속해도 버틸 수 있습니다.
② Continuous Batching (쉼 없는 연산)
- 기존 방식: 한 그룹의 질문들이 다 끝날 때까지 새로운 질문을 받지 못했습니다.
- 해결: 답변이 끝난 자리에 즉시 새로운 질문을 끼워 넣어 GPU가 1초도 쉬지 않고 연산하게 만듭니다.
③ Speculative Decoding (추측 기반 디코딩)
- 큰 모델(70B)이 직접 모든 단어를 생각하는 대신, 아주 작고 빠른 모델(1B)이 "아마 다음 단어는 이거일 거야"라고 미리 추측하게 합니다. 큰 모델은 그게 맞는지 확인만 함으로써 생성 속도를 2~3배 높입니다.
3. 대표적인 서빙 프레임워크 비교
| 프레임워크 | 개발사 | 주요 특징 |
| vLLM | UC 버클리 | PagedAttention의 원조. 가장 높은 처리량과 범용성을 가짐. |
| TGI | Hugging Face | 프로덕션 환경에 최적화. Rust 기반의 안정성과 보안성이 뛰어남. |
| TensorRT-LLM | NVIDIA | 엔비디아 GPU에 극한으로 최적화됨. 가장 낮은 지연 시간(Latency) 제공. |
| Ollama | 오픈소스 | 개인 PC나 로컬 환경에서 모델을 서빙하기에 가장 간편함. |
4. [선생님의 심화 보충] Prefill vs Decoding
서빙 시스템 내부에서는 두 단계가 서로 다르게 작동합니다.
- Prefill (프리필): 사용자의 긴 질문을 한 번에 읽는 단계. (연산 집약적)
- Decoding (디코딩): 답변을 한 글자씩 생성하는 단계. (메모리 대역폭 집약적)
- 최근에는 이 두 단계를 서로 다른 서버에서 처리하는 'Disaggregated Serving' 기술이 등장하여 효율성을 극대화하고 있습니다.
✍️ 공부를 마치며
고속 추론 서빙은 AI 기술이 '연구실'을 넘어 '비즈니스'가 되게 하는 핵심입니다. 0.1초의 속도 차이가 수억 원의 서버 비용을 결정하기도 하니까요. 이제 우리는 모델을 빠르고 안정적으로 배포할 준비가 되었습니다.
MCP: **LLM(예: ChatGPT, Claude 등)**이 외부 도구·데이터·프롬프트에 표준 방식으로 붙도록 해 주는 “USB-C 같은 규격
sudo apt update
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh--레파지토리 주소 설정
sudo apt install postgresql-17-vector
sudo apt-get install libpq-dev python3-dev
pip install langchain_postgres
pip install psycopg2
- 서비스 재가동
sudo service postgresql restart
psql -U play -h localhost -p 5432
create extension if not exists vector;
import os
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_postgres import PGVector
from langchain.prompts import PromptTemplate
connection_string = "postgresql+psycopg2://play:123@localhost:5432/play"
collection_name = 'skn15'
from langchain_openai import OpenAIEmbeddings
embedding = OpenAIEmbeddings()
vectorstore = PGVector(
embeddings=embedding,
collection_name=collection_name,
connection=connection_string,
use_jsonb=True)
documents = [
Document(page_content="RAG는 Retrieval-Augmented Generation의 약자입니다."),
Document(page_content="pgvector는 PostgreSQL에서 벡터 검색을 지원하는 확장 기능입니다."),
Document(page_content="LangChain은 LLM을 활용한 애플리케이션 개발을 돕는 프레임워크입니다."),
Document(page_content="한국의 수도는 서울입니다."),
]
vectorstore.add_documents(documents)
retriever = vectorstore.as_retriever(search_kwargs={'k': 2})
query = "RAG가 뭐야?"
retrieved_docs = retriever.invoke(query)
for doc in retrieved_docs:
print(f"내용: {doc.page_content}")
print("-" * 25)
uv
'AI > LLM' 카테고리의 다른 글
| [Guardrails] 안전한 AI 설계 (0) | 2025.08.14 |
|---|---|
| [Evaluation] 모델의 성적표 (0) | 2025.08.13 |
| [Quantization] 모델 경량화 (0) | 2025.08.11 |
| [MCP] LLM의 만능 커넥터 (0) | 2025.08.08 |
| [Agent] 자율적인 AI 에이전트 (1) | 2025.08.07 |