Record no-spec ubatch benchmark

This commit is contained in:
Frank
2026-08-25 01:29:49 -07:00
parent f13124f977
commit 37fb420fcd
3 changed files with 40 additions and 4 deletions
+6 -2
View File
@@ -75,8 +75,12 @@ On Dankserver the available buffer types are `CPU` and `CUDA0`.
MoE model with a bundled MTP head -> native `draft-mtp`. The head is MoE model with a bundled MTP head -> native `draft-mtp`. The head is
auto-detected from the target (b10121 creates the MTP draft context against auto-detected from the target (b10121 creates the MTP draft context against
the model file). ngram under MTP hurts on this family; MTP alone is the the model file). ngram under MTP hurts on this family; MTP alone was
proven best. `--spec-draft-n-max 4` is the knee. previously selected for the production configuration. A later 8K API
benchmark found that this MTP path produced lower generation throughput than
`--spec-type none` for that workload, so speculative decoding should be
re-evaluated before treating it as optimal. `--spec-draft-n-max 4` remains the
configured value.
``` ```
--spec-type draft-mtp --spec-type draft-mtp
+2 -1
View File
@@ -128,7 +128,8 @@ binary with expert tensors selected by an explicit `--override-tensor`
regex. Expert tensors from full-attention blocks 27 and 31 and the regex. Expert tensors from full-attention blocks 27 and 31 and the
output-adjacent blocks 33 through 40 stay on CUDA; other expert tensors are output-adjacent blocks 33 through 40 stay on CUDA; other expert tensors are
CPU-resident. The service uses 7 CPU threads, native `draft-mtp` speculative CPU-resident. The service uses 7 CPU threads, native `draft-mtp` speculative
decoding, f16 KV, context 491520 (3 slots of 163840 each), batch decoding (under re-evaluation after an 8K no-spec benchmark), f16 KV, context
491520 (3 slots of 163840 each), batch
4096, ubatch 2048, and `--no-mmap`. The unit is 4096, ubatch 2048, and `--no-mmap`. The unit is
`scripts/frank-default-small.service`. It launches through `scripts/frank-default-small.service`. It launches through
`scripts/serve-frank-small.sh`, which reads tunables from `scripts/serve-frank-small.sh`, which reads tunables from
+32 -1
View File
@@ -136,12 +136,43 @@ context pool.
If decode speed matters more than prefill, swap to `ncmoe 32 - ubatch 1024` If decode speed matters more than prefill, swap to `ncmoe 32 - ubatch 1024`
(generation about 48.7 t/s, prefill about 766 t/s, about 1.0 GiB headroom). (generation about 48.7 t/s, prefill about 766 t/s, about 1.0 GiB headroom).
## Ornith Q6_K — 8K `ubatch` Sweep Without Speculation
Run date: 2026-08-25. This controlled sweep used the active Ornith Q6_K model
and hybrid expert placement, but explicitly disabled speculative decoding with
`--spec-type none`. It used one slot, an 8192-token context, a fixed logical
`--batch-size 4096`, prompt caching disabled, and one unique approximately
8K-token prompt per point. The production service was stopped during the
sweep and automatically restarted afterward.
| `ubatch` | Prompt tokens/s | Generation tokens/s | CUDA compute reservation |
|---:|---:|---:|---:|
| 1024 | 1944 | 53.91 | 248 MiB |
| 1280 | 2030 | 53.87 | 248 MiB |
| 1536 | 2190 | 53.66 | 248 MiB |
| 1792 | 2203 | 53.69 | 248 MiB |
| 2048 | 2423 | 53.80 | 248 MiB |
Prefill improves through `ubatch=2048`, while generation is effectively flat.
The 8K prompt sweep therefore favors `ubatch=2048` as the balanced point; a
larger value was not tested in this corrected no-spec run.
The same workload with `draft-mtp` enabled produced approximately 26.8–35.2
generation tokens/s at these `ubatch` values, with variable draft acceptance.
The no-spec path produced approximately 53.7–53.9 generation tokens/s. This
means MTP was a net throughput loss for this workload and configuration,
despite accepting draft tokens. The production service remains on MTP until a
separate decision is made; acceptance count alone is not sufficient to select
speculation.
## Limitations ## Limitations
llama-bench measures raw decode and prefill. It does not run speculative llama-bench measures raw decode and prefill. It does not run speculative
decoding, parallel slots, or the mmproj vision tower. The live service adds decoding, parallel slots, or the mmproj vision tower. The live service adds
those on top. The VRAM model uses a fixed 2.2 GiB overhead estimate; the those on top. The VRAM model uses a fixed 2.2 GiB overhead estimate; the
real overhead varies a little with load. real overhead varies a little with load. The Ornith sweep above used the
OpenAI-compatible server API rather than `llama-bench`, and its throughput
includes the server's timing instrumentation.
## See Also ## See Also