GLM-5.3-Flash: 320B total parameters / 18B active

and this is the case ;)

can you have a look into that? GitHub - technigmaai/glm-5.3-flash-gb10-tp2-native: GLM-5.3-Flash NVFP4 on two NVIDIA GB10 nodes: native TP2, one container per node, display-backed KV and image input Ā· GitHub

Uh, what is ā€œCanadaā€ here. I’ve only been following this loosely lately and I’m really confused. Would love trying it as I’m mostly interested in accuracy as well.

Yeah, well I’ve been following it, and yet this is the first I’ve heard of it… I am perplexed tbh.

I’m going to ask that you adopt my ā€œRochdaleā€ fork istead:

HF: canada-quant/GLM-5.3-Flash-W4A16-MTP

I would totally be down to try it. I’ve hit a slight pause in my months long document processing task, so it would be a good time. The problem is that I do want to still keep a copy of the old Entrpi variant around, but my Spark(s) barely has/have any space left, so I’m gonna need to clear a lot out somehow, and I feel like I’ve looked under the cushion in almost every couch at this point. My poor 1TB drive has been thoroughly abused on this thing.

Question, does this still keep all of the usual OpenAI endpoints, so I can query it with curl and Open WebUI like normal? Supports tool calling fine, etc? Have seen people complain about that. Does it support the ā€œreasoning_effortā€ flag normally?

Otherwise yeah I’m going to definitely see if I can get it up and running, thanks.

I see, what engine are you using to run it? Or is it just on the HF page? Thanks.

sorry, forgot to mention:
eugr/spark-vllm-b12x:nightly-20260927 (vLLM 0.1.dev21510+g1794dcf18, digest sha256:42f762c0...84cd, native MTP

Hi all, we’re the canada-quant folks behind canada-quant/GLM-5.3-Flash-W4A16-MTP. Thanks @jetspark for the recommendation and the bits-per-byte numbers. Your component table matches how we built it: only the 36,288 routed-expert GEMMs are INT4 (GPTQ, symmetric, group size 128). Attention including the DSA indexer, dense layers 0–2, shared experts, router, embeddings/lm_head, the vision tower and the MTP layer all stay BF16.

One difference being the b12x nightly with native MTP isn’t the stack we validate on. Our Spark recipe uses the drafter we built:

The drafter matters most. On our 500-prompt holdout, the built-in MTP head accepts about 2.4–2.5 tokens per step. DFlash2-G accepts 3.68 at K=7; incoai’s reference drafter measured 3.63 on the same hardware.

What our recipe measures on 2Ɨ Spark (llama-benchy pp2048/tg128, single stream):

context depth 0 4K 65K 100K
decode t/s 31.4 ±3.5 30.7 15.3 10.0*

*The 100K cell is from the 09-26 grid run; the rest are from a quiet re-run on 09-28. The depth-0 cell is tg32.

  • Context: with DFlash2-G we serve 262K by default (366,749-token KV pool at 8 GiB fp8); the llama-benchy numbers above were run at 800K.
  • AIME 2026 (n=120, max thinking, 131K budget): 85.0% (102/120), vs 80.0% for EXL3 under the same config on the same pair.

Cold boot on our image is 6–10 min, so your 145 s with instanttensor + read_ahead_kb beats ours. Nice find.

@jetspark, if you can run the same llama-benchy grid on your b12x + MTP setup, we’d love to see it next to ours. We haven’t measured our weights on b12x (with MTP or our drafter), and it may well be faster.

For anyone using the b12x build: this checkpoint needs the ignore-list workaround from eugr/spark-vllm-docker#403. The broad self_attn regex is safe here because nothing under self_attn is quantized. The narrow version is re:.*\.self_attn\.(f_a_proj|f_b_proj|in_proj_qkvgfab)$.

We’ve been running it 100% flat-out for days generating synthetic data, with great results.

What would be the current most recommended GLM recipe for 2 sparks?

I know I said I mostly cared about quality, but 10 t/s at higher context is oof levels of slow, I can only assume it goes downhill from there, too. I guess I will try out these TensorRT ones first.

here we go:

context depth 0 4K 65K 100K
decode t/s 31.6 ±3.4 29.8 ±3.3 25.4 ±2.2 31.0 ±0.7

NOTE: gpu clock = 1700

cmd
tool-eval-bench   --base-url http://jetspark01:8045 \
   --perf-only --tokenizer canada-quant/GLM-5.3-Flash-W4A16-MTP \
   --benchy-runs 2 --depth 0,4000,65000,100000 \
   --concurrency 1,2
live monitoring

P.S. thanks for your quant :)

