vllm 공부

모와이·2026년 3월 29일

llm

목록 보기
20/20

vLLM 개념 및 프로젝트 적용 방안

1. vLLM이란

vLLM은 대규모 언어모델(LLM)을 빠르고 효율적으로 서비스 형태로 실행하기 위한 추론·서빙 엔진이다. 단순히 모델 파일을 실행하는 도구가 아니라, 여러 사용자의 요청을 받아 안정적으로 처리할 수 있도록 설계된 LLM 서버 프레임워크에 가깝다. 공식 문서에 따르면 vLLM은 OpenAI의 Completions API, Chat API 등을 구현한 OpenAI-Compatible Server를 제공하며, 이를 통해 HTTP 기반으로 모델을 서빙할 수 있다.

즉, vLLM은 새로운 AI 모델 자체가 아니라, 오픈소스 LLM을 실제 서비스 환경에 쉽게 연결하고 운영할 수 있도록 해 주는 실행 엔진이다. Llama, Qwen 등 지원되는 오픈소스 모델을 선택해 vLLM 위에서 구동하면, 웹 서비스나 앱에서 API 형태로 호출할 수 있다. vLLM은 공식 문서에서 지원 가능한 모델 아키텍처와 예시 모델 목록을 별도로 제공한다.

2. vLLM이 필요한 이유

LLM을 서비스에 붙일 때는 단순히 “모델이 답변을 생성한다”로 끝나지 않는다. 실제 서비스 환경에서는 여러 사용자가 동시에 요청할 수 있고, 대화가 길어질수록 이전 문맥도 함께 처리해야 하며, 시스템 프롬프트나 사용자 프로필 같은 공통 입력이 반복적으로 사용된다. 이때 병목이 되는 요소 중 하나가 KV cache 메모리 관리와 반복되는 프롬프트 계산 비용이다. PagedAttention 논문은 기존 시스템이 KV cache를 비효율적으로 관리해 단편화와 중복 저장이 발생하고, 이로 인해 배치 크기와 처리량이 제한된다고 설명한다.

vLLM은 이러한 환경에서 LLM 추론 속도와 처리 효율을 높이는 데 초점을 둔다. 논문에서는 PagedAttention 기반 메모리 관리와 KV cache 공유를 통해 KV cache 메모리 낭비를 거의 0에 가깝게 줄이고, 기존 고성능 서빙 시스템 대비 동일한 지연 수준에서 2~4배 수준의 처리량 향상을 보였다고 보고한다. 이 효과는 특히 더 긴 시퀀스, 더 큰 모델, 더 복잡한 디코딩 알고리즘에서 두드러졌다.

3. vLLM의 주요 개념

3-1. KV cache

KV cache는 LLM 추론 시 이전 토큰에서 계산된 Key와 Value 텐서를 GPU 메모리에 저장해 두고, 이후 토큰 생성 때 재사용하는 메커니즘이다. 이를 통해 이미 읽은 문맥을 다시 처음부터 계산하지 않아도 되므로, 디코딩 속도를 높일 수 있다. PagedAttention 논문은 KV cache가 온라인 LLM 서빙에서 매우 큰 메모리 비중을 차지하며, 이를 어떻게 관리하느냐가 전체 처리량에 큰 영향을 준다고 설명한다.

3-2. Prefix

Prefix는 여러 요청에서 공통적으로 반복되는 입력 프롬프트의 앞부분을 의미한다. 예를 들어 시스템 프롬프트, 사용자 프로필, 대화 이력, 긴 참고 문서 등은 여러 요청에서 반복될 수 있으며, 이러한 공통 앞부분이 바로 prefix다. 현재 vLLM 문서는 prefix caching을 “같은 prefix를 가진 새 요청이 들어오면, 기존 요청의 KV cache block을 재사용하는 방식”으로 설명한다.

3-3. OpenAI-Compatible Server

vLLM은 OpenAI API와 유사한 형식으로 요청을 받을 수 있는 OpenAI-Compatible Server를 제공한다. 이는 실제 OpenAI 서버가 아니라, OpenAI의 Completions API, Chat API와 비슷한 규칙으로 호출 가능한 내가 직접 운영하는 LLM 서버라고 이해하면 된다. 따라서 백엔드에서는 OpenAI를 호출하듯이 요청을 보내되, 실제로는 vLLM 서버 위에서 실행 중인 오픈소스 모델이 응답하게 된다. 공식 문서는 vllm serve 명령으로 서버를 띄우고, HTTP 클라이언트 또는 OpenAI Python client로 호출할 수 있다고 안내한다.

