본문으로 건너뛰기

RTX 5090에서 Qwen3.8-27B 262K 컨텍스트 구동

NVFP4 Qwen3.8-27B를 RTX 5090 한 장에서 262K 문맥으로 구동한 vLLM 설정과 실측 성능을 정리했다.

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

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인 여유가 작은 구성이라, 제시된 수치는 일반적인 보장보다 재현 가능한 운용 지점과 메모리 적합성 검증에 해당한다.

주요 논점

01찬성다수

정확한 model revision, VRAM 예산, 실행 명령, benchmark 입력 길이와 측정값을 함께 제공해 RTX 5090 사용자가 같은 환경을 재현하기 쉽다는 입장이다.

02중립분열

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 모드가 원인인지 분리하는 것이 좋다.

섹션별 상세

01
작성자는 RTX 5090 한 장에서 Qwen3.8-27B의 262,144토큰 문맥이 vision, FP8 KV 캐시, Prefix Caching, tool calling, KDE 데스크톱과 함께 실제로 수용되는지 재현 가능한 설정으로 측정했다. ModelOpt NVFP4 checkpoint는 19.18GiB이고 vLLM이 보고한 모델 로드는 18.51GiB였으며, KV 풀에는 9,150,000,000바이트를 수동 할당했다. 그 결과 GPU KV 용량은 268,170토큰, 최대 문맥 동시성은 1.02배로 나타났고, 전체 카드 사용량은 30,532MiB로 남은 VRAM이 1,610MiB였다.
02
8,192토큰 입력의 프리필 처리량은 7,005tok/s, 32,768토큰에서는 6,148tok/s, 131,072토큰에서는 2,781tok/s였다. 131K 문맥이 이미 상주한 상태에서 디코드 속도는 64.7tok/s였고, 1,024토큰 입력과 512토큰 출력의 짧은 테스트에서는 77.2tok/s였다. 262,000토큰 입력의 프리필에는 166.004초가 걸렸으므로, 이 결과는 긴 문맥이 빠르다는 뜻이 아니라 해당 길이가 메모리에 들어가 생성까지 완료된다는 적합성 확인에 가깝다.
03
36,864토큰 prefix와 16토큰 suffix를 순차적으로 요청한 테스트에서 첫 요청 TTFT는 6.437초였고 네 번의 캐시 적중 요청은 0.282~0.296초, 중앙값 0.288초였다. 따라서 cold-to-cached 속도 향상은 22.3배였으며, 매 턴 전체 대화를 다시 프리필하는 대신 공유 KV 상태를 재사용하는 구조가 긴 agent 대화의 지연을 줄였다. 다만 hybrid Mamba·DeltaNet 캐시가 vLLM의 실험적 align 모드로 동작하므로 출력이 깨지면 Prefix Caching을 먼저 끄고 비교해야 한다.
04
추측 디코딩은 기본적으로 꺼졌다. base checkpoint용으로 학습된 외부 DSpark/dflash drafter는 128 대 256의 tensor dimension mismatch로 로드되지 않았고, 내장 MTP 헤드는 BF16으로 실행되어 target 모델의 NVFP4 커널을 사용하지 못했다. 측정상 추측 기능을 끈 디코드는 78.55tok/s였지만 내장 MTP 1토큰은 58.41tok/s, 3토큰은 45.02tok/s였으므로 이 구성에서는 단순한 비추측 실행이 더 빨랐다.
05
성능 수치는 vLLM 0.27.1, PyTorch 2.13.0+cu130, Transformers 5.15.0, FlashInfer 0.6.16.post3, Triton 3.7.1과 Arch Linux 환경에서 측정됐다. 런타임은 modelopt_fp4, FlashInfer CUTLASS NVFP4 GEMM, FlashInfer attention, Triton·FLA GDN 프리필 커널, vision encoder용 Flash Attention, CUDA graph를 자동 선택했다. 그러나 checkpoint는 calibrated FP8 KV q·prob scaling을 제공하지 않아 scale 1.0을 사용하며, 글에는 이 정밀도 설정이 정확도에 미친 영향이나 긴 문맥 retrieval 품질 변화가 정량화되지 않았다.

용어 해설

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보다 느렸다.

코드 예제

bash
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.jinja

RTX 5090 한 장에서 Qwen3.8-27B를 262,144토큰 문맥과 FP8 KV 캐시로 서비스하는 실제 vLLM 실행 명령이다.

bash
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-modelopt

Python 3.13 환경을 만들고 vLLM 0.27.1과 고정된 Hugging Face 모델 revision을 설치·다운로드하는 명령이다.

bash
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 명령이다.

bash
./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-detailed

36,864토큰의 공통 prefix와 16토큰 suffix를 이용해 Prefix Caching의 cold·cached TTFT를 비교하는 명령이다.

언급된 도구

vLLM추천

NVFP4 모델을 로드하고 OpenAI 호환 endpoint, FP8 KV 캐시, Prefix Caching, tool calling, benchmark를 실행하는 inference server이다.

FlashInfer중립

NVFP4 GEMM, text attention, SM120 decode, vision encoder 경로에 사용된 GPU inference 커널 라이브러리이다.

Codex중립

실행 중인 프로세스와 로컬 benchmark, 저장된 JSON·telemetry를 확인하고 작성자의 기록을 정리하는 데 사용됐다.

AI 분석 전체 내용 보기

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

출처 · 인용 안내

원문 발행 2026. 08. 23.수집 2026. 08. 23.출처 타입 REDDIT

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