UPDATE:
I tried the canada-quant drafter hoping to free up some memory, since it’s way smaller than the built-in MTP head: 6 GB vs 15 GB. Turns out it does the opposite. It’s 8 full layers, and each one keeps its own uncompressed cache for the whole context, so on long chats that cache eats way more than the smaller weights save. My usable context dropped from about 930K tokens to 330K, and 512K didn’t fit anymore.
On top of that it was 20-30% slower in non English, though faster on English code. So I’m sticking with MTP.

Well holy moly, this thing is indeed really fast. Or at least it feels fast. Unfortunately TensorFold doesn’t seem to report ongoing generation numbers, so it’s hard to get any idea of how fast it’s going on average per second or something. Will now start trying it on my actual dataset. I’m just hoping the output quality has not degraded. For some reason people found that MiaAI had issues with not scoring as high as entrpi’s engine on code bench testing so I’m a bit wary about the quality. We shall see.

I switched from vllm to tensorfold without any modification and opencode and openwebui continued to just work.

Something that’s a bit weird: why does this default to a default max_tokens of ~32.7k?

That’s just really low. The kv cache size is over 1 million, so it’s just odd that it stops 1/30th of using it. I mean I guess that’s to make it easier to process 1m size contexts safely, so I guess that’s made for agentic work where it might need to keep a lot of previous work in context but each output could be low?

Either way for now I just bumped it to 1m for my ~120-150k token prompt size, but I guess to be safe I would set it to around 800k to give enough room for reasoning and then output. It’s kind of weird that the engine asks me this though I guess. VLLM just chugged along till each payload was done processing. I just noticed this one was stopping at almost exactly 100k chars of output every time which was mildly annoying because it was just silently botching every single request and I didn’t even know it.

Otherwise, still seems to be quite fast. I guess I will leave it open for a few weeks to see if it can just keep going like entrpi’s engine did.

Have tested and found that on the 9GiB there is early OOM. Shirnk KV cache to 7730941132 and it stay megastable during long run.

And this is the new king.

Here are the results:

GLM-5.3-Flash on 2ƗDGX Spark — variant T: technigmaai native TP2 (C6)

Follow-up to the K/K2/K-6144 series: this run moves from the kindlingai Mentat/Ray
serving stack to the technigmaai glm-5.3-flash-gb10-tp2-native recipe (@24ba8fb) —
native vLLM multiprocess TP2, no Mentat/Ray, display-reserved KV carveout (+1.79 GiB), and
same pinned model bytes as everything before: nvidia/GLM-5.3-Flash-NVFP4 (NVFP4 W4A4
routed experts, BF16 attention/shared/MTP) + incoai/GLM-5.3-Flash-DFlash2 (k=7) speculative.
Weight snapshots were reused from our kindlingai run (identical vLLM build) — zero re-download,
zero rebuild of ~90 GiB snapshots.

Profile (C6): MAX_NUM_BATCHED_TOKENS 6144 Ā· MAX_NUM_SEQS 6 Ā· KV_CACHE_MEMORY
7.2 GiB (7730941132 — matching our proven kindlingai pin, NOT the recipe’s riskier 9 GiB
default, see OOM note) Ā· max len 1,047,552 Ā· fp8_e4m3 KV Ā· DFlash2 k=7 Ā· TP2 over RoCE
(.23 head + .25 worker).

Headline — wall-time and score/hour first (our decision metric):
T tool-eval high 278 pts/hr (ties K2, beats K 274 and K-6144 257) and
max 205 pts/hr (beats K-6144 185, K2 207 about equal) — at quality high 92.0 / max 96.0,
the highest max score of the whole series (K 95.67, K-6144 95.0, K2 92.0).
Total wall for the 6-run tool-eval set = ~144 min (vs K-6144 157, K 147.9, K2 139.6).
Cold prefill +6% over K-6144 (2678 vs 2522 t/s), TTFT@262k āˆ’9% (100.4 vs 110.5 s).

