Новият Qwen 3.8 27b Dense -

coolice

Owner
Днес излезе новият Qwen 3.8 27b Dense модел


Qwen3.8-27BQwen3.6-27BQwen3.7-PlusMuse Glimmer-30BOpus4.6 Max
Coding
Agentic terminal coding
Terminal Bench 2.1 (Terminus)
73.063.464.051.778.2
Agentic coding
SWE-bench Pro
61.753.557.651.253.4
Repo-level code generation
NL2Repo-Bench
42.336.241.1--47.6
Agentic coding
DeepSWE 1.1
42.213.314.2----
Software engineering
QwenSWEBench
79.049.359.2--63.8
Agent
Long-horizon office work
CoWorkBench
70.761.065.1--68.2
Professional job tasks
JobBench
33.421.827.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.569.179.177.062.5
Scientific reasoning
GPQA Diamond
89.287.890.383.591.3
Multidisciplinary reasoning
HLE
30.824.034.722.040.0
Competitive coding
LiveCodeBench v6
90.383.989.6--88.8


Почнах да го тествам Билд изпилен за скорост с минимална загуба на качеството и опит за компенсиран с повече резинониг

за Asus Ascend GX10 (OEM DGX Spark) Blackwell !!! на други платформи няма да има NVFP4 предимството затова работете с нормалния gguf билд за llama.cpp






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}'

Как работи:
  1. MTP главите предлагат 2 (или N) токена бързо.
  2. Основният модел ги верифицира в един forward pass.
  3. Ако acceptance rate-ът е висок (типично 70–90%+ при Qwen3.x), получаваш няколко токена „почти безплатно“.
Предимство пред класически draft-model speculative decoding: няма нужда от отделен draft модел — всичко е вградено в самия checkpoint. Qwen3.8 (и Qwen3.5/3.6) са тренирани точно с MTP, затова работи отлично.


Работещ билд изчистени малко бегове който може да срещнете при пускането му с по проста команда българският е малко по дървен от 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 забега)
Prompt89 токена
Генерация512 токена
Време за 512 токена~26.9 сек
TTFT (до първи токен)минимален (< 0.1 сек)
Три забега дадоха 19.1 / 19.0 / 19.0 tok/s — изключително стабилно, без джитер.

Вижда се че NVFP4 къса обичайната връзка между скорост и памет

При генериране на токени (decode) процесът е почти винаги memory-bandwidth bound. За всеки нов токен трябва да се прочетат от паметта почти всички активни тегла на модела (и част от KV cache).

маx-speed-memory-model-size.png

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





 
Последно редактирано:

Резултати от преводи от англииски на български​

Python Бенчмарка не дава възможност MTP (Multi-Token Prediction) да покаже какво може, затовa направих малко преводи от англииски на български...


Сампъли от лога на на vLLM

Код:
APIServer pid=1) INFO 08-14 20:15:40 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.73, Accepted throughput: 30.49 tokens/s, Drafted throughput: 35.19 tokens/s, Accepted: 305 tokens, Drafted: 352 tokens, Per-position acceptance rate: 0.915, 0.818, Avg Draft acceptance rate: 86.6%
(APIServer pid=1) INFO 08-14 20:15:50 [loggers.py:310] Engine 000: Avg prompt throughput: 51.4 tokens/s, Avg generation throughput: 42.8 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.9%
(APIServer pid=1) INFO 08-14 20:15:50 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.70, Accepted throughput: 26.90 tokens/s, Drafted throughput: 31.59 tokens/s, Accepted: 269 tokens, Drafted: 316 tokens, Per-position acceptance rate: 0.905, 0.797, Avg Draft acceptance rate: 85.1%
(APIServer pid=1) INFO 08-14 20:16:00 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 45.2 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.9%
(APIServer pid=1) INFO 08-14 20:16:00 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.57, Accepted throughput: 27.59 tokens/s, Drafted throughput: 35.19 tokens/s, Accepted: 276 tokens, Drafted: 352 tokens, Per-position acceptance rate: 0.875, 0.693, Avg Draft acceptance rate: 78.4%
(APIServer pid=1) INFO 08-14 20:16:10 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 43.4 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.9%
(APIServer pid=1) INFO 08-14 20:16:10 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.49, Accepted throughput: 26.00 tokens/s, Drafted throughput: 34.80 tokens/s, Accepted: 260 tokens, Drafted: 348 tokens, Per-position acceptance rate: 0.833, 0.661, Avg Draft acceptance rate: 74.7%
(APIServer pid=1) INFO 08-14 20:16:20 [loggers.py:310] Engine 000: Avg prompt throughput: 51.4 tokens/s, Avg generation throughput: 38.9 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.7%
(APIServer pid=1) INFO 08-14 20:16:20 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.57, Accepted throughput: 23.70 tokens/s, Drafted throughput: 30.20 tokens/s, Accepted: 237 tokens, Drafted: 302 tokens, Per-position acceptance rate: 0.854, 0.715, Avg Draft acceptance rate: 78.5%
(APIServer pid=1) INFO 08-14 20:16:30 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 43.8 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.7%
(APIServer pid=1) INFO 08-14 20:16:30 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.49, Accepted throughput: 26.20 tokens/s, Drafted throughput: 35.19 tokens

