실행 프로그램과 확장

최종 업데이트

vLLM 로컬 서버 설정: 작은 모델부터 0.30 적응형 검증까지

vLLM으로 로컬 LLM 서버를 열고 여러 요청을 처리하는 방법

vLLM은 모델을 메모리에 올려 두고 API1로 들어온 질문에 답변을 생성하는 LLM2 서버 프로그램이에요. 여러 요청을 함께 처리하고 대화 문맥을 캐시에 저장해 GPU3를 활용해요. 작은 모델로 서버 연결을 확인한 뒤 사용할 모델과 동시 요청 수를 맞추고, 0.30.0의 DFlash·DSpark 가속과 적응형 검증을 시험할 수 있어요.

코딩 도우미를 혼자 쓴다면 첫 토큰4 대기와 답변 완료 시간이 중요하고, 여러 사용자를 받는 서버라면 처리량5도 봐야 해요. vLLM의 continuous batching은 요청을 묶어 GPU를 활용하지만 서버 처리량이 개인 요청의 응답 시간과 같지는 않아요.

실행 조건과 핵심 내용
  • vLLM 0.30.0은 DFlash·DSpark speculative 경로와 adaptive verification 변경을 포함해요.
  • 공식 예제는 DeepSeek-V4-Flash-DSpark와 CUDA graph·지원 backend가 필요해요.
  • 요청 수를 바꾸며 TTFT·토큰 간 지연·처리량·메모리·수락률을 나눠 기록해요.

개인 응답과 서버 처리량은 다른 지표예요

여러 사람이 동시에 질문하면 vLLM은 진행 중인 요청을 묶어 GPU에서 계산해요. 이 방식을 continuous batching이라고 해요. 서버 전체가 1초에 생성한 토큰을 합산하면 처리량을 알 수 있고, 내 질문 한 건의 첫 토큰과 완료 시간을 재면 개인이 느끼는 응답 속도를 알 수 있어요.

동시 사용자가 늘면 전체 완료량이 증가해도 한 요청은 큐에서 기다릴 수 있고 각 요청의 KV cache6도 메모리를 써요. 동시 부하 결과를 개인 사용의 반응 속도로 옮겨 읽지 않아요.

코드 편집 요청 한 건의 대기와 여러 요청 처리량을 비교하는 개념 장면
한 요청의 응답 속도와 동시 처리량은 다른 지표예요.

CUDA 서버의 기본 연결부터 검증해요

이 연결 예제는 Linux의 호환 NVIDIA CUDA7 환경을 전제로 해요. 별도 가상환경8이나 장비용 컨테이너를 쓰고 PyTorch9·CUDA·드라이버 조합을 기록해요. DGX Spark는 ARM64·Blackwell 지원 빌드가 필요하고 x86 이미지를 그대로 쓰지 않아요. Mac의 CPU/MLX와 커뮤니티 vllm-metal은 CUDA 서버와 별도 경로예요.

처음에는 Qwen2.5-1.5B-Instruct로 모델 적재와 응답을 확인해요. 4096 문맥과 동시 요청 하나는 연결 점검값이지 최신 모델 권장치나 최고 속도 설정은 아니에요. 첫 다운로드와 준비 시간은 요청 생성 속도와 분리해요.

첫 명령으로 서버가 모델을 올리고 준비됐다는 메시지를 내면 다른 터미널에서 curl 요청을 실행해요. 정상 답변이 돌아오면 편집기나 채팅 앱의 OpenAI 호환 서버 주소를 http://127.0.0.1:8000/v1로 지정해요. 두 명령의 모델 ID와 포트가 같아야 같은 서버로 연결돼요.

CUDA 환경의 연결 확인용 서버
vllm serve Qwen/Qwen2.5-1.5B-Instruct \
  --host 127.0.0.1 --port 8000 \
  --max-model-len 4096 --max-num-seqs 1
