Davidmg0815 commited on
Commit
4c836a0
·
verified ·
1 Parent(s): ec0a317

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +181 -0
README.md ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ license_link: https://huggingface.co/Qwen/Qwen3.8-27B/blob/main/LICENSE
4
+ base_model:
5
+ - Qwen/Qwen3.8-27B
6
+ base_model_relation: quantized
7
+ pipeline_tag: image-text-to-text
8
+ library_name: llama.cpp
9
+ language:
10
+ - de
11
+ - en
12
+ tags:
13
+ - gguf
14
+ - llama.cpp
15
+ - mtp
16
+ - speculative-decoding
17
+ - qwen3
18
+ - multimodal
19
+ ---
20
+
21
+ # Qwen3.8-27B GGUF — **mit separatem MTP-Draft**
22
+
23
+ GGUF-Konvertierung von [Qwen/Qwen3.8-27B](https://huggingface.co/Qwen/Qwen3.8-27B),
24
+ gebaut am 14.08.2026 aus den **BF16**-Originalgewichten.
25
+
26
+ Der Grund für dieses Repo ist die Datei **`qwen3.8-27b-MTP-Q8_0.gguf`**: der
27
+ Multi-Token-Prediction-Kopf als eigenständiges Draft-Modell, direkt nutzbar mit
28
+ `--spec-type draft-mtp`. Die MTP-Gewichte stecken im Upstream-Checkpoint
29
+ (`mtp_num_hidden_layers` in der `config.json`), werden von den üblichen
30
+ GGUF-Repos aber nicht als getrennte Datei ausgeliefert — und ohne getrennte
31
+ Datei kann `llama-server` sie nicht als Draft laden.
32
+
33
+ **Es bringt Faktor 1,6 bis 2,7.** Gemessen, nicht geschätzt — siehe unten.
34
+
35
+ ## Dateien
36
+
37
+ | Datei | Größe | BPW | Zweck |
38
+ |---|---|---|---|
39
+ | `qwen3.8-27b-Q8_0.gguf` | 27,3 GB | 8,50 | Zielmodell — **empfohlen** |
40
+ | `qwen3.8-27b-Q6_K.gguf` | 21,0 GB | 6,57 | kleinere Alternative |
41
+ | `qwen3.8-27b-MTP-Q8_0.gguf` | 3,0 GB | — | **MTP-Draft** für spekulatives Dekodieren |
42
+ | `qwen3.8-27b-mmproj-F16.gguf` | 0,9 GB | — | Vision/Video-Projektor |
43
+
44
+ Die MTP-Tensoren sind aus den Zielmodellen **entfernt** (`--no-mtp`) und liegen
45
+ ausschließlich in der Draft-Datei. Ziel- und Draft-Datei gehören zusammen.
46
+
47
+ **Warum Q8_0 empfohlen ist, obwohl es größer ist:** In der Messung war es
48
+ durchgehend **schneller** als Q6_K — 39,5 gegen 32,8 t/s bei Fließtext, gleiche
49
+ Einstellungen. Die k-Quant-Blockstruktur von Q6_K braucht pro Gewicht mehr
50
+ Rechenschritte zum Entpacken als das schlichtere Q8_0. Mehr Bytes, weniger
51
+ Arbeit. Q8_0 ist also gleichzeitig schneller *und* genauer.
52
+
53
+ ## Verwendung
54
+
55
+ ```bash
56
+ llama-server \
57
+ -m qwen3.8-27b-Q8_0.gguf \
58
+ --mmproj qwen3.8-27b-mmproj-F16.gguf \
59
+ -md qwen3.8-27b-MTP-Q8_0.gguf \
60
+ --spec-type draft-mtp --spec-draft-n-max 3 --spec-draft-ngl 99 \
61
+ --ctx-size 97000 --parallel 1 \
62
+ --n-gpu-layers 99 --tensor-split 1,1,1 \
63
+ --cache-type-k q8_0 --cache-type-v q8_0 \
64
+ --flash-attn on --jinja
65
+ ```
66
+
67
+ Ohne Spekulation einfach `-md` und die drei `--spec-*`-Schalter weglassen.
68
+ Ohne Bildeingabe zusätzlich `--mmproj` weglassen.
69
+
70
+ ## Was MTP tatsächlich bringt
71
+
72
+ Beide Läufe mit **identischer** Konfiguration (Q8_0, 97K Kontext, eine Session),
73
+ einziger Unterschied ist das Draft-Modell. Deutsche Prompts, je 2–3 Durchgänge,
74
+ ausgewertet wird der Median. Die Zahlen kommen aus `timings.predicted_per_second`
75
+ bzw. `timings.draft_n` / `draft_n_accepted`, die `llama-server` pro Anfrage
76
+ selbst meldet.
77
+
78
+ | Textsorte | ohne Draft | **mit Draft** | **Faktor** | Draft-Trefferquote |
79
+ |---|---|---|---|---|
80
+ | Wiederholung | 22,9 t/s | **62,0 t/s** | **2,71×** | 85,0 % |
81
+ | Aufzählung | 23,0 t/s | **61,6 t/s** | **2,68×** | 93,1 % |
82
+ | Übersetzung | 22,9 t/s | **51,8 t/s** | **2,26×** | 70,9 % |
83
+ | Struktur / JSON | 23,0 t/s | **47,6 t/s** | **2,07×** | 59,7 % |
84
+ | Fachtext | 23,0 t/s | **41,7 t/s** | 1,81× | 48,0 % |
85
+ | Code | 23,0 t/s | **41,1 t/s** | 1,79× | 48,9 % |
86
+ | Fließtext | 22,9 t/s | **39,5 t/s** | 1,72× | 44,5 % |
87
+ | Kreativtext | 23,0 t/s | **35,9 t/s** | **1,56×** | 37,4 % |
88
+
89
+ Gesamt über alle Textsorten: **57,3 % Trefferquote** (4.491 von 7.842
90
+ Draft-Token).
91
+
92
+ ### Der wichtigste Befund
93
+
94
+ **Ohne Draft ist die Rate völlig flach — 22,9 bis 23,0 t/s, egal was man
95
+ generiert.** Mit Draft spreizt sie sich um Faktor 1,7 auseinander, weil die
96
+ Trefferquote massiv an der Textsorte hängt: vorhersagbarer Text wird zu über
97
+ 90 Prozent korrekt geraten, freier Kreativtext nur zu gut einem Drittel.
98
+
99
+ Wer MTP an einem Aufzählungs-Benchmark misst, kommt auf 2,7× und überschätzt
100
+ den Nutzen für normale Chatlast deutlich. Der realistische Wert für
101
+ Fließtext-Dialog liegt bei **rund 1,7×**.
102
+
103
+ ### Was der Draft kostet
104
+
105
+ * **3,0 GB** auf der Platte
106
+ * **rund 2,7 GB VRAM** (`[spec] estimated memory usage of draft model is
107
+ 2678.78 MiB` bei 97K Kontext; 1.953 MiB bei 4K)
108
+ * Ladezeit steigt kaum — 7 bis 27 Sekunden je nach Kontextgröße
109
+
110
+ Deutlich mehr als etwa der Gemma-4-12B-Draft mit 0,5 GB. Wer knapp an VRAM ist,
111
+ muss das einplanen.
112
+
113
+ ## Testaufbau
114
+
115
+ * 3× NVIDIA RTX 3080 20 GB — **Ampere, SM 8.6**
116
+ * AMD EPYC 7F32, 8 Kerne / 16 Threads
117
+ * llama.cpp Build **10423** (`a94d563ed`), Container `ghcr.io/ggml-org/llama.cpp:full-cuda`
118
+ * `--tensor-split 1,1,1`, KV-Cache `q8_0`, `--flash-attn on`
119
+ * Eine Session (`--parallel 1`), 97.024 Token Kontext
120
+ * Belegt: 31,2 GB von 60 GB — Modell 27,3 + Draft 2,7 + KV/Puffer
121
+
122
+ Der Kontext ist praktisch gratis: dieselbe Konfiguration mit nur 4K statt 97K
123
+ lieferte im Rahmen der Messstreuung dieselben Werte (58,8 gegen 60,5 t/s bei
124
+ Aufzählungen). Man kann den großen Kontext also mitnehmen, ohne Durchsatz zu
125
+ bezahlen.
126
+
127
+ ## Wie diese Dateien gebaut wurden
128
+
129
+ ```bash
130
+ # Zielmodell ohne MTP-Tensoren
131
+ convert_hf_to_gguf.py Qwen3.8-27B/ --outfile tmp-BF16.gguf --outtype bf16 --no-mtp
132
+
133
+ # nur der MTP-Kopf, als Draft
134
+ convert_hf_to_gguf.py Qwen3.8-27B/ --outfile qwen3.8-27b-MTP-Q8_0.gguf --outtype q8_0 --mtp
135
+
136
+ # Vision/Video-Projektor
137
+ convert_hf_to_gguf.py Qwen3.8-27B/ --outfile qwen3.8-27b-mmproj-F16.gguf --outtype f16 --mmproj
138
+
139
+ # quantisieren
140
+ llama-quantize tmp-BF16.gguf qwen3.8-27b-Q8_0.gguf Q8_0 16
141
+ llama-quantize tmp-BF16.gguf qwen3.8-27b-Q6_K.gguf Q6_K 16
142
+ ```
143
+
144
+ Die Flags `--mtp` und `--no-mtp` sind neu; ältere llama.cpp-Builds kennen sie
145
+ nicht. Die Architektur `Qwen3_5ForConditionalGeneration` (Qwen3.8 nutzt sie
146
+ unverändert weiter) erbt `supports_mtp_export = True` über
147
+ `Qwen3_5TextModel → _LinearAttentionVReorderBase → Qwen3NextModel → _QwenMtpMixin`.
148
+
149
+ Quelle: `Qwen/Qwen3.8-27B` in **BF16** (51,3 GB, 16,00 BPW), nicht das
150
+ FP8-Release — also **keine** doppelte Quantisierung.
151
+
152
+ ## Zwei Hinweise für Ampere-Besitzer
153
+
154
+ **FP8 läuft auf Ampere nicht nativ.** SM 8.6 hat keine FP8-Tensorcores, die gibt
155
+ es erst ab SM 8.9. Qwens FP8-Release lässt sich dort nur dequantisiert fahren —
156
+ Speicher gespart, Tempo nicht. Für GGUF ist das gegenstandslos, weil `Q8_0` und
157
+ `Q6_K` reine Integer-Formate mit nativen Ampere-Kernen sind.
158
+
159
+ **vLLM scheitert hier an drei GPUs.** Das Modell hat 24 Attention-Heads, aber
160
+ nur **4 KV-Heads**. vLLM verlangt, dass `tensor_parallel_size` die KV-Head-Zahl
161
+ teilt — 4 durch 3 geht nicht auf. Bleiben TP=2 und damit eine ungenutzte Karte.
162
+ llama.cpp kennt das Problem nicht, weil `--tensor-split` Layer verteilt statt
163
+ Attention-Köpfe. **Für ungerade GPU-Zahlen ist llama.cpp hier der einzige Weg,
164
+ alle Karten zu nutzen.**
165
+
166
+ ## Reproduzieren
167
+
168
+ Das Messkript ist beigelegt (`bench_mtp.py`, deutsche Prompts über acht
169
+ Textsorten, Median aus N Durchgängen):
170
+
171
+ ```bash
172
+ python3 bench_mtp.py --port 8290 --runs 3 --max-tokens 300 --out ergebnis.md
173
+ ```
174
+
175
+ Einzelmessungen schwanken um etwa ±6 Prozent, deshalb Median statt Einzelwert.
176
+
177
+ ## Lizenz
178
+
179
+ Apache 2.0, wie das Basismodell. Alle Rechte am Modell liegen beim Qwen-Team /
180
+ Alibaba Cloud. Dieses Repo enthält ausschließlich formatkonvertierte Gewichte,
181
+ kein zusätzliches Training und keine Änderung am Verhalten.