Home / 128 GB

128 GB · 1× DGX Spark (GB10)

Ash's TensorFold 1.2.1 on one DGX Spark: Qwen3.8-27B (EXL3 4.00 bpw)

1x NVIDIA DGX Spark (GB10, 128 GB unified memory), one box. Driver 580.178.04, kernel 7.0.0-1019-nvidia, GPU clock capped at 2200 MHz.

Engine and recipe (TensorFold official release v1.2.1, 1 Nov 2026, 23:52 UTC)Ash HartX @ashxhartGitHubHugging FaceWebsite
TensorFold native (Zig) 1.2.1 official release archive tensorfold-1.2.1-linux-aarch64.tar.gz (sha256 74a1047d), qwen3_5 CUDA family (dense EXL3), 1 GB10 (sm_121), DFlash2 drafter, --context 131072, server default streamscommit TensorFold v1.2.1 1db3edbe7e692e83c7f5056754dc4e69e79a6c22 (binary tensorfold-native sha256 adf86ee19a1ee47b41fef81a657b7ff2dd221216574a6a960bbbc2aa73252797); EXL3 prefill series: PR #1467 (merge 21c8a0f9) in 1.2.2 only, PR #1465 in 1.2.0/1.2.11 GB10 box (GB10)measured 2026-11-04

Not ranked. This setup has no rank and no overall score. This page shows its speed results. Quality tests were not run on this setup.

Speed v2

How fast it runs

Decode
44.4tok/s
Decode, code
45.9tok/s
Decode, prose
42.9tok/s
500 words
≈ 15.8s
Prefill at 8K
352.2tok/s
First token at 2K
5.8s
MeasurementResult
Decode44.4 tok/s
Words per second31.6 words/s
Characters per second211.4 chars/s
Decode, code prompt45.9 tok/s
Decode, prose prompt42.9 tok/s
Spread of the decode runs (CV)3.0 %
Spread of the code runs (CV)3.0 %
Spread of the prose runs (CV)2.5 %
Decode, window 143.2 tok/s
Prefill at 2K354.3 tok/s
Prefill at 8K352.2 tok/s
Prefill at 32K343.4 tok/s
Time to first token at 2K5.8 s
Time to first token at 8K23.3 s
Time to first token at 32K95.4 s
Draft acceptance rate18.0 %
Mean accepted length3.7 tokens
1 request at once (total)33.0 tok/s
2 at once (total)45.6 tok/s
4 at once (total)58.7 tok/s
8 at once (total)60.9 tok/s
1 request at once (per request)33.0 tok/s
2 at once (per request)23.7 tok/s
4 at once (per request)14.8 tok/s
8 at once (per request)8.1 tok/s
Server slots (engine default, up to 8 streams)8 slots
Long answer, wall time107.5 s

Long prompts

Prompt lengthPrefillTime to first tokenDecode, code promptDecode, prose prompt
16K tokens346.7 tok/s47.3 s43.8 tok/s36.6 tok/s
32K tokens340.3 tok/s96.3 s42.9 tok/s39.4 tok/s
64K tokens329.6 tok/s198.8 s38.4 tok/s36.9 tok/s
130,048 tokens (the 128K step, reduced so that prompt plus 512 output tokens fit the 131,072 window)310.9 tok/s418.3 s34.1 tok/s28.8 tok/s

Method: code+prose; 2 run(s) each; 512 tokens; 1 warm-up(s); median; context steps: prompts of exactly 16K, 32K and 64K tokens and of 130,048 tokens for the 128K step, which is reduced so that prompt plus 512 output tokens fit the 131,072 window (a filler log first, the code or prose task prompt last), 2 runs per step, 512 output tokens; decode = tokens after the first / time after the first token; prefill = prompt tokens / time to first token of the same request, median over its requests; requests at once: C1,C2,C4,C8 at once; 2 rounds each; 512 tokens per request; prose prompt; total = all tokens / wall time, per request = tokens / end-to-end time; median over the rounds. Measured 2026-11-04. Raw files: speed result · speed contract · log · long answer.