(APIServer pid=1) INFO 08-14 20:37:00 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.25, Accepted throughput: 21.70 tokens/s, Drafted throughput: 34.80 tokens/s, Accepted: 217 tokens, Drafted: 348 tokens, Per-position acceptance rate: 0.713, 0.534, Avg Draft acceptance rate: 62.4%
(APIServer pid=1) INFO 08-14 20:37:10 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 43.6 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 75.1%
(APIServer pid=1) INFO 08-14 20:37:10 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.51, Accepted throughput: 26.19 tokens/s, Drafted throughput: 34.79 tokens/s, Accepted: 262 tokens, Drafted: 348 tokens, Per-position acceptance rate: 0.839, 0.667, Avg Draft acceptance rate: 75.3%
(APIServer pid=1) INFO 08-14 20:37:20 [loggers.py:310] Engine 000: Avg prompt throughput: 51.4 tokens/s, Avg generation throughput: 43.4 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 75.0%
(APIServer pid=1) INFO 08-14 20:37:20 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.69, Accepted throughput: 27.20 tokens/s, Drafted throughput: 32.20 tokens/s, Accepted: 272 tokens, Drafted: 322 tokens, Per-position acceptance rate: 0.894, 0.795, Avg Draft acceptance rate: 84.5%
(APIServer pid=1) INFO 08-14 20:37:30 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 44.5 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 75.0%
(APIServer pid=1) INFO 08-14 20:37:30 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.56, Accepted throughput: 27.09 tokens/s, Drafted throughput: 34.79 tokens/s, Accepted: 271 tokens(APIServer pid=1) INFO 08-14 20:37:40 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 43.1 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 75.0%
(APIServer pid=1) INFO 08-14 20:37:40 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.48, Accepted throughput: 25.69 tokens/s, Drafted throughput: 34.79 tokens/s, Accepted: 257 tokens, Drafted: 348 tokens, Per-position acceptance rate: 0.828, 0.649, Avg Draft acceptance rate: 73.9%
(APIServer pid=1) INFO 08-14 20:37:50 [loggers.py:310] Engine 000: Avg prompt throughput: 51.4 tokens/s, Avg generation throughput: 40.2 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.9%
(APIServer pid=1) INFO 08-14 20:37:50 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.66, Accepted throughput: 25.00 tokens/s, Drafted throughput: 30.20 tokens/s, Accepted: 250 tokens, Drafted: 302 tokens, Per-position acceptance rate: 0.901, 0.755, Avg Draft acceptance rate: 82.8%
(APIServer pid=1) INFO 08-14 20:38:00 [loggers.py:310] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 42.1 tokens/s, Running: 2 reqs, Waiting: 0 reqs, GPU KV cache usage: 3.4%, Prefix cache hit rate: 74.9%
(APIServer pid=1) INFO 08-14 20:38:00 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 2.39, Accepted throughput: 24.50 tokens/s, Drafted throughput: 35.19 tokens/s, Accepted: 245 tokens, Drafted: 352 tokens, Per-position acceptance rate: 0.784, 0.608, Avg Draft acceptance rate: 69.6%

Run 1 (20:15 – 20:16)​


ВремеGeneration t/sMean Acc. LengthAccepted t/sDrafted t/sAcceptance Rate
20:15:402.7330.4935.1986.6%
20:15:5042.82.7026.9031.5985.1%
20:16:0045.22.5727.5935.1978.4%
20:16:1043.42.4926.0034.8074.7%
20:16:2038.92.5723.7030.2078.5%
20:16:3043.82.4926.2035.19



