coolice
Owner
Днес излезе новият Qwen 3.8 27b Dense модел
Почнах да го тествам Билд изпилен за скорост с минимална загуба на качеството и опит за компенсиран с повече резинониг
за Asus Ascend GX10 (OEM DGX Spark) Blackwell !!! на други платформи няма да има NVFP4 предимството затова работете с нормалния gguf билд за llama.cpp
Работещ билд изчистени малко бегове който може да срещнете при пускането му с по проста команда българският е малко по дървен от Q3.6 35b a3b Q8 но е поносим
Резултати
Измерих го на живо — ето резултатите от твоя vLLM сървър (Qwen 3.8 27B NVFP4 на localhost:8080):
Три забега дадоха 19.1 / 19.0 / 19.0 tok/s — изключително стабилно, без джитер.
Вижда се че NVFP4 къса обичайната връзка между скорост и памет
При генериране на токени (decode) процесът е почти винаги memory-bandwidth bound. За всеки нов токен трябва да се прочетат от паметта почти всички активни тегла на модела (и част от KV cache).

Асуса е 273GB/s a модела е 27Б Плътен - вместо =10 токена на секунда в случая имаме 19 устойчиви
| Qwen3.8-27B | Qwen3.6-27B | Qwen3.7-Plus | Muse Glimmer-30B | Opus4.6 Max | |
|---|---|---|---|---|---|
| Coding | |||||
| Agentic terminal coding Terminal Bench 2.1 (Terminus) | 73.0 | 63.4 | 64.0 | 51.7 | 78.2 |
| Agentic coding SWE-bench Pro | 61.7 | 53.5 | 57.6 | 51.2 | 53.4 |
| Repo-level code generation NL2Repo-Bench | 42.3 | 36.2 | 41.1 | -- | 47.6 |
| Agentic coding DeepSWE 1.1 | 42.2 | 13.3 | 14.2 | -- | -- |
| Software engineering QwenSWEBench | 79.0 | 49.3 | 59.2 | -- | 63.8 |
| Agent | |||||
| Long-horizon office work CoWorkBench | 70.7 | 61.0 | 65.1 | -- | 68.2 |
| Professional job tasks JobBench | 33.4 | 21.8 | 27.6 | -- | -- |
| Frontier agentic tasks Agents' Last Exam | Pass@1 20.4 Score 42.9 | Pass@1 10.6 Score 27.3 | Pass@1 13.2 Score 33.6 | -- | -- |
| General | |||||
| Instruction following IFBench | 79.5 | 69.1 | 79.1 | 77.0 | 62.5 |
| Scientific reasoning GPQA Diamond | 89.2 | 87.8 | 90.3 | 83.5 | 91.3 |
| Multidisciplinary reasoning HLE | 30.8 | 24.0 | 34.7 | 22.0 | 40.0 |
| Competitive coding LiveCodeBench v6 | 90.3 | 83.9 | 89.6 | -- | 88.8 |
Почнах да го тествам Билд изпилен за скорост с минимална загуба на качеството и опит за компенсиран с повече резинониг
за Asus Ascend GX10 (OEM DGX Spark) Blackwell !!! на други платформи няма да има NVFP4 предимството затова работете с нормалния gguf билд за llama.cpp
unsloth/Qwen3.8-27B-NVFP4 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
huggingface.co
NVFP4 е NVIDIA-ов 4-bit floating-point формат (E2M1: 1 sign + 2 exponent + 1 mantissa), оптимизиран специално за Blackwell архитектурата (RTX 50-серия, B200, GB200 и т.н.).
Какво прави NVFP4 специален
- Използва micro-block scaling: блокове от 16 елемента с FP8 (E4M3) scale + опционален глобален FP32 scale. Това дава много по-добра точност от обикновен INT4 или по-стария MXFP4 (който ползва блокове от 32 и по-груби scales).
- Native хардуерна поддръжка в Tensor Cores на Blackwell → реално ускорение, не само компресия.
- Намалява паметта ~3.5× спрямо FP16 и ~1.8× спрямо FP8, като запазва много висока accuracy (често 97–99% recovery при по-големи модели).
- Unsloth Dynamic V3.0 (използван в този checkpoint) допълнително подобрява качеството на квантизацията.
Резултатът: моделът става значително по-лек, по-бърз (особено при memory-bound сценарии) и позволява по-дълъг контекст / повече concurrency на същата VRAM.
MTP (Multi-Token Prediction)
Това е вграден speculative decoding механизъм. Моделът е трениран с допълнителни „глави“ (MTP heads), които предсказват няколко бъдещи токена наведнъж.
В vLLM се включва така:
Bash
Код:--speculative-config '{"method":"mtp","num_speculative_tokens":2}'
Как работи:
Предимство пред класически draft-model speculative decoding: няма нужда от отделен draft модел — всичко е вградено в самия checkpoint. Qwen3.8 (и Qwen3.5/3.6) са тренирани точно с MTP, затова работи отлично.
- MTP главите предлагат 2 (или N) токена бързо.
- Основният модел ги верифицира в един forward pass.
- Ако acceptance rate-ът е висок (типично 70–90%+ при Qwen3.x), получаваш няколко токена „почти безплатно“.
Работещ билд изчистени малко бегове който може да срещнете при пускането му с по проста команда българският е малко по дървен от Q3.6 35b a3b Q8 но е поносим
Код:
docker run -d --name qwen38-nvfp4 \
--restart unless-stopped \
--gpus all \
--ipc=host \
--network host \
-v ~/models/Qwen3.8-27B-NVFP4:/model \
-e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
vllm/vllm-openai:nightly \
--model /model \
--served-model-name qwen3.8-27b-nvfp4 \
--host 0.0.0.0 \
--port 8080 \
--trust-remote-code \
--kv-cache-dtype fp8 \
--gpu-memory-utilization 0.68 \
--max-model-len 262144 \
--max-num-seqs 8 \
--max-num-batched-tokens 8192 \
--enable-chunked-prefill \
--enable-prefix-caching \
--attention-backend flashinfer \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--reasoning-parser qwen3 \
--speculative-config '{"method":"mtp","num_speculative_tokens":2}'
Резултати
Код:
a//tmp/tps_bench.py → b//tmp/tps_bench.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python3
+"""Benchmark tokens/sec for the vLLM server via streaming chat completions."""
+import json
+import time
+import urllib.request
+import sys
+
+URL = "http://localhost:8080/v1/chat/completions"
+
+def run_once(max_tokens: int, prompt: str) -> dict:
+ body = {
+ "model": "qwen3.8-27b-nvfp4",
+ "messages": [{"role": "user", "content": prompt}],
+ "max_tokens": max_tokens,
+ "temperature": 0.0,
+ "stream": True,
+ "stream_options": {"include_usage": True},
+ }
+ req = urllib.request.Request(
+ URL,
+ data=json.dumps(body).encode(),
+ headers={"Content-Type": "application/json"},
+ )
+ t0 = time.perf_counter()
+ ttft = None
+ n_content_chunks = 0
+ usage = None
+ with urllib.request.urlopen(req, timeout=600) as resp:
+ for raw in resp:
+ line = raw.decode().strip()
+ if not line or not line.startswith("data:"):
+ continue
+ data = line[5:].strip()
+ if data == "[DONE]":
+ break
+ obj = json.loads(data)
+ if ttft is None:
+ # first chunk that carries content delta
+ choices = obj.get("choices") or []
+ if choices and (choices[0].get("delta") or {}).get("content"):
+ ttft = time.perf_counter() - t0
+ n_content_chunks += 1
+ else:
+ choices = obj.get("choices") or []
+ if choices and (choices[0].get("delta") or {}).get("content"):
+ n_content_chunks += 1
+ if obj.get("usage"):
+ usage = obj["usage"]
+ total = time.perf_counter() - t0
+
+ if usage and usage.get("completion_tokens"):
+ gen_tokens = usage["completion_tokens"]
+ else:
+ gen_tokens = n_content_chunks # fallback: ~1 token/chunk in vLLM
+
+ ttfb = ttft if ttft is not None else 0
+ decode_time = max(total - ttfb, 1e-6)
+ return {
+ "prompt_tokens": (usage or {}).get("prompt_tokens"),
+ "completion_tokens": gen_tokens,
+ "ttft_s": round(ttfb, 3),
+ "total_s": round(total, 3),
+ "decode_tps": round(gen_tokens / decode_time, 1),
+ "overall_tps": round(gen_tokens / total, 1),
+ }
+
+if __name__ == "__main__":
+ max_tokens = int(sys.argv[1]) if len(sys.argv) > 1 else 512
+ n_runs = int(sys.argv[2]) if len(sys.argv) > 2 else 3
+ prompt = (
+ "Write a detailed technical explanation of how vLLM's continuous batching "
+ "works, covering PagedAttention, prefix caching, and the scheduler loop. "
+ "Be thorough and use code examples where helpful."
+ )
+ results = []
+ for i in range(n_runs):
+ r = run_once(max_tokens, prompt)
+ results.append(r)
… omitted 8 diff line(s) across 1 additional file(s)/section(s)
Измерих го на живо — ето резултатите от твоя vLLM сървър (Qwen 3.8 27B NVFP4 на localhost:8080):
Benchmark резултати
| Метрика | Стойност |
|---|---|
| Decode скорост | ~19.0 токена/сек (стабилно на 3 забега) |
| Prompt | 89 токена |
| Генерация | 512 токена |
| Време за 512 токена | ~26.9 сек |
| TTFT (до първи токен) | минимален (< 0.1 сек) |
Вижда се че NVFP4 къса обичайната връзка между скорост и памет
При генериране на токени (decode) процесът е почти винаги memory-bandwidth bound. За всеки нов токен трябва да се прочетат от паметта почти всички активни тегла на модела (и част от KV cache).

Асуса е 273GB/s a модела е 27Б Плътен - вместо =10 токена на секунда в случая имаме 19 устойчиви
Последно редактирано: