본문으로 건너뛰기

온프레미스 vLLM 운영 구성과 안정화 방법

온프레미스 vLLM에서 GPU별 모델 실행, FlashInfer 패치, KV 캐시 조정, systemd 운영 설정을 묶은 실전 배포 구성입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

온프레미스에서 데이터를 외부로 내보내지 않고 LLM을 운영하기 위한 vLLM 배포 구성을 8-GPU GLM-5.2/5.3 노드와 단일 L40S gemma-4-26B 환경으로 나눠 제시합니다. 설치 단계에서는 uv 가상환경, FlashInfer 버전, SM120용 미완성 backend 패치처럼 실제 장애를 일으킨 의존성을 조정하고, GLM 노드는 Expert Parallelism과 FP8 KV 캐시를 사용해 256K 문맥을 처리합니다. GPU 메모리 사용률 0.98은 256K 문맥에서 OOM을 일으켰으므로 0.95와 --max-model-len 256K 조합을 안정점으로 선택했으며, gemma-4-26B는 초안 모델과 4개 speculative token을 이용합니다. systemd의 900초 시작 제한과 SIGINT 종료, 오프라인 Hugging Face 캐시, nftables 포트 제한을 더해 운영 환경의 재시작과 보안을 보완하고, ShareGPT 기반 동시성 테스트로 플래그 변경 전후 수치를 비교해야 한다고 정리합니다.

섹션별 상세

01
온프레미스 LLM 추론은 데이터가 외부로 나가면 안 되는 환경을 전제로 하며, 8-GPU 노드의 GLM-5.2/5.3과 단일 L40S의 gemma-4-26B라는 두 실행 프로필로 나뉩니다. LiteLLM proxy가 API 키, 라우팅, TLS를 담당하는 전면 계층이 되고 각 모델은 vLLM의 OpenAI 호환 API로 제공됩니다. GLM 계열은 NVFP4 MoE와 Expert Parallelism으로 8개 GPU에 계산을 분산하고 256K 문맥을 목표로 하며, gemma-4-26B는 FP8 단일 GPU 구성으로 분리해 하드웨어별 운영 경로를 명확히 합니다.
bash
Install
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

Ubuntu 24.04에서 uv로 Python 3.12 가상환경을 만들고 vLLM을 설치하는 초기 구성입니다.

02
설치 과정에서 vLLM 자체보다 주변 의존성과 캐시 경로가 먼저 운영 안정성을 좌우합니다. uv로 Python 3.12 가상환경을 만들고 vLLM을 설치한 뒤 ffmpeg, numactl, build-essential, python3.12-dev, ninja-build를 추가해 torchcodec, NUMA 바인딩, Triton 컴파일에 필요한 실행 기반을 마련합니다. 모델은 Hugging Face에서 /models 아래로 내려받고 HF_HUB_OFFLINE=1을 설정해 첫 다운로드가 끝난 뒤 서버가 외부에 접속하지 않도록 구성합니다.
bash
pip install -U flashinfer-python flashinfer-cubin
export FLASHINFER_DISABLE_VERSION_CHECK=1

vLLM과 호환되지 않는 오래된 FlashInfer를 업데이트하고 버전 검사 우회를 활성화하는 명령입니다.

03
vLLM과 FlashInfer의 버전이 맞지 않으면 trtllm_batch_decode_with_kv_cache_mla() 호출에 kv_scale_format 인자가 없다는 오류가 발생합니다. 글의 해결 순서는 flashinfer-python과 flashinfer-cubin을 업데이트하고 FLASHINFER_DISABLE_VERSION_CHECK=1을 설정한 뒤, SM120용 FlashInferMLASparseSM120Impl가 미완성 상태라면 원본 파일을 백업하고 패치 스크립트를 적용하는 방식입니다. GLM-5.3-NVFP4가 vLLM 0.28.0을 요구했을 때 기존 0.25.0 환경 전체를 .venv-vllm025-backup으로 복사한 뒤 vLLM과 flashinfer-cubin==0.6.16.post3를 올린 사례는 모델 업그레이드가 추론 런타임 업그레이드로 이어짐을 보여줍니다.
bash
vllm serve /models/GLM-5.2-NVFP4 --served-model-name glm-5.2 \
--tensor-parallel-size 8 --enable-expert-parallel \
--disable-custom-all-reduce --numa-bind --performance-mode interactivity \
--trust-remote-code --kv-cache-dtype fp8_e4m3 \
--gpu-memory-utilization 0.95 --max-model-len 256K \
--host --port 8000