vLLM 설치 후 실행해요. Spark는 ARM64·Blackwell 빌드를 준비해요.
다른 터미널에서 짧은 질문 보내기
curl --fail-with-body http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-1.5B-Instruct","messages":[{"role":"user","content":"Explain what a local AI server does in two sentences."}],"max_tokens":64,"temperature":0}'
연결 확인용 요청이에요. 한 번의 응답은 벤치마크가 아니에요.
작은 서버에서 모델 연결을 확인한 뒤 설정을 늘리는 개념 장면
작은 모델로 연결을 확인한 뒤 모델과 조건을 늘려요.

모델과 메모리 조건을 먼저 맞춰요

실제 모델을 고르면 파일명·revision·정밀도·문맥 길이를 기록해요. NVFP410와 GGUF11 Q4는 모두 4비트라도 서로 바꾸어 쓸 설정이 아니며 GPU 세대·모델 구조·런타임12의 지원이 필요해요. 가중치 외에도 입력 KV cache와 계산 여유 공간이 필요해요.

--max-model-len은 입력과 출력의 전체 문맥 상한이고 --max-num-seqs 1로 요청 하나부터 확인해요. --gpu-memory-utilization을 높이면 KV cache 등에 더 많은 공간을 배정할 수 있지만 OS나 다른 프로세스의 여유가 줄어요. 오류가 나면 문맥과 동시 요청을 한 번에 하나씩 낮춰 원인을 찾아요.

요청이 많아지면 합산 처리량은 늘 수 있지만 한 사람의 완료 시간은 길어질 수 있어요. 개인 코딩 보조에서는 처리량보다 첫 토큰부터 코드가 끝날 때까지를 기록해요.

vLLM 0.30.0의 적응형 검증 지원 조건을 확인해요

컨테이너나 가상환경에서 vLLM 0.30.0을 고정하고 vllm --version으로 확인해요. DeepSeek-V4-Flash-DSpark와 tokenizer가 장치·attention13 backend에서 지원되는지 봐요. 공식 예제의 deepseek_v4 tokenizer와 --trust-remote-code는 모델 제공 코드를 실행할 수 있으므로 출처와 실행 환경을 검토해요.

adaptive verification은 CUDA graph로 단계 비용을 측정해요. full cudagraph가 필요한 구성에서 --enforce-eager를 함께 쓰면 거부될 수 있고, 공식 문서는 LoRA14와 pipeline parallelism15 제한도 안내해요. 모델·KV cache가 함께 들어갈 메모리, backend와 graph capture를 먼저 확인해요.

기본 모델 연결을 확인한 뒤 DeepSeek-V4-Flash target과 DSpark draft를 준비해요. 예제의 speculative token 수 7과 probabilistic sampling은 해당 문서 설정이지 다른 draft의 권장 깊이가 아니에요. target·draft가 실제로 선택됐는지 로그와 수락 통계도 확인해요.

이 절의 서버 예제는 모두 8000 포트를 사용해요. 앞의 작은 모델 서버를 Ctrl+C로 종료한 뒤 DeepSeek 서버를 시작하고, 요청 확인은 다른 터미널에서 해요. DSpark 설정으로 바꿀 때도 기존 서버를 먼저 종료하세요. 같은 GPU에서 이전 프로세스가 메모리를 유지하고 있다면 종료 상태를 확인한 뒤 다음 서버를 실행해요.

DSpark 배포본은 DeepSeek-V4-Flash 가중치에 추측 디코딩16 모듈을 붙인 체크포인트17예요. 아래 DSpark 명령은 서버 모델과 초안 설정에 모두 deepseek-ai/DeepSeek-V4-Flash-DSpark를 지정해요. 서버를 바꾼 뒤에는 /v1/models에서 이 ID를 확인하고 이어지는 요청에도 같은 ID를 넣으세요. 앞의 기본 Flash 서버 요청은 기본 서버를 확인할 때 사용하면 됩니다.