이때 중요한 점은, 직접 서버를 운영하면 OpenAI처럼 토큰 사용량 기반 외부 API 비용은 없지만, 대신 GPU 서버 비용과 운영 비용은 필요하다는 점이다. 즉, 비용이 “없어지는 것”이 아니라 과금 구조가 외부 API 사용료에서 인프라 운영비로 바뀌는 것에 가깝다. 이는 공식 문서가 직접 비용을 비교하는 것은 아니지만, vLLM이 자체 HTTP 서버로 모델을 서빙하는 구조라는 점에서 자연스럽게 도출되는 해석이다.

4. Automatic Prefix Caching(APC)

Automatic Prefix Caching(APC)은 vLLM의 대표 최적화 기능 중 하나로, 기존 요청의 KV cache를 저장해 두었다가, 이후 요청이 같은 prefix를 가지면 해당 부분을 재사용하는 방식이다. 공식 문서는 APC를 “새 요청이 기존 요청과 같은 prefix를 공유하면 shared part 계산을 건너뛸 수 있게 하는 기능”이라고 설명한다.

쉽게 말하면, 앞부분이 똑같은 요청은 그 앞부분을 다시 계산하지 않고, 이미 계산해 둔 결과를 재사용해 더 빠르게 처리하는 기능이다.

예를 들어 다음과 같은 공통 문맥이 있다고 하자.

시스템 프롬프트: “너는 반려견 훈련사 챗봇이다.”
사용자 정보: “5살 말티즈, 최근 분리불안 의심”
이전 대화 기록: “소파에 실수해요 / 산책은 하루 2번 해요 …”

이 상태에서 사용자가
“왜 이러는 거예요?”
“훈련 방법도 알려줘요.”
“병원도 가봐야 하나요?”
처럼 계속 질문하면, 매 요청마다 긴 공통 앞부분이 반복된다. APC가 없으면 모델은 이 공통 부분을 매번 처음부터 다시 읽고 계산해야 하지만, APC가 있으면 앞부분은 한 번 계산한 뒤 재사용하고, 달라진 뒷부분만 이어서 계산하면 된다.

APC가 특히 효과적인 경우

첫째, 긴 문서를 여러 번 질의하는 경우다. 같은 훈련 매뉴얼이나 반려동물 건강 가이드 문서를 바탕으로 반복 질문할 때, 긴 문서 부분을 매번 다시 계산하지 않아도 된다. 둘째, 멀티턴 대화다. 같은 채팅 세션에서 이전 대화 기록이 계속 누적될 때, 그 대화 이력을 매 요청마다 처음부터 다시 처리하지 않고 재사용할 수 있다. vLLM 공식 문서는 이 두 경우를 대표 사례로 든다.

APC의 한계

APC는 주로 입력 처리(prefill) 시간을 줄여주는 기능이다. 반면 실제로 새 답변을 한 토큰씩 생성하는 decoding 시간 자체를 줄여주는 것은 아니다. 따라서 답변 생성이 매우 길거나, 요청 간 prefix가 거의 겹치지 않는 경우에는 효과가 작을 수 있다. 이 점은 vLLM 공식 문서에 명시돼 있다.

5. PagedAttention

PagedAttention은 vLLM의 핵심 최적화 기법으로, 각 요청의 KV cache를 고정 크기 블록으로 나누어 관리하는 방식이다. PagedAttention 논문은 기존 서빙 시스템이 KV cache를 연속 메모리로 관리하면서 단편화와 중복 저장 문제를 겪고, 이로 인해 GPU 메모리 활용률이 떨어진다고 지적한다. 이를 해결하기 위해 운영체제의 가상 메모리와 paging에서 영감을 받아, KV cache를 block 단위로 관리하는 PagedAttention을 제안했다.

기존 방식과의 차이