Средни стойности (Run 1):


  • Generation: ~42.8 t/s
  • Mean Acc. Length: ~2.59
  • Acceptance Rate: ~80.7%



Run 2 (20:37 – 20:38)​


ВремеGeneration t/sMean Acc. LengthAccepted t/sDrafted t/sAcceptance Rate
20:37:002.2521.7034.8062.4%
20:37:1043.62.5126.1934.7975.3%
20:37:2043.42.6927.2032.2084.5%
20:37:3044.52.5627.0934.79
20:37:4043.12.4825.6934.7973.9%
20:37:5040.22.6625.0030.2082.8%
20:38:0042.12.3924.5035.1969.6%



Средни стойности (Run 2):
  • Generation: ~42.8 t/s
  • Mean Acc. Length: ~2.51
  • Acceptance Rate: ~74.8%
 
Направих и паралелен тест как би се справило OEM DGX Spark за inference ... Сетъпа е напълно вайабъл като скорост за малък офис...

Даже може ако сте решили че това ви трябва като таван на възможности за големина модела с който ще работие може да се направи по бързо със стар workstation class PC и две видеокарти 5060TI (Blackwell) с по 16ГБ който са станали по 800 евро 1та :oops:o_O🫣 имаше по 500 и нещо през април 16GBто ви но явно народа и за това се усети че може да ползва за локал АИ срещу малко повече от 1000 евро за две ...и картите са 200 ватови ще е по шумно от Spark, но не е за сървър руум и все още е бюджетно макар и със 600 евро повече от преди...




📊 Benchmark: 5 конкурентни връзки (512 токена всяка)​

connpromptgenttfttotaldecodeoverall
080512~0s27.3s18.7 tok/s18.7
175512~0s25.0s20.5 tok/s20.5
276512~0s30.7s16.7 tok/s16.7
372512~0s28.2s18.1 tok/s18.1
473512~0s30.3s16.9 tok/s16.9
Wall time: 30.7s | Общо токени: 2560

Ключови изводи​

  • Агрегирана скорост: 83.3 tok/s — почти 4.4× от solo (19 tok/s). Continuous batching-ът в vLLM работи както трябва.
  • Per-connection: 16.7–20.5 tok/s — всяка връзка е запазила ~90% от solo скоростта. Няма голямо деградиране под натоварване.
  • TTFT: минимален — пре-филинг-ът на 5-те промпта е отнема почти нищо, защото са кратки.
  • Разпределението е хомогенно — няма "задушена" връзка, vLLM-а разпределя batch-а равномерно.
Т.е. при 5 едновременни клиенти: всеки ще получава поносимите ~17-20 tok/s, а общият throughput на сървъра е 83 tok/s.
 
  • Like
Реакции: mid
Ако някой му е чудно какво е възможно с тези мъници (дето уж са силни на бенчмарк)

3games.jpg
три аркадни игри с 1 един промт javascript (минимални бъгове) 2 часа и 40 минути на АИ rig 4 х 3090 карти - около 40 токена на секунда 16:59 от видеото...

GB 10 (DGX Spark или ОЕМ) дори без предиктив за този урклоуд ще се справи за 5 часа при NVFP4 да ги кажем 6 и допълнителен промпт ако accuracy не е 97-99% ами падне до 92-97%, но ще харчи само 115 вата ток макс (може би около 50-70 вата ) обичайно за разлика от 1200+ вата на рига 4 х 3090... Платили сме повече за по-малка скорост от възможната на multi-GPU риг с по стари карти като 3090ките, но ми е тихо - висок WAF* и харчи малко...

И мога да оставя сесията която коди игри да си девелопва, докато се ползват останалите паралелни сесии при които няма загуба на скорост за правят нещо друго...

Grok верификация на твърдението:

Твърдението е в общи линии вярно като инженерен/практически claim:
  • 3 аркадни JS игри с 1 (добър) промпт + минимални бъгове е възможно.
  • Времената и скоростите на 4×3090 vs GB10 са пропорционални и съответстват на публични бенчмаркове.
  • Continuous batching + ниска консумация на GB10 + възможност за паралелни сесии без колапс на per-user скорост е точно сила на vLLM на този хардуер.

*WAF В хоумлаб общността се говори за Wife Acceptance Factor (WAF), понякога наричан и Wife Approval Factor или полушеговито wife tolerance index... Става дума за това колко голяма е вероятността жената/партньорът да одобри (или поне да толерира) новото ти оборудване спрямо силата на шума...

 
Последно редактирано:

Горе