기본 vLLM 서버 시작
vllm serve deepseek-ai/DeepSeek-V4-Flash --host 127.0.0.1 --port 8000 --tokenizer-mode deepseek_v4 --trust-remote-code
vLLM 0.30.0 예제의 target·tokenizer예요. 설치 버전과 장치 지원을 확인해요.
모델 ID와 짧은 응답 확인
curl -sS http://127.0.0.1:8000/v1/models
curl -sS http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"deepseek-ai/DeepSeek-V4-Flash","messages":[{"role":"user","content":"Reply with one short sentence."}],"temperature":0,"max_tokens":64,"stream":false}'
첫 응답을 확인하는 연결 시험이며 왕복 시간은 속도 측정값이 아니에요.
DSpark 적응형 검증 설정
vllm serve deepseek-ai/DeepSeek-V4-Flash-DSpark --host 127.0.0.1 --port 8000 --tokenizer-mode deepseek_v4 --trust-remote-code --speculative-config '{"method":"dspark","model":"deepseek-ai/DeepSeek-V4-Flash-DSpark","num_speculative_tokens":7,"draft_sample_method":"probabilistic","enable_adaptive_verification":true}'
공식 예제 설정이에요. 284B target과 draft가 들어갈 메모리와 backend·CUDA graph 조건을 확인해요.
DSpark 서버로 전환한 뒤 ID와 첫 응답 확인
curl --fail-with-body http://127.0.0.1:8000/v1/models
curl --fail-with-body http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"deepseek-ai/DeepSeek-V4-Flash-DSpark","messages":[{"role":"user","content":"Reply with one short sentence."}],"temperature":0,"max_tokens":64}'
DSpark 서버 로그가 준비 완료를 알린 뒤 다른 터미널에서 보내요.

요청 부하별로 대기·처리량·수락률을 함께 봐요

같은 코드 수정 요청으로 동시 요청 하나와 여러 개를 시험해요. target·draft·입력/출력 길이·sampling·GPU·메모리를 고정하고 동시 요청 수만 바꿔 여러 번 재요. 모델 로딩과 CUDA graph capture 시간은 요청 처리와 별도로 적어요.

한 요청에는 TTFT18·토큰 사이 지연·완료 시간을, 서버 총 처리에는 완료 요청 수나 tokens/s를 적어요. acceptance 통계·GPU 메모리·preemption·OOM도 함께 봐요. 동시성이 늘어 throughput이 올라도 개인 요청 대기가 길어질 수 있어요.

릴리스 노트는 H200에서 graph capture가 약 12초에서 2초, engine init이 약 28.9초에서 8.2초로 줄었다고 설명해요. GC freeze 변경으로 모델을 처음 띄우는 준비 단계가 개선된 사례예요. 요청 중 응답 속도와 함께 서버 기동 시간도 기록하면 운영에서 어느 구간이 줄었는지 확인할 수 있어요.

기동 실패면 backend의 device-decided query length 지원, full cudagraph, LoRA·pipeline parallelism 조건부터 확인해요. 실행되지만 이득이 없다면 수락률, 동시 부하의 draft 경쟁, 짧은 출력의 준비 비용을 살펴보고 한 조건만 바꿔 다시 비교해요.

설정 기록과 이전 서버 구성을 보관해 오류 때 되돌리는 작업대
문제가 난 단계에 맞춰 설정을 되돌리고 다시 비교해요.

공식 자료와 지원 조건을 재현 환경에 맞춰요

0.30.0 릴리스 및 adaptive verification 문서를 사용해 설치 버전과 모델·장치 지원을 확인해요. 최신 main 브랜치 문서나 컨테이너 태그는 0.30.0과 다를 수 있으니 실험할 버전 문서를 기준으로 해요.

vLLM 0.31.0으로 재시작할 때 모델을 다시 읽는 시간 줄이기

vLLM 서버를 재시작하면 큰 모델 파일을 다시 읽고 GPU에 올리느라 기다려야 해요. 0.31.0의 vllm preload는 별도 데몬이 GPU의 모델 가중치를 유지하고, 새 서버 프로세스가 이를 재사용하도록 해요. 설정 변경이나 개발 때문에 같은 모델을 자주 재시작할 때 유용해요.