기존 방식에서는 한 요청의 KV cache를 큰 연속 메모리 덩어리처럼 다루는 경우가 많다. 이 경우 실제 사용량보다 크게 공간을 잡아 두면 자투리 공간이 생기고, 그 빈 공간을 다른 요청이 효율적으로 활용하기 어렵다. 반면 PagedAttention은 한 요청의 KV cache를 여러 개의 고정 크기 블록으로 나누고, 블록이 꽉 찼을 때만 다음 블록을 할당한다. 따라서 한 요청이 낭비할 수 있는 메모리는 최대 마지막 블록의 남는 부분 정도로 줄어든다. 논문은 이를 near-zero waste in KV cache memory라고 표현한다.

내부 동작 원리

PagedAttention에서는 각 KV cache 블록이 고정된 개수의 토큰에 대한 key/value를 담는다. 그리고 시퀀스는 논리적으로 0번 블록, 1번 블록, 2번 블록처럼 이어져 있지만, 실제 GPU 물리 메모리에서는 이 블록들이 연속되지 않은 위치에 흩어져 저장될 수 있다. 즉, 논리 블록과 물리 블록을 분리해 관리하는 구조다. 이 덕분에 메모리 단편화를 줄이고 GPU 메모리를 더 효율적으로 사용할 수 있다. 논문과 vLLM 설계 문서는 모두 이 점을 핵심 아이디어로 설명한다.

또한 vLLM은 이 paged KV cache 구조를 실제 attention 계산에서 읽을 수 있도록 맞춘 attention 커널을 사용한다. 공식 “Paged Attention” 설계 문서는 이 페이지가 역사적 문서라는 점을 알리면서도, 현재 코드가 여전히 paged KV cache에 맞춘 attention 커널 구조를 사용한다고 설명한다.

장점

PagedAttention의 장점은 첫째, 메모리 단편화 감소와 메모리 낭비 최소화다. 둘째, 같은 prefix를 여러 시퀀스가 물리적으로 공유할 수 있다는 점이다. 셋째, 공유하던 블록이 분기되는 시점에만 새 블록을 복사하는 copy-on-write가 가능하다는 점이다. 논문은 이 구조가 parallel sampling과 beam search 같은 상황에서도 KV cache 중복 저장을 줄여 준다고 설명한다.

6. Prefix 관련 동작(APC / Prefix Caching)의 논문적 배경

Prefix caching의 뿌리는 PagedAttention 논문에서 설명한 shared prompt와 KV cache 공유 구조에 있다. 논문은 여러 시퀀스가 동일한 프롬프트를 공유할 수 있도록, prefix 부분의 KV cache를 여러 요청이 함께 참조하게 하고, 이를 위해 reference count와 copy-on-write를 사용한다고 설명한다. 특히 parallel sampling이나 beam search처럼 하나의 프롬프트에서 여러 출력 후보를 동시에 생성하는 경우, 프롬프트 부분 KV cache를 공유하는 것이 매우 중요하다고 말한다.

현재 vLLM은 이 아이디어를 일반화해, 각 KV cache block을 prefix tokens + block tokens에 기반한 해시로 식별하고, 이를 global hash table에서 관리하는 구조를 사용한다. 이렇게 하면 같은 prefix를 가진 block은 같은 physical block을 재사용할 수 있다. vLLM 설계 문서는 이 구조를 기반으로 prefix caching을 구현한다고 설명한다.

즉, prefix caching의 본질은 같은 앞부분의 KV cache를 여러 요청이 공유하고, 필요한 순간에만 copy-on-write로 분기하는 구조라고 볼 수 있다. 이것이 현재 APC 기능의 이론적 배경이다.

7. vLLM 사용 방식

vLLM은 보통 서버 형태로 실행한 뒤, 백엔드에서 HTTP API로 호출하는 방식으로 사용한다. 공식 문서는 vllm serve 명령으로 모델 서버를 실행할 수 있고, 이후 HTTP 클라이언트나 OpenAI Python client를 사용해 base_url을 vLLM 서버 주소로 지정하면 Chat Completions API처럼 호출할 수 있다고 설명한다.

실제 사용 흐름은 다음과 같이 정리할 수 있다.

프론트엔드 → 백엔드(FastAPI 등) → vLLM 서버 → 오픈소스 LLM → 응답 반환

검색 기능이 필요한 경우에는 다음처럼 확장된다.

프론트엔드 → 백엔드 → 벡터 DB 검색 / 사용자 데이터 조회 → 프롬프트 조합 → vLLM 서버 → 응답 반환

즉, 백엔드는 문맥을 준비하고, vLLM은 최종 자연어 생성을 담당하는 구조라고 정리할 수 있다.

