Pinned Tweet
I got a 1T (trillion) parameter model running on my MacBook Pro.
Kimi-K2. 1.029T params.
~1 TB raw weights.
524 GB converted.
~1.7 tok/s.
Yesterday it was 671B. Today it's 1T.
Same laptop. Same M4 Max. No cloud.
When I say we: I mean Claude and me.
Daniel Isaac retweeted
ive been messing around with ways to make Claude Code use fewer tokens (so I stop hitting my limit so early 😅)
one thing I noticed is how many tokens it wastes searching through files just to understand a repo
this weekend I hacked together a tool that gives it a codebase map instead. tested it on 6 repos and it actually decreased token usage quite a bit 🧵
i proved a post-trained 600M parameter model outperforms a 27B parameter model. three expert-labelled decision domains, same prompt, same letter readout, same box
Qwen3-0.6B fine-tuned vs Qwen3.8-27B off the shelf, zero-shot, test accuracy
NOAA space weather forecasts: 0.92 vs 0.64
UK Airprox board reports: 0.56 vs 0.43
typed-decisions benchmark: 0.77 vs 0.72
being transparent about what this is and is not:
the 0.6B is the April 2025 Qwen3 generation. the 27B is Qwen3.8, the current flagship.
older and 45x smaller
both ran in bf16 through the same loader. no quantization on either side
the 27B is off the shelf, zero-shot with its chat template. the 0.6B saw the training split. that is the point, not a loophole
before training the 0.6B sat at or below the majority class on all three. 0.30 on typed-decisions, 0.29 on airprox
trained on one DGX Spark. full fine-tune, 3 epochs, batch 16, 5.6 GB peak memory. 2.9 GPU hours for all three models, one seed each. headline numbers are means over 3 seeds
19 ms per decision vs 504 ms for the 27B on 500-token prompts. 26x faster
the thesis: small models can be fine-tuned, then pruned and quantized, to beat much larger models inside a specific domain. on-prem, cloud, ideally on the edge device itself. this run is the fine-tune leg. pruning and quantization are next
datasets are public so you can rerun it: NOAA SWPC daily reports and forecasts, UK Airprox Board monthly reviews, LocalLLaMA typed-decisions on Hugging Face. airprox is research use only
more to come..
i trained a Laya decision model that's 2.6x faster on my DGX Spark
Laya (Convai - original): 421M | 0.787 | 18.8 ms
mine: 144M | 0.780 | 7.2 ms
same accuracy
3x smaller
2.6x lower latency
same scorer head, same trainer
i swapped the encoder for JHU's mmBERT-small
26 minutes of training on one box
four encoders under the same Laya head:
ModernBERT-base 164M -> 0.619
Ettin-150m 164M -> 0.719
mmBERT-small 144M -> 0.759 at 4 epochs
mmBERT-small -> 0.780 at 12 epochs, three seeds, sd 0.002
the head starts random so epochs were the lever. 4 -> 12 bought 2.2 points
honest bits - ModernBERT-base is the same family as Laya's own encoder and i still can't explain why it lands 16 points lower. one aggressive-lr run collapsed at loss 1.2 and i killed it after 20 min. latency is batch-1 bf16 on the Spark, not a Jetson yet. accuracy is one benchmark, LocalLLaMA's typed-decisions, 2,000 test decisions
GLM 5.3 Flash, Q4, 186 GB running on my single 128 gb DGX Spark
does not fit. ran it anyway
full gpu offload: OOM
-ngl 0: also OOM (a cuda build pins host memory, not the escape hatch you think it is)
cpu mmap, the only config that survives: 1.3 tok/s
expert streaming from nvme with O_DIRECT: 4.5
bigger expert cache (104 GB): 6.2
same config on code generation: 8.6 tok/s
how: there is an unmerged llama.cpp PR (25294) that streams MoE experts off the SSD through an on-device cache. it targets an API that was deleted 789 commits ago, so we ported it onto the GLM branch: 72% came across untouched, the 336 lines got reviewed, and the output is byte identical to the in-memory model across every cache partition we forced. lossless, verified, not vibes
learned the hard way:
O_DIRECT is mandatory. buffered streaming runs 1.0 tok/s = slower than not using the feature at all
llama-server's default 8 GB prompt cache silently kills the spark this full. --cache-ram 0
under streaming, plain decode becomes workload dependent (6.2 prose vs 8.6 code).
different tasks route to different experts = different miss patterns
where the next speed is: decode stalls on expert misses 49% of the time while the SSD sits at 28% busy. the bottleneck is queue depth, not bandwidth: layer L+1's experts depend on layer L's output, so you cannot prefetch deep. fix the stall and the ceiling is ~12. stack speculative decoding on top and 15+ is the target
we'll see how far we take this
it’s actually a good video..
makes me think about how ai is another technology that people must leverage, it is not the end all solution.
it will change fundamentally how we function as a society just like other technological revolutions
80% of society historically performed
- farm work
- industrial work
- office work (current)
i wonder what the future looks like
Qwen3.8 Flash Next: 128B total, 6B active, 4-bit, 97 GiB
GLM 5.3 Flash: 321B total, 17B active, 2-bit, 101 GiB
ran a 1:1 on the spark:
two flagship flash MoEs at the same memory budget
decode at depth 0 / 16k / 32k:
flash next: 24.2 / 21.2 / 19.0 tok/s
glm 5.3: 14.7 / 7.5 / 3.2 tok/s
glm does not just lose, it collapses with depth. the interesting part is why. the branch that runs glm today requires flash attention off. turn it on and the 16k number jumps from 8.0 to 13.3 = most of the collapse is a flag, not the architecture. that branch is a draft and the fa-on numerics are unverified, so i am not counting it yet. but the gap should mostly close as the port matures
the other finding: i have a bandwidth law fitted on flash next that prices decode from bytes moved per token. re-ran it out of sample tonight: 3 of 3 cells within 2-6%. pointed the same law at glm: missed by 2-5x. the law is architecture local. fit on one moe, it does not transfer to the next
two models, one spark, ~100 Gb/ea. the one moving 3.6 Gb per token beats the one moving 5.8.
i got GLM 5.3 Flash running on my DGX Spark with DFlash2 speculative decoding
321B params (17B active), 2-bit quant
101 GiB of weights, all in memory, zero nvme offload
plain decode: 17.1 tok/s
prefill: 289 tok/s
with dflash2: up to 41 tok/s (2.37x)
on structured output it accepts 73% of drafts = 41 tok/s.
on prose it accepts 23% = no speedup.
plain decode is dead flat across all three workloads (17.2 / 17.2 / 17.3),
so the entire spread is acceptance. speculation pays for structure, not language.
quality at 2-bit : passed all 5 gates i threw at it. 0.85 on code generation, 10/10 needle retrieval at ~11k context, zero degeneration loops.
inco's own numbers come from 4x GB300 through sglang. this is one box, llama.cpp, and the 1B drafter converted to gguf locally
output is byte identical to plain greedy on the workload where it wins.
lossless, faster, one spark.
i got qwen3.8-flash-next running on a single dgx spark.
the trick is old: move params to nvme. 51B of this model is an n-gram lookup table that never gets multiplied by anything, so it lives on storage via mmap and only touched rows page in. 180B params on a 128GB box, full 262k context.
what it actually does across the whole window, measured:
decode: 22.7 tok/s shallow -> 7.2 at 230k
prefill: 670 tok/s -> 80
1-3 page faults per token. the ssd trick costs almost nothing. the depth does.
everything i tested:
- all 7 depths, 226 tokens to 230k, spec on and off
- the 51B table: mmap'd, warmed, faults counted per cell
- ngram speculation by task: 98 tok/s copying a file, 26 on prose. it pays for repetition, not language
- reasoning off vs max: 180 vs 80 tok/s. think tokens can never be drafted
- memory: 35.2 KiB/token real cost at depth, not the 24 on the label. the sparse-attention indexer cache is the difference
- and a two-number bandwidth fit that predicted the 230k cell at 7.39 before it ran. it came back 7.16
decode at any depth on this box is now two numbers: weight path 84 GB/s, kv path 59 GB/s. that's the whole machine.
ran the identical setup on my m4 max. same model, same commit, same harness.
the mac leads shallow: 28.5 vs 22.7. by 15k the lead is gone. at 65k they're identical: 14.50 vs 14.54.
a 546 GB/s laptop and a 241 GB/s box on the same curve, because metal converts 17.6% of its roof through the weight path while cuda converts 34.9%. ~90% of the mac's bandwidth advantage never reaches the weights.
and the nvme trick doesn't cross backends: cuda holds 2.65 GiB resident. metal wraps the mapped file in place - 108 GiB resident, OOMs past 131k with 112 GiB free.
the speculation numbers deserve their own note, nothing new, again based on type objective
98 tok/s copying a file vs 26 on prose looks like a genre effect. it isn't. i held novelty constant and varied only genre: code 22.20, math 22.28, prose 22.30. a 0.45% spread.
ngram speculation pays for repetition, not language. on prose it emits zero drafts - a literal no-op.
and the model's own reasoning tokens are the one thing it can never draft, which is why reasoning off vs max is 2.25x on copy work.
continuation of..
SPARK + MAC compute
exploring Qwen3.8 27b,
each running its own native 4-bit (nvfp4 & mxfp4)
i measured prefill and decode at various depth from 1k to 1m. (yes the model technically only is trained on 256k so i used YaRN for some of these exp)
prefill, DGX Spark over M4 Max:
1k = 10.5x
64k = 8.4x
128k = 7.6x
decode, M4 Max over DGX Spark:
1k = 2.7x
64k = 2.0x
128k = 1.9x
both leads narrow with depth. neither one flips. the spark loads context faster at every depth i tested, and the laptop generates faster at every depth i tested.
"the spark wins long context" needs a footnote.
Qwen3.8 27b on nvfp4, time to first token:
256k = 5.6 minutes
512k = 19.1 minutes
1M = 70.6 minutes
prefill throughput falls off a cliff getting there. 2,463 tok/s at 1k. 777 at 256k. 247 at 1M. a 10x collapse. decode goes 11.4 to 8.2 to 6.4 to 4.4.
so yes the Spark owns long context. winning means seventy minutes before the first token appears.
the number to optimize is not how deep it can go. it is which depth we actually want to live at, then max everything for that.
the shape i want: prefill on the Spark, ship the state to the laptop, generate on the laptop.
at 128k that math is not close.
the Spark prefills 135k tokens in 116 seconds. the Mac needs 882 seconds for the same work.
the cache you have to move is 9.2 gb at f16, 4.6 at q8. Qwen3.8 is grouped-query, 68 KB per token of context. 10GbE measured 9.41 Gbit/s here, 512 MB/s real. that transfer is 18 seconds.
pay 18 seconds of wire, skip 12.5 minutes of prefill, then generate at 17.8 tok/s instead of 9.5.
more to come
qwen 3.8 27B on a DGX Spark, NVFP4 +MTP
exploring spec decode
same box, one variable: multi-token prediction (mtp) on or off
8k: 11.3 -> 26.2 (2.32x)
32k: 10.9 -> 26.0 (2.39x)
64k: 10.4 -> 27.7 (2.66x)
128k: 9.5 -> 23.0 (2.42x)
256k: 8.2 -> 20.7 (2.52x)
512k: 6.4 -> 6.0 (0.93x)
1M: 4.4 -> 4.2 (0.95x)
it holds 2.3-2.7x across a 32x range of context. then between 256k and 512k it goes negative
the mechanism is clean once you see it. drafting amortizes the weight reads: you pay for the weights once and cash in several tokens. but past a quarter million tokens the step is not weight reads anymore, it is re-reading the KV cache, and speculation cannot shrink that. the extra verification passes cost more than the accepted tokens save
so MTP is a short and mid context lever. at 1M you are attention bound and no amount of drafting helps
qwen3.8 · 3 quants
DGX Spark
some initial tests. i ran NVFP4, FP8, and GGUF Q4 at 1k, 8k, 32k.
at 32k NVFP4 is 2.67x GGUF on prefill. decode barely notices the pack.
Seems like open weight/source caught up fast
Introducing GLM-5.3: Built to Code. Ready for Cyber Defense.
- Top-tier coding and agentic capabilities, achieved through post-training on the 743B base model
- A major leap in cybersecurity, setting a new standard among open models
Tech Blog: z.ai/blog/glm-5.3
replicated @anemll's W4A4 harness on one Spark GB10. real DeepSeek-V4-Flash NVFP4 layer 0, 256 experts, rank 0, b12x-first.
W4A4 is 1.40-1.75x W4A16 on cuda-graph medians. the note said 1.4-1.8. JSON never hits 1.80.
B12X wins tiny decode (M=1-2) and M>=2048 prefill. CUTLASS takes M=4 through 1024. peak B12X edge 1.15x at M=8192.
failures: []
one box. not their 2xGB10 TP=2 serve table.




