먼저 터미널 하나에서 데몬을 실행하고, 다른 터미널에서 --load-format ipc_cache를 지정해 서버를 시작해요. 아래는 Qwen3-8B를 GPU 한 장에서 실행하는 예예요. 모델·버전·병렬화·dtype·양자화19 설정이 같아야 캐시를 재사용해요. 설정이 다르면 디스크에서 다시 읽어요.

preload 시험은 0.31.0 환경에서 따로 진행해요. 0.30.0 서버를 종료하고 0.31.0을 설치한 가상환경이나 컨테이너로 전환한 뒤 vllm --version을 확인하세요. 데몬과 서버를 시작할 두 터미널 모두 같은 0.31.0 환경을 사용해야 해요. 이전 서버가 8000 포트를 비운 뒤 아래 두 단계를 시작하면 됩니다.

터미널 1 — preload daemon
vllm preload --model "Qwen/Qwen3-8B" --tensor-parallel-size 1
같은 서버 환경에서 daemon을 실행하고, 모델 weight가 preload될 때까지 로그를 확인합니다.
터미널 2 — cache를 이용해 서버 시작
vllm serve "Qwen/Qwen3-8B" --tensor-parallel-size 1 --load-format ipc_cache --host 127.0.0.1
두 터미널의 모델, 병렬화, dtype/quantization 등 weight 설정을 일치시킵니다.

사용을 마치면 preload 데몬도 종료해요.

preload 데몬이 실행되는 동안 모델 가중치는 GPU 메모리에 남아요. 서버만 종료하거나 재시작해도 유지돼요. 같은 GPU에서 다른 작업을 하려면 데몬이 실행되는 터미널에서 Ctrl+C를 눌러 종료한 뒤, nvidia-smi나 ROCm20 관리 도구로 메모리가 반환됐는지 확인해요.

이 기능은 CUDA·ROCm 환경의 텐서·전문가·데이터 병렬화를 지원해요. 파이프라인 병렬화는 지원하지 않고, 양자화 방식에 따라 UnsupportedQuantForIPCError가 날 수 있어요. Apple Silicon의 vllm-metal은 별도 프로젝트이므로 이 기능을 적용하지 않아요. preload는 재시작 대기 시간을 줄이는 기능이며 답변의 토큰 생성 속도는 별도로 측정해야 해요.