Method (identical harness to the whole series): cold-prefill+gen sweep, 64 points,
4096 → 262 144 tokens, UNIQUE prompt per size (seed = size ⇒ radix cold), streamed SSE
first-byte TTFT, forced 256-token gen; tool-eval-bench 3Ɨ high + 3Ɨ max, seed 42, hardmode,
α 0.7, per-request reasoning_effort.

ā± Wall-time & utility (the decision metric)

Config stack high pts/hr high time/run high max pts/hr max time/run max total wall
T (this) technigmaai native TP2 92.0±0.0 278 19.8 min 96.0±0.0 šŸ† 205 28.1 min ~144 min
K-6144 kindlingai TP2 b.6144 92.0±0.0 257 21.5 min 95.0±0.0 185 30.8 min 157 min
K kindlingai TP2 b.4096 92.0±0.0 274 20.2 min 95.67±0.58 196 29.2 min 147.9 min
K2 Mia TensorFold Ɨ4 92.0±0.0 278 19.9 min 92.0±0.0 207 26.7 min 139.6 min
D eugr b12x 91.33±0.58 230 — 92.0±1.0 165 — —

(all n=3 except historical A/B; equal quality on high — the knob/topology moves only speed.)

ā± Cold-prefill sweep (64/64 ok, zero OOM on every config)

Config pp avg t/s gen avg t/s TTFT avg TTFT@262k KV pool (tokens)
T (new) 2678 42.7 49.8 s 100.4 s 1,215,513
K-6144 2522 38.2 53.7 s 110.5 s 1,165,254
K 2296 42.7 59.6 s 129.8 s 1,169,491
K2 Ā· TensorFold 1620 59.0 85.3 s 181.4 s 2,033,664

šŸ“ˆ Cold prefill per size (t/s) — T vs the field

size K (4096) K-6144 T Ī” T/K-6144 K2
4k 2411 2610 2571 āˆ’1% 1649
32k 2360 2681 2627 āˆ’2% 1765
64k 2366 2501 2655 +6% 1729
128k 2100 2552 2737 +7% —
196k 2271 2497 2672 +7% —
262k 2019 2372 2610 +10% 1445

T is the flattest prefill curve of the series: 2453–2784 t/s across the whole 4k–262k
range (median 2676), no sag toward the long end. At 262k it beats K-6144 by +10% and
TensorFold by +81%. The only T losses are small and in the 4k–32k cold start zone (constant
multiprocess overhead); from 40k up it wins every point (55/64 across prefill & TTFT).

āš— Generation (t/s, forced 256-tok single-stream cold)

K K-6144 T K2
avg over grid 42.7 38.2 42.7 59.0
@262k 39.1 38.8 40.4 51.8

T restores the generation throughput that the kindlingai 6144 bump gave away (42.7 ā‰ˆ K,
above K-6144’s 38.2) while keeping the 6144-sized prefill win — the best of both. Sprint
decode still served by DFlash2 k=7.

šŸ’¾ KV/context implications

  • KV pool 7.2 GiB = 1,215,513 tokens (fp8_e4m3, block 2304, LBHNC). Same pin as kindlingai
    ⇒ same 2.33Ɨ headroom over the 500k window.
  • OOM note: the technigmaai C6 recipe ships KV 9 GiB (9663676416), which on these
    unified-memory boxes overflows real host RAM at ~155k (vLLM RuntimeError: cancelled →
    EngineDeadError, client sees ConnectionError; boot log warns 130 GiB needed, 117 free).
    Pinning 7.2 GiB — the value proven across K/K-6144 — eliminates it. 300k sanity re-check
    passes clean, sweep completes 64/64, tool-eval 6/6 with zero swap pressure.
  • TensorFold still holds the biggest KV headroom (2.03M) but pays for it in loaded-cache
    parallel decode (llama-benchy d8192c4 ā‰ˆ 17 vs 26-28 t/s on kindlingai/T-style stacks).

šŸŽÆ Tool-eval details (n=3, seed 42, hardmode, per-request reasoning_effort)

variant high max spec-eff high/max (t/s)
T 92.0 ± 0.0 96.0 ± 0.0 63.4 / 65.1
K-6144 92.0 ± 0.0 95.0 ± 0.0 61.1 / 60.5
K 92.0 ± 0.0 95.67 ± 0.58 —
K2 92.0 ± 0.0 92.0 ± 0.0 —

