TL;DR
한 장의 RTX 5090에서 NVFP4로 양자화한 Qwen3.8-27B를 vLLM 0.27.1로 구동해 262,144토큰 문맥, vision, FP8 KV 캐시, Prefix Caching을 함께 수용했다. 1,024토큰 입력과 512토큰 출력에서는 77.2tok/s, 128K 문맥 상주 상태에서는 64.7tok/s를 기록했고 262,000토큰 프리필은 166.004초가 걸렸다. 36,864토큰 prefix 캐싱은 후속 TTFT를 6.437초에서 0.288초로 줄였지만 hybrid cache의 experimental align 모드와 FP8 KV 정확도 변화는 주의가 필요하다. 실측 환경은 남은 VRAM이 1,610MiB인 여유가 작은 구성이라, 제시된 수치는 일반적인 보장보다 재현 가능한 운용 지점과 메모리 적합성 검증에 해당한다.
주요 논점
정확한 model revision, VRAM 예산, 실행 명령, benchmark 입력 길이와 측정값을 함께 제공해 RTX 5090 사용자가 같은 환경을 재현하기 쉽다는 입장이다.
262K 문맥 수용과 77.2tok/s 디코드는 유용한 운용 지점이지만, 단일 실행인 128K·262K 결과와 측정되지 않은 FP8 KV 정확도 변화 때문에 일반적인 성능 보장으로 확대하기 어렵다는 입장이다.
합의점 vs 논쟁점
논쟁점
- 262,144토큰 문맥을 한 장의 RTX 5090에서 수용하는 설정 자체는 구체적인 메모리 수치와 실행 명령으로 뒷받침된다. 그러나 128K와 262K 측정은 각각 한 번만 실행됐고, 남은 VRAM이 1,610~1,818MiB에 불과해 데스크톱 환경에서 안정적인 여유 폭이 크지는 않다. 따라서 이를 보편적인 실사용 성능이나 여러 요청의 동시 처리 성능으로 해석하기는 어렵다.
- FP8 KV 캐시는 9,150,000,000바이트의 고정 KV 풀로 문맥 용량을 확보하는 핵심 설정이다. vLLM 경고에 따르면 checkpoint에 calibrated FP8 KV q·prob scaling이 없어 scale 1.0이 사용되며, 작성자는 정확도 저하를 별도로 측정하지 않았다. 긴 문맥 retrieval에서 품질이 유지되는지는 추가 비교가 필요한 상태다.
실용적 조언
- 모델 파일은 지정된 revision과 함께 내려받고 model-mtp-grafted.safetensors를 삭제하지 않는 편이 안전하다. speculation을 꺼도 checkpoint index의 15개 tensor가 해당 파일에 매핑되어 있어 불완전한 checkpoint가 될 수 있다. 실행 전 safetensors와 MTP 파일의 hash를 원문에 적힌 값과 비교하면 재현 과정의 파일 변경을 확인할 수 있다.
- KV 풀을 9,150,000,000바이트로 고정하고 --max-num-batched-tokens 512를 유지하는 것이 이 측정값에 해당한다. 8,939,000,000바이트에서는 vLLM이 261,856토큰만 가능하다고 판단해 262,144 max length를 거부했으며, 더 큰 batched-token 값은 프리필을 개선하는 대신 작은 VRAM 여유를 소모한다. --max-num-seqs 3은 262K 요청 세 개를 동시에 수용한다는 뜻이 아니며, 전체 KV 용량은 full window 1.02배 수준이다.
- CUDA가 /opt/cuda에 설치된 경우 CUDA_HOME과 nvcc 경로를 명시해야 FlashInfer JIT 실패를 피할 수 있다. 이미지 입력을 사용할 때는 max_pixels 4014080 설정이 큰 이미지를 작성자의 측정에서 약 3,908토큰으로 제한하며 tokenizer.json의 truncation이 null인지 확인해야 한다. 오래된 export에 max_length 2048이 들어 있으면 큰 이미지 요청이 HTTP 400으로 실패할 수 있다.
- 서버를 외부 인터페이스에 열 때 --host 0.0.0.0은 인증 없는 OpenAI 호환 endpoint를 모든 도달 가능한 인터페이스에 노출한다. 신뢰할 수 없는 네트워크에서는 127.0.0.1, 방화벽 또는 vLLM API key 옵션을 사용해야 한다. Prefix Caching으로 출력이 손상되면 먼저 해당 기능을 비활성화해 hybrid cache의 experimental align 모드가 원인인지 분리하는 것이 좋다.
섹션별 상세
용어 해설
- FP8 KV 캐시(FP8 KV Cache)
- — Transformer가 긴 문맥을 처리할 때 어텐션의 Key·Value 상태를 FP8 형식으로 저장하는 방식이다. 저장 정밀도를 낮춰 GPU 메모리를 줄이고 더 긴 문맥을 수용하지만, 이 글의 설정에서는 보정 스케일이 없어 정확도 변화가 측정되지 않았다.
- Prefix 캐싱(Prefix Caching)
- — 여러 요청이 공유하는 입력 앞부분의 KV 상태를 저장해 다음 요청에서 같은 토큰을 다시 프리필하지 않는 방식이다. 이 설정에서는 36,864토큰 prefix를 재사용해 후속 요청의 TTFT를 6.437초에서 0.288초 중앙값으로 줄였다.
- 하이브리드 어텐션(Hybrid Attention)
- — 하나의 모델 안에서 선형적인 상태 기반 레이어와 전체 토큰 간 관계를 계산하는 full-attention 레이어를 함께 사용하는 구조다. Qwen3.8-27B는 64개 레이어 중 48개가 Gated DeltaNet이고 16개가 full attention이라 문맥이 길어질수록 프리필 속도가 크게 낮아졌다.
- NVFP4 양자화(NVFP4)
- — NVIDIA GPU에서 모델 가중치와 행렬 연산의 메모리·계산 비용을 줄이기 위해 사용하는 4비트 부동소수점 형식이다. 이 글의 ModelOpt export는 19.18GiB safetensors로 저장됐고 FlashInfer CUTLASS NVFP4 GEMM 경로를 사용했다.
- 추측 디코딩(Speculative Decoding)
- — 작은 초안 모델이나 MTP 헤드가 다음 토큰 후보를 먼저 만들고 target 모델이 여러 토큰을 한 번에 검증하는 생성 방식이다. 이 설정에서는 내장 MTP가 NVFP4 target 커널을 사용하지 못해 비활성화했으며, 1토큰 설정은 58.41tok/s로 추측 기능을 끈 78.55tok/s보다 느렸다.
코드 예제
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export MAX_JOBS=3
export TORCHINDUCTOR_COMPILE_THREADS=3
export CUDA_HOME=/opt/cuda
export PATH="$CUDA_HOME/bin:$PATH"
systemd-run --user --scope \
-p MemoryMax=24G \
-p MemorySwapMax=8G \
./qwen38-env/bin/vllm serve \
./Qwen3.8-27B-Uncensored-NVFP4-modelopt \
--host 0.0.0.0 \
--port 8888 \
--served-model-name qwen3.8-27b \
--max-model-len 262144 \
--kv-cache-dtype fp8 \
--kv-cache-memory-bytes 9150000000 \
--max-num-seqs 3 \
--max-num-batched-tokens 512 \
--gpu-memory-utilization 0.92 \
--enable-prefix-caching \
--enable-auto-tool-choice \
--tool-call-parser qwen3_xml \
--reasoning-parser qwen3 \
--mm-processor-kwargs '{"max_pixels": 4014080}' \
--chat-template ./chat-templates/sharp-v22.2/chat_template.jinjaRTX 5090 한 장에서 Qwen3.8-27B를 262,144토큰 문맥과 FP8 KV 캐시로 서비스하는 실제 vLLM 실행 명령이다.
uv venv --python 3.13 qwen38-env
uv pip install --python qwen38-env/bin/python 'vllm==0.27.1' --torch-backend=cu130
./qwen38-env/bin/hf download \
joshebbs/qwen3.8-27b-uncensored-nvfp4-modelopt \
--revision e5ff4986938dcd0dd05ab4cce89da1b052be6ce3 \
--local-dir Qwen3.8-27B-Uncensored-NVFP4-modeloptPython 3.13 환경을 만들고 vLLM 0.27.1과 고정된 Hugging Face 모델 revision을 설치·다운로드하는 명령이다.
V=./qwen38-env/bin/vllm TOK=./Qwen3.8-27B-Uncensored-NVFP4-modelopt
COMMON=(bench serve --backend openai --base-url http://127.0.0.1:8888 \
--endpoint /v1/completions --model qwen3.8-27b --tokenizer "$TOK" \
--dataset-name random --max-concurrency 1 --ignore-eos --temperature 0 \
--percentile-metrics ttft,tpot,itl,e2el --metric-percentiles 50,95,99)
"$V" "${COMMON[@]}" --seed 8182 --random-input-len 8192 \
--random-output-len 1 --num-prompts 5
"$V" "${COMMON[@]}" --seed 8184 --random-input-len 32768 \
--random-output-len 1 --num-prompts 3
"$V" "${COMMON[@]}" --seed 8183 --random-input-len 1024 \
--random-output-len 512 --num-prompts 5
"$V" "${COMMON[@]}" --seed 8186 --random-input-len 131072 \
--random-output-len 256 --num-prompts 1
"$V" "${COMMON[@]}" --seed 8185 --random-input-len 262000 \
--random-output-len 1 --num-prompts 1동일한 vLLM OpenAI 호환 서버에 무작위 입력 길이별 요청을 보내 프리필과 디코드 성능을 측정하는 benchmark 명령이다.
./qwen38-env/bin/vllm bench serve \
--backend openai --base-url http://127.0.0.1:8888 \
--endpoint /v1/completions --model qwen3.8-27b \
--tokenizer ./Qwen3.8-27B-Uncensored-NVFP4-modelopt \
--dataset-name prefix_repetition \
--prefix-repetition-prefix-len 36864 \
--prefix-repetition-suffix-len 16 \
--prefix-repetition-num-prefixes 1 \
--prefix-repetition-output-len 1 \
--num-prompts 5 --max-concurrency 1 \
--ignore-eos --seed 8187 --temperature 0 --save-detailed36,864토큰의 공통 prefix와 16토큰 suffix를 이용해 Prefix Caching의 cold·cached TTFT를 비교하는 명령이다.
언급된 도구
NVFP4 모델을 로드하고 OpenAI 호환 endpoint, FP8 KV 캐시, Prefix Caching, tool calling, benchmark를 실행하는 inference server이다.
NVFP4 GEMM, text attention, SM120 decode, vision encoder 경로에 사용된 GPU inference 커널 라이브러리이다.
실행 중인 프로세스와 로컬 benchmark, 저장된 JSON·telemetry를 확인하고 작성자의 기록을 정리하는 데 사용됐다.
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.