용어 각주

  1. API — 프로그램의 기능을 다른 코드에서 호출하기 위한 약속된 인터페이스입니다.

    본문으로 돌아가기
  2. 대규모 언어 모델 — 대규모 텍스트 데이터에서 언어 패턴을 학습해 문맥에 맞는 텍스트를 처리하고 생성하는 모델입니다.

    본문으로 돌아가기
  3. GPU — 많은 계산을 병렬로 처리하는 프로세서입니다. AI 모델 실행에서는 모델 계산을 맡습니다.

    본문으로 돌아가기
  4. 토큰 — 모델이 입력이나 출력을 나누어 처리하는 단위입니다.

    본문으로 돌아가기
  5. 처리량 — 일정 시간 동안 처리하거나 생성한 작업량입니다. 토큰/초, 요청/초처럼 단위를 함께 확인해야 비교할 수 있습니다.

    본문으로 돌아가기
  6. KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.

    본문으로 돌아가기
  7. CUDA — NVIDIA GPU에서 범용 계산을 실행하기 위한 소프트웨어 플랫폼입니다.

    본문으로 돌아가기
  8. Python 가상환경 — 프로젝트별로 Python 패키지를 분리해 설치하는 공간입니다. 패키지 버전 충돌을 줄이는 데 쓰입니다.

    본문으로 돌아가기
  9. PyTorch — AI 모델을 만들고 실행하는 소프트웨어 프레임워크입니다. 모델과 함께 호환되는 PyTorch 버전 및 하드웨어 지원도 확인해야 합니다.

    본문으로 돌아가기
  10. NVFP4 — NVIDIA가 정의한 4비트 부동소수점 데이터 형식입니다. 지원 여부는 GPU 세대, 모델과 소프트웨어 구현에 따라 다릅니다.

    본문으로 돌아가기
  11. GGUF — 모델 정보를 담는 파일 형식으로 llama.cpp 계열 도구에서 널리 사용됩니다.

    본문으로 돌아가기
  12. 런타임 — 프로그램이 실행될 때 필요한 기능을 제공하는 소프트웨어 환경입니다. 로컬 AI에서는 모델을 실행하는 엔진을 가리키기도 합니다.

    본문으로 돌아가기
  13. 어텐션 — 입력 토큰 사이의 관련도를 계산해 각 위치의 정보를 현재 표현에 반영하는 신경망 연산입니다.

    본문으로 돌아가기
  14. LoRA — 기본 모델의 동작을 조정하는 작은 추가 가중치를 학습·적용하는 방식입니다. 기본 모델에 어댑터를 함께 적용하며, 스타일 조정이나 적은 단계의 생성 등에 쓰입니다.

    본문으로 돌아가기
  15. 파이프라인 병렬 — 모델의 층 묶음을 장치별 단계로 나누고, 한 단계의 출력 활성값을 다음 장치로 넘겨 처리하는 병렬화 방식입니다.

    본문으로 돌아가기
  16. 추측 디코딩 — 초안 모델·MTP 헤드·반복 문맥 조회가 출력 후보를 먼저 만들고, 본 모델이 후보를 검증해 확정하는 생성 기법입니다.

    본문으로 돌아가기
  17. 체크포인트 — 학습된 모델의 가중치 등을 저장한 파일입니다. 같은 모델 계열도 버전이나 용도에 따라 다른 체크포인트를 쓸 수 있습니다.

    본문으로 돌아가기
  18. 첫 토큰 지연 — 요청을 보낸 뒤 첫 출력 토큰이 도착하기까지 걸린 시간입니다.

    본문으로 돌아가기
  19. 양자화 — 모델의 가중치나 계산값을 더 적은 비트로 표현해 저장 공간과 메모리 사용량을 줄이는 방법입니다. 표현 단계가 거칠어져 정확도에도 영향을 줄 수 있습니다.

    본문으로 돌아가기
  20. ROCm — AMD GPU에서 AI와 고성능 계산을 실행하는 소프트웨어 플랫폼입니다. 지원 여부는 GPU 모델뿐 아니라 운영체제·드라이버·프레임워크 버전의 조합으로 확인합니다.

    본문으로 돌아가기

자주 묻는 질문

이 글에서 가장 먼저 확인할 것은 무엇인가요?
vLLM은 모델을 메모리에 올려 두고 API로 들어온 질문에 답변을 생성하는 LLM 서버 프로그램이에요. 여러 요청을 함께 처리하고 대화 문맥을 캐시에 저장해 GPU를 활용해요. 작은 모델로 서버 연결을 확인한 뒤 사용할 모델과 동시 요청 수를 맞추고, 0.30.0의 DFlash·DSpark 가속과 적응형 검증을 시험할 수 있어요.
필요한 메모리는 어느 정도인가요?
동시 사용자가 늘면 전체 완료량이 증가해도 한 요청은 큐에서 기다릴 수 있고 각 요청의 KV cache도 메모리를 써요. 동시 부하 결과를 개인 사용의 반응 속도로 옮겨 읽지 않아요.
수정 내역

사이트의 안내가 바뀐 기록입니다. 설치된 엔진·모델 버전을 자동으로 확인한 결과는 아닙니다.

  1. vLLM 실행 조건·요청 처리 안내 추가

    CUDA 환경의 짧은 서버·API 예제와 함께 일반 PC, ARM64 Spark, Mac의 실행 경로를 구분했습니다. 한 요청의 생성 속도와 서버 총처리량을 나누고, 모델별 양자화·MTP 지원을 확인하도록 설명했습니다.