T’s max-effort quality (96.0) is the best measured on this farm, at the fastest high-effort
time (19.8 min)
— and its spec-decoding efficiency is up across the board (63.4/65.1 vs
K-6144’s 61.1/60.5 t/s).

Takeaways

  • T is the new leader on both axes we care about: best max quality (96.0) and best
    high throughput-per-hour (278 pts/hr, tied with K2). No other config has done both.
  • Native TP2 (no Mentat/Ray) is strictly better than kindlingai’s Mentat flavor at equal
    knobs
    : +6% prefill, āˆ’9% TTFT@262k, +12% gen, +3 pts/hr high — on byte-identical weights,
    no code changes, seed-reused snapshots.
  • KV pin portability warning: take the recipe’s KV default with skepticism on
    unified-memory 2ƗGB10; reuse your previously-proven pin and verify with a long sanity
    prompt before the full grid.
  • If you are decode-bound with short prompts, TensorFold K2 (59 t/s gen) is still the pick;
    for long-prompt/RAG/agentic — T is now the fastest, highest-quality option.

Files / reproducibility

Bottom line: swapping the serving topologie (Mentat/Ray → native multiprocess TP2) on the
same model bytes, same batch-6144 profile, buys +6% prefill, āˆ’9% TTFT@262k, restores gen to
K levels, and posts the best max-effort score (96.0) of the whole A→T series — with zero
re-downloads and no OOM once KV is pinned to the proven 7.2 GiB.

Have you tried Giles’ engine above?


They are showing average prefill of around 1.85-2k. Generation speed seems to still be about the same.

Relinking engine for completeness:

Just wondering if you’re using an outdated tensorfold variant since your prefill numbers seem low. Overall, looking at your own charts, not sure if you can call it a clean win when Tensorfold variants are doing 38-39% faster gen though. I guess it depends on what you need the model to do.

I have used latest Mia’s variant on this Friday. Will try to check in the night gilesco’s version.

It’s output tokens, not max session length

I know, but that includes reasoning. On entrpi’s engine, my task could reason for over an hour per input. I guess my issue is that I have to (like actually have to) manage output length as well as session length on this manually?

Anyhow:

[tensorfold] done req-a786c249a3a6 prompt=10 cached=0 thinking=False tokens=2 sha=694aab7656bc finish=stop tok/s=22.4 ttft=0.12s prefill=0.12s rounds=1 accepted=0/1
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -
[tensorfold] done req-7e5ddeb869b2 prompt=124425 cached=0 thinking=True tokens=168270 sha=91774f45078c finish=stop tok/s=54.8 ttft=77.71s prefill=77.58s rounds=39095 accepted=129174/215637
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -
[tensorfold] done req-6aca84fc73fc prompt=112713 cached=0 thinking=True tokens=700500 sha=a698a468ee60 finish=length tok/s=82.7 ttft=69.76s prefill=69.65s rounds=47633 accepted=652866/702503
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -
[tensorfold] done req-e994cdb280b3 prompt=112713 cached=112704 thinking=True tokens=700500 sha=a698a468ee60 finish=length tok/s=83.2 ttft=0.13s prefill=0.10s rounds=47633 accepted=652866/702503
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -
[tensorfold] done req-d609df6aee1a prompt=112713 cached=112704 thinking=True tokens=700500 sha=a698a468ee60 finish=length tok/s=82.7 ttft=0.13s prefill=0.10s rounds=47633 accepted=652866/702503
[tensorfold] 127.0.0.1 "POST /v1/chat/completions HTTP/1.1" 200 -

I woke up to find out that it hadn’t completed a single document outside of the first one. It proceeded to do long-form looping for the entire rest of the time and didn’t finish a single one.

grep '12049362 has' glm_logs_21.log |wc -l
510

I’ll restart to see if it was just a bad scenario exacerbated by repeated cache hits which then caused it to do that over and over again… but it was very clearly looping to the exact same point multiple times. Even if it was going fast, I would have also finished multiple documents by that point on the other engine without the looping. To be fair, it’s a slightly tweaked version of my prompt meant to try to find something different, so that can easily cause looping.

Just increase to the size you need I guess. It was working for 8 hours non stop today running datamining on 4 different computers for me today (80 cores total to parallel massive work corpus)and building code, mending it, documenting, sending telegram notifications. No looping, no going crazy. BTW MediaLLMProxy has a solution for long reasoning and looping - check it out in my GitHub.