The speed test ran with Ash's official release of TensorFold v1.2.1 (published 1 Nov 2026, 23:52 UTC): the prebuilt Linux/aarch64 archive from the release page, not a build of mine, on one DGX Spark, with the checkpoint and the draft model that Ash's measurements for this model use (turboderp/Qwen3.8-27B-exl3, branch 4.00bpw, revision 113cf7ab; z-lab/Qwen3.8-27B-DFlash2, revision 50307d4c) and his recipe's command: I ran the native engine's serve command with the EXL3 folder, the draft model given with --drafter, and --context 131072 (the recipe's own line is tensorfold serve with the EXL3 folder). Two points differ from the recipe text. The recipe's example shows the 3.00 bpw branch, but it sits in the section on the Python engine, and every measurement Ash gives for the native engine uses 4.00 bpw, so I used 4.00 bpw. The server default for this model is a context of 32,768 tokens, which would not take a 64K prompt, so I used the 131,072 of his measurements. I did not set the number of streams; the server chose 8 (--parallel auto), so the four concurrency levels (1, 2, 4 and 8 at once) are all inside its slot count. Sampling is the model card's instruct profile (temperature 0.7, top_p 0.8, top_k 20, presence penalty 1.5), seed 42, the request flag for no thinking; no cached tokens in the 61 requests that were checked. The headline 44.36 tok/s is the mean of the code prompt (45.86) and the prose prompt (42.87), medians of two runs each (spread 3.0 % and 2.5 %). Drafts were accepted at a rate of 18.0 % (1,491 of 8,264). This page is the control run for the page of v1.2.2: the same box, the same weights, the same command and the same test, only the engine release differs. It ran on the same evening, after the v1.2.2 run. The prefill series of pull request #1467 is in v1.2.2 only; the series of #1465 is in v1.2.0 and v1.2.1. Prefill at 2K is 354.3 tok/s here and 889.3 tok/s with v1.2.2; the first token of a 32K prompt comes after 95.4 s here and 39.7 s with v1.2.2; decode is 44.4 tok/s here and 47.3 with v1.2.2. The load guard (a sample every half second) saw other processes together above 25 % CPU in 103 of 10,244 samples, up to 116 %, including the samples of the three tries that the guard threw away. The guard throws a try away and repeats it when a single process uses more than 25 % CPU in two samples in a row. The load guard threw away and repeated 3 tries: the long single run once, because of a helper of the snap package system (46 % CPU), and the prose run of the 130K prompt twice, because of "apt update" and of the firmware service fwupd (up to 100 % CPU each); every value kept is from a clean try according to the guard.

Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

Speed v2 (run tf121-box-1-0411-speed-r0)
python3 speed2.py --base-url http://127.0.0.1:39017/v1 --label tf121-box-1-0411-speed-r0 --prompts $BENCH/repos/rigmark-v2/prompts-v2.json --output $RUN/raw/tf121-box-1-0411-speed-r0/tf121-box-1-0411-speed-r0/speed2 --contract $RUN/raw/tf121-box-1-0411-speed-r0/tf121-box-1-0411-speed-r0/speed2/speed-contract.json --parts decode,prefill,conc,l1,ctx --prefill-depths 2048,8192,32768 --prompt-ids code,prose --runs 2 --max-tokens 512 --warmups 1 --prefill-runs 3 --conc-levels 1,2,4,8 --conc-rounds 2 --conc-max-tokens 512 --conc-prompt prose --ctx-depths 16384,32768,65536,131072 --ctx-runs 2 --ctx-max-tokens 512 --tokenizer-json $HOME/models/qwen38-27b-exl3-4.00bpw/tokenizer.json --tokenizer-python $HOME/not published --sampling {"temperature": 0.7, "top_p": 0.8, "top_k": 20, "min_p": 0.0, "presence_penalty": 1.5} --sampling-source https://huggingface.co/Qwen/Qwen3.8-27B README.md lines 252 (Thinking Mode) and 253 (Instruct/non-thinking mode), local copy not published line 252-253 (same as the other Qwen3.8-27B cards); the server default (checkpoint generation_config.json: temperature 1.0, top_p 0.95, top_k 20) is overridden per request, which the API allows (api.md lines 174-179). Ash's command sets no sampling flag. Seed 42 for speed/quality. Same sampling as the Mac card of Nov 3; Ash's receipts are greedy (PR #1467), so his numbers are not sampled-comparable. --model qwen3.8-27b-exl3-4.00bpw-dflash2 --no-cache-prompt --server-log $RUN/logs/server-A.log --engine-version-file $RUN/logs/engine-version.txt --server-slots 8 --server-slots-source TensorFold v1.2.1 README.md (same text as v1.2.2 README.md:97 and :326, --parallel auto asks for up to eight streams); server startup line 'model 17.07 GiB; 8 streams at once, 8.90 GiB each at a 131072-token window' (box-1 $HOME/tf122-0411/logs/probe-server-1.2.1-2043.log, probe start Nov 4, 2026 20:43); the recipe command sets no --parallel; C8 fits, no queue --server-ctx 131072 --server-ctx-source Ash's receipt PR #1467 ('--context 131072; greedy unless stated'); the server default for Qwen3.8-27B is 32,768 (v1.2.2 README.md:291, v1.2.1 README.md:282 per the Nov 3 card); accepted value read from the server: startup line 'context: 131072' and GET /v1/models context_length 131072 (box-1 probe start Nov 4, 2026 20:43, logs/probe-server-1.2.1-2043.log)
Quality v2

Quality

Quality tests were not run on this setup: this pair of pages compares two releases of the same engine with the same weights and shows speed only. No quality numbers are shown here, and this setup has no rank.

Credits

Also made this possible

Setup

Run it yourself

What you need and how to start it, step by step. The results below come from exactly this setup.

What you need

Hardware
1x NVIDIA DGX Spark (GB10, 128 GB unified memory), one box. Driver 580.178.04, kernel 7.0.0-1019-nvidia, GPU clock capped at 2200 MHz.
Model
turboderp/Qwen3.8-27B-exl3 @113cf7ab (4.00bpw EXL3, dense 27B Gated DeltaNet + attention) + z-lab/Qwen3.8-27B-DFlash2 @50307d4c (drafter)
EXL3 quant (4.00 bpw branch, revision 113cf7ab)
huggingface.co/turboderp/Qwen3.8-27B-exl3/tree/113cf7ab958054860e43fb7f3063b1af19171095
Draft model (DFlash2, revision 50307d4c)
huggingface.co/z-lab/Qwen3.8-27B-DFlash2
Engine
Official release v1.2.1 of 1 Nov 2026, 23:52 UTC, the native CUDA engine, turboderp's EXL3 4.00 bpw checkpoint with DFlash2 drafts, 131,072 tokens of context, 8 streams — the program that loads the model and answers requests · github.com/ashhart/TensorFold/releases/tag/v1.2.1

Steps

  1. Get the engine and the model files from the list above.

  2. Start the server with this command. It loads the model into memory. When the model has loaded, the server waits for requests on port 8080.

    tensorfold-native serve qwen38-27b-exl3-4.00bpw \
      --drafter qwen38-27b-dflash2 \
      --name qwen3.8-27b-exl3-4.00bpw-dflash2 \
      --port 8080 \
      --context 131072

    The file names are the ones we used. Run the command in the folder that holds them, or put the full path in front of each name.

    What the parts mean

    • --port 8080the network port the server listens on
    • --drafter qwen38-27b-dflash2the draft model: it guesses the next tokens and the main model checks them; without it the model decodes plain
    • --name qwen3.8-27b-exl3-4.00bpw-dflash2the model ID the server advertises to clients
Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the start text exactly as our run recorded it, with the engine build in front, so anyone can repeat the result.

Start, as recorded with the run
TensorFold native (Zig) 1.2.1 official release archive tensorfold-1.2.1-linux-aarch64.tar.gz (sha256 74a1047d), qwen3_5 CUDA family (dense EXL3), 1 GB10 (sm_121), DFlash2 drafter, --context 131072, server default streams; tensorfold-native serve $HOME/models/qwen38-27b-exl3-4.00bpw --drafter $HOME/models/qwen38-27b-dflash2 --name qwen3.8-27b-exl3-4.00bpw-dflash2 --port 8080 --context 131072 (recipe: tensorfold serve <EXL3 folder>; wrapper $HOME/tf122-0411/tf-ctl.sh)

Context and sampling: 131,072 tokens (the value in Ash's measurements, --context 131072; the server default for this model is 32,768), 8 requests at once (the server's own choice with its automatic setting; the recipe command sets no --parallel), DFlash2 drafts, seed 42, the prompt cache at the server default; every request carries its own nonce and cache salt, so no earlier prompt state answers it. Sampling is the model card's instruct profile: temperature 0.7, top_p 0.8, top_k 20, presence penalty 1.5, with thinking off in every chat request. Speed only: no quality test and no memory test was run on this setup. Hardware: 1x NVIDIA DGX Spark (GB10, 128 GB unified memory), one box. Driver 580.178.04, kernel 7.0.0-1019-nvidia, GPU clock capped at 2200 MHz. All raw files of this setup: raw/v2/qwen38-27b-1spark-tensorfold-121-official-ash.