8개 GPU 노드에서 GLM-5.2-NVFP4를 Expert Parallelism과 FP8 KV 캐시로 제공하는 최종 안정 실행 명령입니다.

bash
vllm serve /models/gemma-4-26B-A4B-it --quantization fp8 \
--served-model-name gemma-4-26b-a4b --tensor-parallel-size 1 \
--gpu-memory-utilization 0.93 --kv-cache-dtype fp8 --max-model-len 32768 \
--max-num-seqs 64 --enable-prefix-caching \
--cudagraph-capture-sizes 1 2 4 8 16 --async-scheduling \
--enable-auto-tool-choice --tool-call-parser gemma4 --reasoning-parser gemma4 \
--speculative-config '{"method":"mtp","model":"/models/gemma-4-26B-A4B-it-assistant","num_speculative_tokens":4}' \
--trust-remote-code --host --port 8000

단일 L40S에서 FP8 gemma-4-26B-A4B-it를 MTP 추측 디코딩과 prefix caching으로 제공하는 실행 명령입니다.

04
CUDA Graph 메모리 프로파일링은 설정값과 실제 사용 가능한 KV 캐시 사이에 차이를 만듭니다. --gpu-memory-utilization 0.95를 지정해도 vLLM 로그에는 CUDA Graph를 고려한 실효값이 0.9124로 표시되며, 같은 KV 캐시를 확보하려면 0.9876을 권하지만 글의 하드웨어에서는 0.98이 256K 문맥에서 OOM을 일으켰습니다. 따라서 8-GPU GLM 노드는 0.95와 --max-model-len 256K를 안정점으로 사용하고, 단일 L40S gemma 노드는 0.93과 32768 문맥으로 별도 조정합니다.
text
[Service]
Type=simple
EnvironmentFile=/etc/vllm/vllm.env
ExecStart=/root/.venv/bin/vllm serve ...
Restart=on-failure
RestartSec=10
TimeoutStartSec=900
TimeoutStopSec=120
KillSignal=SIGINT
KillMode=mixed
LimitNOFILE=1048576
OOMScoreAdjust=-900

systemd가 vLLM의 긴 시작 시간과 안전한 종료를 처리하도록 설정한 서비스 유닛입니다.

05
gemma-4-26B의 단일 L40S 구성은 FP8 양자화, prefix caching, CUDA Graph 캡처 크기, async scheduling을 함께 사용하며 MTP 추측 디코딩으로 초안 모델의 토큰을 먼저 생성합니다. /models/gemma-4-26B-A4B-it-assistant를 draft model로 지정하고 num_speculative_tokens를 4로 설정하지만, 실제 적용 과정에서는 vllm/v1/spec_decode/llm_base_proposer.py의 embedding 경로 패치가 필요했습니다. 모델 제공 명령에 auto tool choice와 gemma4용 tool-call·reasoning parser까지 포함해 추론뿐 아니라 도구 호출과 reasoning 출력의 처리 경로도 고정합니다.
06
운영 단계에서는 각 캐시를 분리하고 systemd와 방화벽으로 프로세스 수명과 외부 접근 범위를 제한합니다. /var/cache/huggingface, /var/cache/vllm, /var/cache/triton, /var/cache/torchinductor, /var/cache/nv를 미리 만들고 환경 파일의 권한을 400으로 설정하며, systemd에는 900초 시작 제한, 120초 종료 제한, SIGINT, on-failure 재시작을 둡니다. nftables는 기본 입력을 차단한 뒤 established 연결, loopback, ICMP, SSH 22번 포트와 API 포트 8000-8001만 허용하므로 긴 모델 로딩과 비정상 종료, 불필요한 네트워크 노출을 함께 관리합니다.
07
성능 수치는 설정값 자체가 아니라 동일한 부하에서 플래그 변경 전후를 비교해야 의미를 갖습니다. 글은 ShareGPT의 Vicuna unfiltered split을 OpenAI 호환 API로 보내고 작은 동시성 하니스를 사용해 각 설정 변경 전후의 결과를 기록하는 절차를 권장합니다. 이런 측정이 없으면 옵션 변경이 처리량이나 지연을 바꿨는지 판단할 근거가 남지 않으므로, 운영 배포에서는 재현 가능한 벤치마크 기록이 최종 검증 단계가 됩니다.

