Qwen3.5-9B ยท FP8 (dynamic)
8-bit quantization of Qwen/Qwen3.5-9B, 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:17:21 UTC (revisionf360b7a), downloadconfig.jsonagain.
| Base model | Qwen/Qwen3.5-9B |
| 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 | ~12.4 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 except the gatedlinear_attn.norm, token embeddings, the LM head, the SSM non-linear partslinear_attn.conv1d/dt_bias. Kept in FP32, as in the original:linear_attn.A_logand the gatedlinear_attn.norm. Left unquantized to preserve quality (about 28% of all parameters in this build). - Tokenizer /
chat_template/ preprocessor configs are identical to the original (the original ships nogeneration_config.json, so none is included here).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) | 33.03 | 46.82 (141.8%) | 32.37 (98.0%) | 32.15 (97.3%) | 35.06 (106.1%) | 33.29 (100.8%) |
| GSM8K (5-shot, strict) | 87.11 | 86.81 (99.7%) | 86.96 (99.8%) | 84.38 (96.9%) | 84.23 (96.7%) | 86.81 (99.7%) |
| ARC-Challenge (0-shot) | 55.55 | 55.72 (100.3%) | 55.89 (100.6%) | 54.44 (98.0%) | 54.01 (97.2%) | 56.48 (101.7%) |
| Winogrande (5-shot) | 73.72 | 74.19 (100.6%) | 74.51 (101.1%) | 73.01 (99.0%) | 73.16 (99.3%) | 73.40 (99.6%) |
| KMMLU (5-shot, direct) | 58.39 | 58.05 (99.4%) | 58.51 (100.2%) | 58.26 (99.8%) | 57.41 (98.3%) | 56.96 (97.6%) |
| HAE-RAE (0-shot) | 69.48 | 69.11 (99.5%) | 69.39 (99.9%) | 70.21 (101.1%) | 68.47 (98.5%) | 67.09 (96.6%) |
| Average | 62.88 | 65.12 (103.6%) | 62.94 (100.1%) | 62.07 (98.7%) | 62.06 (98.7%) | 62.34 (99.1%) |
| Average without MMLU | 68.85 | 68.78 (99.9%) | 69.05 (100.3%) | 68.06 (98.9%) | 67.46 (98.0%) | 68.15 (99.0%) |
Note on MMLU: this task is scored on generated text (
mmlu_generative), so the score depends on whether the model answers in exactly the format the scorer expects (for MMLU only a bare answer letter on the first line counts). For this model it swings widely between builds of the same model (MMLU 32.2โ46.8), and only one quantized build, FP8-dynamic, scores well above the BF16 original (141.8%). This most likely reflects how each build formats its answers rather than quantization quality, but per-question outputs were not saved, so it was not checked answer by answer. The second average leaves it out.
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.4669 | 1.4506 (+1.1%) |
| Top-1 next-token agreement | 95.8% | 99.2% |
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: 12.4 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.5-9B-FP8-dynamic --max-model-len 32768
Query it:
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "axteam/Qwen3.5-9B-FP8-dynamic",
"messages": [{"role": "user", "content": "๋ํ๋ฏผ๊ตญ์ ์๋๋ ์ด๋์ธ๊ฐ์?"}],
"max_tokens": 512
}'
Offline inference in Python:
from vllm import LLM, SamplingParams
llm = LLM(model="axteam/Qwen3.5-9B-FP8-dynamic", max_model_len=32768)
params = SamplingParams(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)
Thinking mode is on by default in the chat template; to turn it off pass
chat_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 8 full-attention layers keep a KV cache, while its 24 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.5-9B-FP8-dynamic --kv-cache-dtype fp8
License
Quantized derivative of Qwen/Qwen3.5-9B (Apache-2.0). All original weights, tokenizer and chat template belong to the Qwen team.
ํ๊ตญ์ด ์์ฝ
Qwen/Qwen3.5-9B์ FP8 (W8A8) ์์ํ ๋น๋ ยท ์ ์ axteam
๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์๋ณธ ๋ชจ๋ธ | Qwen/Qwen3.5-9B |
| ์์ํ ๋ฐฉ์ | FP8 ๋์ ์์ํ (W8A8) |
| ์ ์ฅ ํ์ | compressed-tensors float-quantized (scheme FP8_DYNAMIC) |
| ๋ชจ๋ธ ๊ตฌ์กฐ | ํ์ด๋ธ๋ฆฌ๋ ์ดํ ์ (์ ํ ์ดํ ์ + ํ ์ดํ ์ ) ยท Dense ยท ๋ฉํฐ๋ชจ๋ฌ(๋น์ ) ยท MTP ํค๋ |
| ์ฉ๋ | ์ฝ 12.4 GB |
| ๋ณด์ ๋ฐ์ดํฐ | ์์ (๊ฐ์ค์น ์ค์ผ์ผ์ ๊ฐ์ค์น๋ง์ผ๋ก ๊ณ์ฐ, ํ์ฑํ ์ค์ผ์ผ์ ์คํ ์ ๊ณ์ฐ) |
์์ํ ์์ธ
- ๊ฐ์ค์น: FP8(E4M3), ์ถ๋ ฅ ์ฑ๋๋ณ ์ค์ผ์ผ
- ํ์ฑํ: ์คํ ์ ํ ํฐ๋ณ ๋์ FP8
- ์์ํ ์ ์ฐจ: PTQ(ํ์ต ํ ์์ํ, ์ฌํ์ต ์์), ๊ฐ์ค์น ์ค์ผ์ผ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ณ ํ์ฑํ ์ค์ผ์ผ์ ์คํ ์ ํ ํฐ๋ง๋ค ๊ณ์ฐ
- BF16 ์ ์ง: ๋น์ ํ์ยทํฌ์์ธต(
model.visual.*), MTP ํค๋(mtp.*), ๋ชจ๋ RMSNorm(๊ฒ์ดํธlinear_attn.norm์ ์ธ), ํ ํฐ ์๋ฒ ๋ฉ, LM ํค๋, SSM์ ์ ํ์ธต ์ธ ํ๋ผ๋ฏธํฐ(linear_attn.conv1dยทdt_bias) โlinear_attn.A_logยท๊ฒ์ดํธlinear_attn.norm์ ์๋ณธ๊ณผ ๊ฐ์ด FP32 ์ ์ง โ ์ ์ฒด ํ๋ผ๋ฏธํฐ์ ์ฝ 28% - ์๋ณธ ํ์ผ: ํ ํฌ๋์ด์ ยทchat templateยท์ ์ฒ๋ฆฌ ์ค์ ์ ์๋ณธ๊ณผ ๋์ผ(์๋ณธ์
generation_config.json์ด ์์ด ์ด ๋ฆฌํฌ์๋ ์์),config.json์ ์๋ณธ์quantization_config๋ธ๋ก๋ง ์ถ๊ฐ
ํ์ง (์ค์ธก)
- ์๋ณธ ๋๋น ์ถฉ์ค๋: PPL 1.4669 (์๋ณธ 1.4506, +1.1%, ๋ฎ์์๋ก ์๋ณธ์ ๊ฐ๊น์), ๋ค์ ํ ํฐ top-1 ์ผ์น์จ 95.8% (์๋ณธ ์์ฒด ๊ธฐ์ค๊ฐ 99.2%) โ ๋ด๋ถ ์์ดยทํ๊ตญ์ด ํผํฉ ํ๋กฌํํธ 100๊ฐ, ์๋ณธ(BF16)์ greedy ๋ต๋ณ์ ๊ธฐ์ค ํ ์คํธ๋ก ์ธก์
- ๋ฒค์น๋งํฌ ํ๊ท : 65.12 (์๋ณธ 62.88, 103.6%) โ MMLU(์์ฑํ)ยทGSM8KยทARC-ChallengeยทWinograndeยทKMMLUยทHAE-RAE 6์ข ํ๊ท , lm-evaluation-harness + vLLM, chat template ์๋ ์์ฑํ ํ๋กฌํํธ(๊ณผ์ ๋ณ 0ยท5-shot, ํ ์ฐธ๊ณ )ยทgreedy, ๋ชจ๋ ๋น๋๋ฅผ ๊ฐ์ ์ค์ ์ผ๋ก ์ธก์
- MMLU(์์ฑํ) ์ ์ธ ํ๊ท : 68.78 (์๋ณธ 68.85, 99.9%) โ MMLU(์์ฑํ)๋ ์์ฑํ ๋ต์ด ์ฑ์ ๊ธฐ๊ฐ ๊ธฐ๋ํ๋ ํ์ ๊ทธ๋๋ก์ฌ์ผ ์ ์๊ฐ ๋๋ ๊ณผ์ ; ์ด ๋ชจ๋ธ์์๋ ๊ฐ์ ๋ชจ๋ธ์ ๋น๋๋ผ๋ฆฌ MMLU(์์ฑํ) 32.2~46.8๋ก ํฌ๊ฒ ํ๋ค๋ฆฌ๊ณ FP8-dynamic ๋น๋ ํ๋๋ง ์๋ณธ๋ณด๋ค ํฌ๊ฒ ๋์(141.8%), ๋ต ํ์ ์ฐจ์ด๋ก ๋ณด์ด๋ ๋ฌธํญ๋ณ ์ถ๋ ฅ์ ์ ์ฅํ์ง ์์ ๋ฌธํญ ๋จ์๋ก๋ ํ์ธํ์ง ์์
- ํ๊ตญ์ด ๋ฒค์น๋งํฌ: KMMLU 58.05 (์๋ณธ 58.39, 99.4%) ยท HAE-RAE 69.11 (์๋ณธ 69.48, 99.5%)
- 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์์๋ง ํ์ธ)
- ๋ฉ๋ชจ๋ฆฌ: ๊ฐ์ค์น 12.4 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.5-9B-FP8-dynamic --max-model-len 32768โ OpenAI ํธํ API - Python:
LLM(model="axteam/Qwen3.5-9B-FP8-dynamic", max_model_len=32768).chat(...)โ ์ ์ฒด ์์๋ ์ ์์ด ๋ณธ๋ฌธ 'Usage (vLLM)' ์ ์ฐธ๊ณ - 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 ์บ์๋ ํ ์ดํ ์ 8๊ฐ ์ธต์๋ง ์๊ณ , ์ ํ ์ดํ ์ (Gated DeltaNet) 24๊ฐ ์ธต์ ์์ฒญ๋ณ ๊ณ ์ ํฌ๊ธฐ ์ํ๋ ์ด ์ต์ ์ผ๋ก ๋ฐ๋์ง ์์ โ ํ ์ดํ ์ 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:17:21 UTC(๋ฆฌ๋น์ f360b7a) ์ด์ ์ ๋ฐ์๋ค๋ฉดconfig.json๋ง ๋ค์ ๋ฐ์ ๊ฒ
๋ผ์ด์ ์ค
- ๋ผ์ด์ ์ค: Apache-2.0 โ ์๋ณธ ๋ชจ๋ธ์ ๋ผ์ด์ ์ค๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฆ
- ๊ถ๋ฆฌ: ์๋ณธ ๊ฐ์ค์นยทํ ํฌ๋์ด์ ยทchat template์ Qwen ํ(Alibaba) ์์ , ์ด ๋ฆฌํฌ๋ ์์ํ ํ์๋ฌผ