Qwen3.8-27B ยท FP8 (dynamic)
8-bit quantization of Qwen/Qwen3.8-27B, produced for efficient vLLM serving. Quantized by axteam.
Revision 2026-11-02 (config fix): the earlier
config.jsonexcluded the vision tower from quantization with the patternre:model\.visual\..*, which does not match the names vLLM uses for these modules (visual.*). vLLM 0.32 therefore built the vision layers as FP8 and loaded the BF16 vision weights into them, so image input gave wrong answers; text input was not affected. Onlyconfig.jsonchanged (the pattern now also matches vLLM's names); the weights are the same. Checked with vLLM 0.32.0 on 2026-11-02: the vision weights now load as BF16, and a synthetic test image (red circle, blue square, the caption "QWEN TEST 2026") is described correctly. If you downloaded this repo before 2026-11-01 23:22:50 UTC (revision6a6dba4), downloadconfig.jsonagain.
| Base model | Qwen/Qwen3.8-27B |
| Method | FP8 (dynamic) |
| Format | compressed-tensors float-quantized (scheme FP8_DYNAMIC) |
| Weights / activations | W8A8 โ FP8 E4M3 weights (per-output-channel scale), dynamic per-token FP8 activations |
| Architecture | Hybrid (linear-attention + full-attention) ยท Dense ยท multimodal (vision) ยท MTP head |
| Size on disk | ~31.2 GB |
| Calibration | None (data-free static weight scales) |
| License | Apache-2.0 |
Quantization details
- Scheme โ W8A8 โ FP8 E4M3 weights (per-output-channel scale), dynamic per-token FP8 activations, stored as compressed-tensors
float-quantized(schemeFP8_DYNAMIC). - Kept in BF16 โ the vision tower & projector (
model.visual.*), the multi-token-prediction head (mtp.*), all RMSNorms, token embeddings, the LM head, the SSM non-linear parts (linear_attn.conv1d/A_log/dt_bias). Left unquantized to preserve quality (about 12% of all parameters in this build). - Tokenizer /
chat_template/generation_configare identical to the original.config.jsonis the original plus aquantization_configblock.
This is post-training quantization (PTQ) โ no retraining. FP8 dynamic is calibration-free.
Benchmarks (measured)
Every column was measured with the same harness and settings โ lm-evaluation-harness on vLLM, greedy, completion-style prompts without a chat template (0- or 5-shot, as listed in each row). MMLU here is lm-eval's generative variant (mmlu_generative: the model writes the answer letter and only an exact match on the first line counts), so it is not directly comparable with MMLU scores measured another way (e.g. log-likelihood scoring). Percentages are recovery vs. the BF16 original.
| Benchmark | BF16 (original) | FP8-dynamic (this repo) | AWQ-8bit | NVFP4A16 | NVFP4 | AWQ-4bit |
|---|---|---|---|---|---|---|
| MMLU (5-shot, generative) | 62.42 | 62.15 (99.6%) | 62.48 (100.1%) | 62.55 (100.2%) | 63.47 (101.7%) | 63.40 (101.6%) |
| GSM8K (5-shot, strict) | 70.43 | 76.88 (109.1%) | 70.81 (100.5%) | 49.81 (70.7%) | 47.54 (67.5%) | 76.42 (108.5%) |
| ARC-Challenge (0-shot) | 58.62 | 58.36 (99.6%) | 58.79 (100.3%) | 58.70 (100.1%) | 57.76 (98.5%) | 59.56 (101.6%) |
| Winogrande (5-shot) | 79.08 | 79.56 (100.6%) | 79.32 (100.3%) | 79.48 (100.5%) | 80.03 (101.2%) | 79.72 (100.8%) |
| KMMLU (5-shot, direct) | 65.72 | 65.71 (100.0%) | 65.77 (100.1%) | 65.37 (99.5%) | 64.82 (98.6%) | 65.19 (99.2%) |
| HAE-RAE (0-shot) | 76.35 | 76.54 (100.2%) | 76.90 (100.7%) | 75.89 (99.4%) | 75.80 (99.3%) | 76.44 (100.1%) |
| Average | 68.77 | 69.87 (101.6%) | 69.01 (100.3%) | 65.30 (95.0%) | 64.90 (94.4%) | 70.12 (102.0%) |
Evaluation (measured)
Fidelity to the BF16 original on an internal mixed English/Korean set (100 prompts, BF16 greedy answers scored under each build โ same harness for every row).
| Metric | This model | BF16 original |
|---|---|---|
| Perplexity (lower = closer) | 1.3651 | 1.3586 (+0.5%) |
| Top-1 next-token agreement | 97.3% | 99.4% |
These measure fidelity to the base model, not absolute task scores.
Requirements
| Runtime | vLLM โ the architecture is in vLLM โฅ 0.17.0; tested here with vLLM 0.32.0. |
| vLLM install | vLLM 0.32 itself needs Python 3.11โ3.14, torch 2.13 (CUDA 13.0 build, so an NVIDIA driver with CUDA 13 support), transformers โฅ5.16.1,<5.20 and compressed-tensors 0.17.0 (both pinned by vLLM; 0.17.0 reads this checkpoint, which was saved with 0.19.0 โ do not upgrade it separately). |
| GPU | NVIDIA Turing (sm75, e.g. T4) or newer. FP8 math runs on Ada / Hopper / Blackwell (sm89+); on Turing and Ampere vLLM switches to weight-only FP8 automatically. V100 (sm70) is not supported. (Kernel choice per GPU from vLLM 0.32's selection code; only B200 was run here.) |
| Memory | Weights: 31.2 GB. Add KV cache (grows with context length ร concurrent requests) and a few GB for activations / CUDA graphs; use --tensor-parallel-size N when the weights do not fit one GPU. |
| Transformers (without vLLM) | transformers>=5.2.0 + compressed-tensors>=0.15.0 (checked on CPU with Qwen3.5-0.8B FP8 / AWQ-4bit / NVFP4A16 / NVFP4). |
| trust_remote_code | not needed |
Usage (vLLM)
Start an OpenAI-compatible server:
vllm serve axteam/Qwen3.8-27B-FP8-dynamic --max-model-len 32768
Query it:
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "axteam/Qwen3.8-27B-FP8-dynamic",
"messages": [{"role": "user", "content": "๋ํ๋ฏผ๊ตญ์ ์๋๋ ์ด๋์ธ๊ฐ์?"}],
"temperature": 1.0, "top_p": 0.95, "top_k": 20, "max_tokens": 512
}'
Offline inference in Python:
from vllm import LLM, SamplingParams
llm = LLM(model="axteam/Qwen3.8-27B-FP8-dynamic", max_model_len=32768)
params = SamplingParams(temperature=1.0, top_p=0.95, top_k=20, max_tokens=1024)
out = llm.chat([{"role": "user", "content": "Explain model quantization in two sentences."}], params)
print(out[0].outputs[0].text)
# image input (URL or data: URI)
messages = [{"role": "user", "content": [
{"type": "image_url", "image_url": {"url": "https://example.com/your-image.png"}},
{"type": "text", "text": "Describe this image."},
]}]
out = llm.chat(messages, params)
print(out[0].outputs[0].text)
Recommended sampling (from the original
generation_config.json):temperature=1.0,top_p=0.95,top_k=20. Thinking mode is on by default in the chat template; to turn it off passchat_template_kwargs={"enable_thinking": False}(Pythonllm.chat(..., chat_template_kwargs=...), or"chat_template_kwargs": {"enable_thinking": false}in the request body). Text-only serving: add--limit-mm-per-prompt '{"image": 0, "video": 0}'to skip loading the vision encoder's memory budget.
Reducing KV-cache memory (optional, serve-time)
The KV cache is kept in BF16 by default. KV-cache precision is a runtime choice, independent of the weight quantization above. This is a hybrid model: only its 16 full-attention layers keep a KV cache, while its 48 linear-attention (Gated DeltaNet) layers keep a fixed-size state per request, which --kv-cache-dtype does not change. FP8 halves the full-attention KV cache, so the saving grows with context length and is small for many short requests:
vllm serve axteam/Qwen3.8-27B-FP8-dynamic --kv-cache-dtype fp8
License
Quantized derivative of Qwen/Qwen3.8-27B (Apache-2.0). All original weights, tokenizer and chat template belong to the Qwen team.
ํ๊ตญ์ด ์์ฝ
Qwen/Qwen3.8-27B์ FP8 (W8A8) ์์ํ ๋น๋ ยท ์ ์ axteam
๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์๋ณธ ๋ชจ๋ธ | Qwen/Qwen3.8-27B |
| ์์ํ ๋ฐฉ์ | FP8 ๋์ ์์ํ (W8A8) |
| ์ ์ฅ ํ์ | compressed-tensors float-quantized (scheme FP8_DYNAMIC) |
| ๋ชจ๋ธ ๊ตฌ์กฐ | ํ์ด๋ธ๋ฆฌ๋ ์ดํ ์ (์ ํ ์ดํ ์ + ํ ์ดํ ์ ) ยท Dense ยท ๋ฉํฐ๋ชจ๋ฌ(๋น์ ) ยท MTP ํค๋ |
| ์ฉ๋ | ์ฝ 31.2 GB |
| ๋ณด์ ๋ฐ์ดํฐ | ์์ (๊ฐ์ค์น ์ค์ผ์ผ์ ๊ฐ์ค์น๋ง์ผ๋ก ๊ณ์ฐ, ํ์ฑํ ์ค์ผ์ผ์ ์คํ ์ ๊ณ์ฐ) |
์์ํ ์์ธ
- ๊ฐ์ค์น: FP8(E4M3), ์ถ๋ ฅ ์ฑ๋๋ณ ์ค์ผ์ผ
- ํ์ฑํ: ์คํ ์ ํ ํฐ๋ณ ๋์ FP8
- ์์ํ ์ ์ฐจ: PTQ(ํ์ต ํ ์์ํ, ์ฌํ์ต ์์), ๊ฐ์ค์น ์ค์ผ์ผ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ณ ํ์ฑํ ์ค์ผ์ผ์ ์คํ ์ ํ ํฐ๋ง๋ค ๊ณ์ฐ
- BF16 ์ ์ง: ๋น์ ํ์ยทํฌ์์ธต(
model.visual.*), MTP ํค๋(mtp.*), ๋ชจ๋ RMSNorm, ํ ํฐ ์๋ฒ ๋ฉ, LM ํค๋, SSM์ ์ ํ์ธต ์ธ ํ๋ผ๋ฏธํฐ(linear_attn.conv1dยทA_logยทdt_bias) โ ์ ์ฒด ํ๋ผ๋ฏธํฐ์ ์ฝ 12% - ์๋ณธ ํ์ผ: ํ ํฌ๋์ด์ ยทchat templateยทgeneration config๋ ์๋ณธ๊ณผ ๋์ผ,
config.json์ ์๋ณธ์quantization_config๋ธ๋ก๋ง ์ถ๊ฐ
ํ์ง (์ค์ธก)
- ์๋ณธ ๋๋น ์ถฉ์ค๋: PPL 1.3651 (์๋ณธ 1.3586, +0.5%, ๋ฎ์์๋ก ์๋ณธ์ ๊ฐ๊น์), ๋ค์ ํ ํฐ top-1 ์ผ์น์จ 97.3% (์๋ณธ ์์ฒด ๊ธฐ์ค๊ฐ 99.4%) โ ๋ด๋ถ ์์ดยทํ๊ตญ์ด ํผํฉ ํ๋กฌํํธ 100๊ฐ, ์๋ณธ(BF16)์ greedy ๋ต๋ณ์ ๊ธฐ์ค ํ ์คํธ๋ก ์ธก์
- ๋ฒค์น๋งํฌ ํ๊ท : 69.87 (์๋ณธ 68.77, 101.6%) โ MMLU(์์ฑํ)ยทGSM8KยทARC-ChallengeยทWinograndeยทKMMLUยทHAE-RAE 6์ข ํ๊ท , lm-evaluation-harness + vLLM, chat template ์๋ ์์ฑํ ํ๋กฌํํธ(๊ณผ์ ๋ณ 0ยท5-shot, ํ ์ฐธ๊ณ )ยทgreedy, ๋ชจ๋ ๋น๋๋ฅผ ๊ฐ์ ์ค์ ์ผ๋ก ์ธก์
- ํ๊ตญ์ด ๋ฒค์น๋งํฌ: KMMLU 65.71 (์๋ณธ 65.72, 100.0%) ยท HAE-RAE 76.54 (์๋ณธ 76.35, 100.2%)
- MMLU ๋ฐฉ์: lm-eval ์์ฑํ ๋ณํ(
mmlu_generative) โ ๋ชจ๋ธ์ด ๋ต ๊ธ์๋ฅผ ์์ฑํ๊ณ ์ฒซ ์ค์ด ์ ํํ ์ผ์นํด์ผ ์ ๋ต์ผ๋ก ์ฑ์ ํ๋ฏ๋ก, ๋ค๋ฅธ ๋ฐฉ์(์: log-likelihood ์ฑ์ )์ผ๋ก ์ฐ MMLU ์ ์์ ์ง์ ๋น๊ต ๋ถ๊ฐ
์๊ตฌ์ฌํญ
- ์คํ ์์ง: vLLM 0.17.0 ์ด์(์ด ๊ตฌ์กฐ๋ฅผ ์ง์ํ๋ ์ฒซ ๋ฒ์ ), ์ด ๋น๋๋ vLLM 0.32.0์์ ์คํ ํ์ธ
- vLLM 0.32 ์ค์น ์กฐ๊ฑด: Python 3.11~3.14, torch 2.13(CUDA 13.0 ๋น๋, CUDA 13 ์ง์ ๋๋ผ์ด๋ฒ ํ์), transformers 5.16.1 ์ด์ 5.20 ๋ฏธ๋ง, compressed-tensors 0.17.0 โ transformersยทcompressed-tensors๋ vLLM์ด ๋ฒ์ ์ ๊ณ ์ ํ๋ฏ๋ก compressed-tensors๋ฅผ ๋ฐ๋ก ์ ๊ทธ๋ ์ด๋ํ์ง ๋ง ๊ฒ (์ด ์ฒดํฌํฌ์ธํธ๋ 0.19.0์ผ๋ก ์ ์ฅ๋์ง๋ง 0.17.0์์๋ ๋ก๋๋จ)
- GPU: NVIDIA Turing(sm75, ์: T4) ์ด์, V100(sm70) ๋ฏธ์ง์ โ FP8 ์ฐ์ฐ์ AdaยทHopperยทBlackwell(sm89 ์ด์)์์ ์ํ, TuringยทAmpere๋ vLLM์ด ๊ฐ์ค์น ์ ์ฉ FP8๋ก ์๋ ์ ํ (GPU๋ณ ์ง์ ์ฌ๋ถ๋ vLLM 0.32 ์ปค๋ ์ ํ ์ฝ๋ ๊ธฐ์ค, ์ค์ ์คํ์ B200์์๋ง ํ์ธ)
- ๋ฉ๋ชจ๋ฆฌ: ๊ฐ์ค์น 31.2 GB + KV ์บ์(์ปจํ
์คํธ ๊ธธ์ด ร ๋์ ์์ฒญ ์์ ๋น๋ก) + ํ์ฑํยทCUDA graph์ฉ ์ GB โ GPU ํ ์ฅ์ ๋ค ๋ค์ด๊ฐ์ง ์์ผ๋ฉด
--tensor-parallel-size N์ผ๋ก ๋ถ์ฐ - Transformers๋ก ์ง์ ์ฌ์ฉ: transformers 5.2.0 ์ด์ + compressed-tensors 0.15.0 ์ด์ (Qwen3.5-0.8B์ FP8ยทAWQ-4bitยทNVFP4A16ยทNVFP4 ๋น๋๋ก CPU์์ ํ์ธ)
- trust_remote_code: ๋ถํ์
์ฌ์ฉ๋ฒ
- ์๋ฒ ์คํ:
vllm serve axteam/Qwen3.8-27B-FP8-dynamic --max-model-len 32768โ OpenAI ํธํ API - Python:
LLM(model="axteam/Qwen3.8-27B-FP8-dynamic", max_model_len=32768).chat(...)โ ์ ์ฒด ์์๋ ์ ์์ด ๋ณธ๋ฌธ 'Usage (vLLM)' ์ ์ฐธ๊ณ - ๊ถ์ฅ ์ํ๋ง:
temperature=1.0,top_p=0.95,top_k=20(์๋ณธgeneration_config.json๊ธฐ์ค) - thinking ๋ชจ๋: ๊ธฐ๋ณธ ์ผ์ง โ ๋๋ ค๋ฉด
chat_template_kwargs={"enable_thinking": False}์ ๋ฌ(Python์llm.chat()์ธ์, HTTP๋ ์์ฒญ ๋ณธ๋ฌธ์"chat_template_kwargs": {"enable_thinking": false}) - ์ด๋ฏธ์ง ์
๋ ฅ: ๋ฉ์์ง์
image_urlํญ๋ชฉ ์ฌ์ฉ - ํ
์คํธ๋ง ์ฌ์ฉํ ๋:
--limit-mm-per-prompt '{"image": 0, "video": 0}'โ ๋น์ ํ์์ฉ ๋ฉ๋ชจ๋ฆฌ ์์ฝ์ ์๋ตํด ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ - KV ์บ์ ์ ๊ฐ(์ ํ):
vllm serve์--kv-cache-dtype fp8์ถ๊ฐ โ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ๋ผ KV ์บ์๋ ํ ์ดํ ์ 16๊ฐ ์ธต์๋ง ์๊ณ , ์ ํ ์ดํ ์ (Gated DeltaNet) 48๊ฐ ์ธต์ ์์ฒญ๋ณ ๊ณ ์ ํฌ๊ธฐ ์ํ๋ ์ด ์ต์ ์ผ๋ก ๋ฐ๋์ง ์์ โ ํ ์ดํ ์ KV ์บ์๋ง ์ ๋ฐ์ผ๋ก ์ค์ด ๊ธด ์ปจํ ์คํธ์์ ํจ๊ณผ๊ฐ ํฌ๊ณ ์งง์ ์์ฒญ์ด ๋ง์ ๋๋ ์์ (๊ฐ์ค์น ์์ํ์ ๋ณ๊ฐ์ธ ์คํ ์ต์ )
์ฐธ๊ณ
- ์์ ์ด๋ ฅ (2026-11-02, ์ค์ ์์ ): ์ด์
config.json์ ๋น์ ํ์๋ฅผ ์์ํ์์ ๋นผ๋ ๊ท์น(re:model\.visual\..*)์ด vLLM์ด ์ฐ๋ ๋ชจ๋ ์ด๋ฆ(visual.*)๊ณผ ๋ง์ง ์์, vLLM 0.32๊ฐ ๋น์ ์ธต์ FP8๋ก ๋ง๋ค๊ณ BF16 ๋น์ ๊ฐ์ค์น๋ฅผ ๊ทธ๋๋ก ๋ฃ์์ โ ์ด๋ฏธ์ง ์ ๋ ฅ ๋ต์ด ํ๋ฆผ(ํ ์คํธ ์ ๋ ฅ์ ์ํฅ ์์) โconfig.json์ ๊ท์น๋ง vLLM ์ด๋ฆ๊น์ง ๋ง๊ฒ ๊ณ ์นจ(๊ฐ์ค์น ๋์ผ) โ vLLM 0.32.0 ํ์ธ(2026-11-02): ๋น์ ๊ฐ์ค์น๊ฐ BF16์ผ๋ก ๋ก๋๋จ, ๋ชจ๋ธ์ด ์ํ ๊ทธ๋ฆผ(๋นจ๊ฐ ์ยทํ๋ ์ฌ๊ฐํยท๊ธ์ "QWEN TEST 2026")์ ๋ฐ๋ฅด๊ฒ ์ค๋ช โ 2026-11-01 23:22:50 UTC(๋ฆฌ๋น์ 6a6dba4) ์ด์ ์ ๋ฐ์๋ค๋ฉดconfig.json๋ง ๋ค์ ๋ฐ์ ๊ฒ
๋ผ์ด์ ์ค
- ๋ผ์ด์ ์ค: Apache-2.0 โ ์๋ณธ ๋ชจ๋ธ์ ๋ผ์ด์ ์ค๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฆ
- ๊ถ๋ฆฌ: ์๋ณธ ๊ฐ์ค์นยทํ ํฌ๋์ด์ ยทchat template์ Qwen ํ(Alibaba) ์์ , ์ด ๋ฆฌํฌ๋ ์์ํ ํ์๋ฌผ