용어 해설

전문가 병렬화(Expert Parallelism)
Mixture-of-Experts 모델에서 여러 Expert를 GPU에 분산하고 토큰을 해당 Expert로 라우팅하는 병렬 처리 방식입니다. GLM-5.2/5.3처럼 Expert 수가 많은 모델을 8개 GPU에서 실행할 때 GPU별 계산과 통신을 나눠 메모리와 처리량을 관리하는 데 중요합니다.
KV 캐시(KV Cache)
Transformer가 이전 토큰의 Key와 Value를 저장해 긴 문맥을 처리할 때 같은 계산을 반복하지 않도록 하는 메모리 구조입니다. 문맥 길이가 늘수록 필요한 메모리도 커지므로 vLLM의 GPU 메모리 사용률과 최대 문맥 길이를 함께 조정해야 안정적인 추론이 가능합니다.
추측 디코딩(Speculative Decoding)
작은 초안 모델이 다음 토큰을 먼저 제안하고 주 모델이 이를 한 번에 검증하는 추론 최적화 기법입니다. 이 글에서는 gemma-4-26B-A4B-it-assistant를 초안 모델로 사용해 한 번에 4개 토큰을 제안하며, 실제 적용에는 embedding 경로 패치가 필요했습니다.
CUDA Graph
GPU 연산 그래프를 미리 캡처해 반복적인 커널 실행과 CPU 측 호출 오버헤드를 줄이는 CUDA 기능입니다. vLLM은 CUDA Graph 프로파일링에 메모리를 별도로 사용하므로 설정값 0.95가 실제 KV 캐시에 제공하는 비율은 로그상 0.9124로 낮아집니다.
NUMA
CPU와 메모리를 여러 노드로 나누고 특정 프로세스를 가까운 메모리 노드에 바인딩하는 하드웨어 메모리 구조입니다. 글에서는 numactl과 vLLM의 --numa-bind를 함께 사용해 8-GPU 노드의 CPU·메모리 접근 경로를 조정합니다.

기술

  • vLLM
  • LiteLLM
  • uv
  • Ubuntu 24.04
  • Python 3.12
  • FlashInfer
  • FlashInferMLASparseSM120Impl
  • CUDA Graph
  • Triton
  • torchcodec
  • numactl
  • systemd
  • nftables
  • ShareGPT
  • GLM-5.2-NVFP4
  • GLM-5.3-NVFP4
  • gemma-4-26B-A4B-it
  • Qwen/Qwen2.5-VL-72B-Instruct-AWQ

활용 사례

  • 데이터를 외부로 전송할 수 없는 온프레미스 LLM 추론
  • 8-GPU 노드에서 GLM-5.2/5.3 제공
  • 단일 L40S에서 gemma-4-26B 제공
  • OpenAI 호환 API 기반 사내 모델 서비스
  • ShareGPT 기반 동시성 벤치마크
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 03.수집 2026. 09. 03.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.