8. 우리 프로젝트에서 vLLM이 맡아야 하는 역할

우리 프로젝트는 반려견 중심 서비스로, 핵심 기능이 단순 정보 조회가 아니라 사용자 감정, 반려견 상태, 일기 내용, 행동 로그, 추천 데이터를 종합하여 자연스럽게 설명해 주는 데 있다. 따라서 vLLM은 전체 AI를 전부 담당하는 도구가 아니라, 자연어 생성 허브로 두는 것이 적절하다.

vLLM이 잘하는 일은 기본적으로 텍스트를 이해하고 텍스트를 생성하는 일이다. 따라서 다음과 같은 작업에 적합하다.

챗봇 답변 생성
일기 요약
감정이 반영된 문장 생성
추천 이유 설명
행동 로그를 자연스러운 문장으로 정리
카테고리 및 태그 추천

즉, 여러 데이터가 들어와도 마지막에 사람이 읽을 수 있는 문장으로 바꾸는 중심 역할을 하는 것이다.

반대로 vLLM이 직접 맡기에는 적합하지 않은 기능도 있다. 예를 들어 사진을 보고 강아지 품종을 분류하는 일, CCTV 영상에서 행동을 감지하는 일, 관절 자세를 분석하는 일, GPS 경로를 계산하는 일, 실제 병원·약국·용품 정보를 검색하는 일, 음성 인식 자체는 각각 컴퓨터 비전, 검색 시스템, STT/TTS 등의 다른 기술이 더 적합하다. 공식 문서가 vLLM을 LLM 추론 및 서빙 엔진으로 설명하고 있다는 점에서도, 이런 역할 분리가 자연스럽다.

9. vLLM 학습 로드맵

9-1. LLM 기초

먼저 LLM의 기본 동작 원리를 이해해야 한다. 핵심 개념은 다음과 같다.

토큰: 모델이 글을 읽는 최소 단위
Transformer: 입력 전체의 문맥 관계를 반영해 다음 토큰을 예측하는 모델 구조
Attention: 현재 토큰을 생성할 때 앞 문맥 중 무엇을 참고할지 결정하는 메커니즘
KV cache: 이미 읽은 문맥의 계산 결과를 저장해 두는 메모리
Prefill: 입력 전체를 먼저 읽는 단계
Decode: 답변을 새로 한 토큰씩 생성하는 단계

핵심은 입력을 읽고(prefill), 답을 생성한다(decode) 는 전체 흐름을 이해하는 것이다. APC는 이 중 prefill 비용을 줄여 주는 기능이다.

9-2. PagedAttention

그다음으로 vLLM의 핵심 최적화인 PagedAttention을 이해해야 한다. 왜 KV cache 메모리 관리가 중요한지, 왜 단편화와 중복 저장이 문제인지, 왜 블록 단위 관리가 처리량 향상으로 이어지는지를 논문을 통해 확인하는 것이 중요하다.

9-3. Prefix Caching / APC

그다음은 prefix caching이다. 같은 앞문장이 반복되는 환경에서 어떻게 KV cache를 재사용하는지, 왜 멀티턴 대화와 긴 문서 질의에서 효과적인지, 그리고 왜 decoding 시간 자체는 줄이지 않는지를 이해해야 한다.

9-4. OpenAI-Compatible Server와 실제 서빙 구조

마지막으로 vLLM을 실제 서비스에 어떻게 붙이는지 이해해야 한다. vllm serve로 서버를 띄우고, OpenAI API 형식으로 호출하는 구조를 익히면 프로젝트 연동 관점에서 훨씬 구체적으로 설명할 수 있다.

10. 결론

vLLM은 우리 프로젝트에서 오픈소스 LLM을 실제 서비스 형태로 안정적으로 서빙하기 위한 핵심 엔진이다. PagedAttention을 통해 KV cache 메모리를 효율적으로 관리하고, APC를 통해 반복되는 prefix 계산을 줄이며, OpenAI-Compatible Server를 통해 백엔드와 쉽게 연동할 수 있다. 따라서 우리 프로젝트에서는 vLLM을 챗봇 응답, 일기 요약, 감정 반영 문장 생성, 행동 로그 설명, 추천 사유 생성 등 자연어 생성 중심 역할에 배치하는 것이 가장 적절하다.

profile
공부하는거 정리하는 블로그

0개의 댓글