One request at a time, CuteAFD generates faster: 114-168 tokens/s on the vLLM fork and 120-235 on CuteAFD (K3.25; K4 108-164 and 116-220). A single long prompt gets its first token sooner on CuteAFD (35.1 s and 29.6 s at 128K), a single short one sooner on the vLLM fork (0.25 s and 0.41 s at 1K). With several requests at once the vLLM fork's advantage is time to first token (1K × 8: 1.44 s and 2.76 s); per-stream decode and aggregate throughput there are level or ahead on CuteAFD, except aggregate throughput at 1K × 8. The vLLM fork interleaves chunked prefill with decode, so every request starts early; CuteAFD's prefill is faster per request, but concurrent requests queue for it. On K4 at 16 streams CuteAFD completes 1.37-1.44x the vLLM fork's tokens per second (follow-up K4f, below).
How to read this page
A cell is one prompt length (1K to 128K tokens), one content type (prose, code, reasoning, JSON) and one number of streams (requests in flight at once), measured 3 times; each request generates 1,024 tokens with thinking on, every prompt is unique and every request has its own seed. Decode is the per-stream generation speed, aggregate all generated tokens of a batch per second of wall time, first token the time from sending to the first generated token. With thinking on, the code and JSON cells measure reasoning text about a code or JSON prompt.
K3.25 speed noise: a repeat hours later moved the median by under 2% and single cells by up to 13%; single-cell ratios within ±10% read as level. K4 speed noise: a ±8% band declared before the run (both engines' drift repeats stayed inside it); single-cell ratios within ±8% read as level.
K3.25 (2026-10-26/27)
Prompt × streams
Decode per stream, tok/s: vLLM fork
CuteAFD
Aggregate, tok/s: vLLM fork
CuteAFD
First token: vLLM fork
CuteAFD
1K × 1
121-161
126-228
117-155
120-204
0.25 s
0.41 s
1K × 4
67-99
71-117
247-324
246-334
0.87 s
1.22 s
1K × 8
48-72
48-69
345-454
321-410
1.44 s
2.76 s
1K × 16
26-39
29-47
378-508
397-516
2.38 s
4.31 s
8K × 1
117-168
120-235
95-121
99-157
2.11 s
1.80 s
8K × 4
59-77
61-98
168-207
177-225
5.48 s
5.21 s
8K × 8
38-51
39-54
216-250
217-245
9.48 s
9.77 s
8K × 16
20-27
24-33
233-264
245-278
17.5 s
18.9 s
32K × 1
114-148
121-169
58-66
65-77
8.70 s
7.26 s
32K × 4
43-50
63-82
84-92
91-100
23.0 s
27.1 s
32K × 8
22-25
41-48
94-101
100-107
39.3 s
53.4 s
32K × 16
12-13
23-29
100-105
107-112
72.3 s
106.0 s
128K × 1
119-150
123-165
23-24
27-29
35.1 s
29.6 s
128K × 4
21-22
63-90
28
31
92.6 s
117.0 s
CuteAFD v3.0.1: 1,008 measured requests in 132 batches, 0 errors, 0 replies with </think> in the content; vLLM fork v0.9.2: 1,008 measured requests in 132 batches, 0 errors, 0 replies with </think> in the content. Ranges run over the content types; first token is the median over them. Full grid: t/T-SUMMARY.md.
K3.25: decode speed per stream, CuteAFD ÷ vLLM fork (right is faster on CuteAFD)
What this shows. Per-stream generation speed, CuteAFD ÷ vLLM fork, per prompt length and number of streams; small triangles are content types, the large one their median.
content type, outside the bandcontent type, inside the bandmedian of the content typesvLLM fork (1.0)noise band
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, tok/s per stream
CuteAFD, tok/s per stream
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
120.69
125.66
1.04x
level
1K
code
1
145.24
196.01
1.35x
outside the band
1K
reasoning
1
161.21
228.05
1.41x
outside the band
1K
JSON
1
130.75
154.88
1.18x
outside the band
1K
prose
4
67.09
71.22
1.06x
level
1K
code
4
88.92
91.95
1.03x
level
1K
reasoning
4
99.42
116.99
1.18x
outside the band
1K
JSON
4
82.25
84.76
1.03x
level
1K
prose
8
48.26
48.01
0.99x
level
1K
code
8
61.97
58.40
0.94x
level
1K
reasoning
8
71.84
69.32
0.96x
level
1K
JSON
8
57.07
56.47
0.99x
level
1K
prose
16
26.38
29.21
1.11x
outside the band
1K
code
16
33.56
39.10
1.16x
outside the band
1K
reasoning
16
38.54
46.55
1.21x
outside the band
1K
JSON
16
32.46
34.99
1.08x
level
8K
prose
1
117.36
119.76
1.02x
level
8K
code
1
151.06
174.59
1.16x
outside the band
8K
reasoning
1
168.36
234.71
1.39x
outside the band
8K
JSON
1
130.12
146.12
1.12x
outside the band
8K
prose
4
59.29
61.42
1.04x
level
8K
code
4
73.30
78.09
1.07x
level
8K
reasoning
4
77.42
98.13
1.27x
outside the band
8K
JSON
4
68.58
74.08
1.08x
level
8K
prose
8
38.50
39.33
1.02x
level
8K
code
8
44.53
49.19
1.10x
outside the band
8K
reasoning
8
50.90
53.76
1.06x
level
8K
JSON
8
43.29
44.75
1.03x
level
8K
prose
16
20.47
24.13
1.18x
outside the band
8K
code
16
23.86
28.36
1.19x
outside the band
8K
reasoning
16
26.83
32.98
1.23x
outside the band
8K
JSON
16
23.36
25.68
1.10x
level
32K
prose
1
114.43
121.41
1.06x
level
32K
code
1
148.01
169.28
1.14x
outside the band
32K
prose
4
42.78
62.99
1.47x
outside the band
32K
code
4
50.18
81.64
1.63x
outside the band
32K
prose
8
22.39
41.30
1.84x
outside the band
32K
code
8
25.49
47.86
1.88x
outside the band
32K
prose
16
11.80
23.08
1.96x
outside the band
32K
code
16
13.02
29.16
2.24x
outside the band
128K
prose
1
119.46
122.85
1.03x
level
128K
code
1
150.22
165.33
1.10x
outside the band
128K
prose
4
21.34
62.69
2.94x
outside the band
128K
code
4
22.24
89.60
4.03x
outside the band
K3.25: time to first token, CuteAFD ÷ vLLM fork (left is sooner on CuteAFD)
What this shows. Time from sending a request to its first token, CuteAFD ÷ vLLM fork; small triangles are content types.
content typemedian of the content typesvLLM fork (1.0)noise band, for scale
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, s
CuteAFD, s
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
0.25
0.41
1.65x
for scale only
1K
code
1
0.25
0.41
1.63x
for scale only
1K
reasoning
1
0.26
0.41
1.57x
for scale only
1K
JSON
1
0.25
0.40
1.61x
for scale only
1K
prose
4
0.87
1.22
1.40x
for scale only
1K
code
4
0.87
1.22
1.41x
for scale only
1K
reasoning
4
0.87
1.22
1.40x
for scale only
1K
JSON
4
0.86
1.21
1.40x
for scale only
1K
prose
8
1.45
2.76
1.91x
for scale only
1K
code
8
1.43
2.77
1.93x
for scale only
1K
reasoning
8
1.45
2.75
1.90x
for scale only
1K
JSON
8
1.44
2.74
1.91x
for scale only
1K
prose
16
2.39
4.32
1.80x
for scale only
1K
code
16
2.37
4.34
1.83x
for scale only
1K
reasoning
16
2.39
4.30
1.80x
for scale only
1K
JSON
16
2.37
4.25
1.79x
for scale only
8K
prose
1
2.11
1.80
0.86x
for scale only
8K
code
1
2.10
1.80
0.86x
for scale only
8K
reasoning
1
2.11
1.81
0.86x
for scale only
8K
JSON
1
2.11
1.80
0.85x
for scale only
8K
prose
4
5.49
5.21
0.95x
for scale only
8K
code
4
5.46
5.21
0.96x
for scale only
8K
reasoning
4
5.50
5.24
0.95x
for scale only
8K
JSON
4
5.47
5.21
0.95x
for scale only
8K
prose
8
9.50
9.77
1.03x
for scale only
8K
code
8
9.45
9.78
1.03x
for scale only
8K
reasoning
8
9.50
9.81
1.03x
for scale only
8K
JSON
8
9.47
9.76
1.03x
for scale only
8K
prose
16
17.52
18.85
1.08x
for scale only
8K
code
16
17.43
18.86
1.08x
for scale only
8K
reasoning
16
17.51
18.93
1.08x
for scale only
8K
JSON
16
17.47
18.89
1.08x
for scale only
32K
prose
1
8.71
7.26
0.83x
for scale only
32K
code
1
8.70
7.27
0.84x
for scale only
32K
prose
4
23.05
27.09
1.18x
for scale only
32K
code
4
22.98
27.07
1.18x
for scale only
32K
prose
8
39.31
53.40
1.36x
for scale only
32K
code
8
39.21
53.34
1.36x
for scale only
32K
prose
16
72.39
106.03
1.46x
for scale only
32K
code
16
72.19
105.94
1.47x
for scale only
128K
prose
1
35.08
29.58
0.84x
for scale only
128K
code
1
35.02
29.57
0.84x
for scale only
128K
prose
4
92.64
116.03
1.25x
for scale only
128K
code
4
92.47
117.96
1.28x
for scale only
K3.25: aggregate throughput, CuteAFD ÷ vLLM fork (right is more tokens per second on CuteAFD)
What this shows. All generated tokens of a batch per second of wall time, CuteAFD ÷ vLLM fork; small triangles are content types.
content type, outside the bandcontent type, inside the bandmedian of the content typesvLLM fork (1.0)noise band
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, tok/s
CuteAFD, tok/s
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
117.40
119.82
1.02x
level
1K
code
1
140.36
181.86
1.30x
outside the band
1K
reasoning
1
155.29
204.39
1.32x
outside the band
1K
JSON
1
126.91
146.08
1.15x
outside the band
1K
prose
4
247.24
246.10
1.00x
level
1K
code
4
324.34
309.91
0.96x
level
1K
reasoning
4
317.49
334.07
1.05x
level
1K
JSON
4
294.75
296.62
1.01x
level
1K
prose
8
344.89
321.45
0.93x
level
1K
code
8
439.53
381.11
0.87x
outside the band
1K
reasoning
8
454.10
409.96
0.90x
level
1K
JSON
8
416.01
379.59
0.91x
level
1K
prose
16
377.91
397.02
1.05x
level
1K
code
16
476.84
483.61
1.01x
level
1K
reasoning
16
508.08
516.24
1.02x
level
1K
JSON
16
473.13
462.06
0.98x
level
8K
prose
1
94.57
98.96
1.05x
level
8K
code
1
115.36
133.46
1.16x
outside the band
8K
reasoning
1
121.16
157.05
1.30x
outside the band
8K
JSON
1
102.57
116.33
1.13x
outside the band
8K
prose
4
168.27
177.21
1.05x
level
8K
code
4
207.36
205.51
0.99x
level
8K
reasoning
4
202.60
225.06
1.11x
outside the band
8K
JSON
4
194.24
199.98
1.03x
level
8K
prose
8
215.63
216.66
1.00x
level
8K
code
8
247.97
244.66
0.99x
level
8K
reasoning
8
249.98
239.74
0.96x
level
8K
JSON
8
242.22
239.35
0.99x
level
8K
prose
16
233.13
244.94
1.05x
level
8K
code
16
263.72
277.99
1.05x
level
8K
reasoning
16
255.54
277.71
1.09x
level
8K
JSON
16
260.03
271.14
1.04x
level
32K
prose
1
57.83
65.21
1.13x
outside the band
32K
code
1
65.53
76.94
1.17x
outside the band
32K
prose
4
84.17
91.10
1.08x
level
32K
code
4
92.28
99.51
1.08x
level
32K
prose
8
94.35
99.67
1.06x
level
32K
code
8
100.50
106.65
1.06x
level
32K
prose
16
99.56
106.62
1.07x
level
32K
code
16
105.05
112.06
1.07x
level
128K
prose
1
23.47
27.01
1.15x
outside the band
128K
code
1
24.48
28.65
1.17x
outside the band
128K
prose
4
27.52
30.60
1.11x
outside the band
128K
code
4
28.23
31.35
1.11x
outside the band
K4 (2026-10-27)
The K4 grid is smaller: 1 and 4 streams at 1K-32K and 1 stream at 128K, set once for every arm of its frozen protocol. Readings per cell use the declared band.
Prompt × streams
Decode per stream, tok/s: vLLM fork
CuteAFD
Aggregate, tok/s: vLLM fork
CuteAFD
First token: vLLM fork
CuteAFD
1K × 1
113-164
127-219
110-157
121-200
0.27 s
0.42 s
1K × 4
60-93
71-114
222-290
237-323
0.87 s
1.26 s
8K × 1
111-160
116-220
90-120
99-153
2.20 s
1.84 s
8K × 4
55-72
63-83
154-184
176-217
5.72 s
5.30 s
32K × 1
108-142
121-170
56-63
65-76
9.05 s
7.38 s
32K × 4
41-47
63-75
79-86
89-97
24.0 s
27.6 s
128K × 1
113-145
120-172
23-24
27-28
36.4 s
30.1 s
vLLM: 264 measured requests, 0 errors; CuteAFD: 264 measured requests, 0 errors. Prompt-token counts identical on every cell except the 128K code cell (12 CuteAFD requests longer: those prompts hold literal <think> text, which vLLM parses as a special token).
K4: decode speed per stream, CuteAFD ÷ vLLM fork (right is faster on CuteAFD)
What this shows. Per-stream generation speed, CuteAFD ÷ vLLM fork, per prompt length and number of streams; small triangles are content types, the large one their median.
content type, outside the bandcontent type, inside the bandmedian of the content typesvLLM fork (1.0)noise band
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, tok/s per stream
CuteAFD, tok/s per stream
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
113.18
126.59
1.12x
faster
1K
code
1
145.69
174.77
1.20x
faster
1K
reasoning
1
164.10
219.33
1.34x
faster
1K
JSON
1
129.95
145.26
1.12x
faster
1K
prose
4
59.51
70.60
1.19x
faster
1K
code
4
78.40
89.93
1.15x
faster
1K
reasoning
4
92.69
113.68
1.23x
faster
1K
JSON
4
72.58
83.93
1.16x
faster
8K
prose
1
110.52
115.93
1.05x
level
8K
code
1
146.66
178.78
1.22x
faster
8K
reasoning
1
159.60
220.40
1.38x
faster
8K
JSON
1
130.12
153.01
1.18x
faster
8K
prose
4
54.70
62.67
1.15x
faster
8K
code
4
68.39
75.57
1.11x
faster
8K
reasoning
4
72.11
83.05
1.15x
faster
8K
JSON
4
60.71
68.98
1.14x
faster
32K
prose
1
108.47
121.43
1.12x
faster
32K
code
1
142.37
169.68
1.19x
faster
32K
prose
4
41.04
63.07
1.54x
faster
32K
code
4
47.30
75.02
1.59x
faster
128K
prose
1
113.23
119.92
1.06x
level
128K
code
1
144.63
171.84
1.19x
faster
K4: time to first token, CuteAFD ÷ vLLM fork (left is sooner on CuteAFD)
What this shows. Time from sending a request to its first token, CuteAFD ÷ vLLM fork; small triangles are content types.
content typemedian of the content typesvLLM fork (1.0)noise band, for scale
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, s
CuteAFD, s
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
0.26
0.42
1.60x
for scale only
1K
code
1
0.27
0.42
1.57x
for scale only
1K
reasoning
1
0.27
0.42
1.55x
for scale only
1K
JSON
1
0.27
0.42
1.55x
for scale only
1K
prose
4
0.83
1.26
1.51x
for scale only
1K
code
4
0.83
1.26
1.52x
for scale only
1K
reasoning
4
1.01
1.26
1.25x
for scale only
1K
JSON
4
0.90
1.25
1.38x
for scale only
8K
prose
1
2.20
1.84
0.84x
for scale only
8K
code
1
2.20
1.83
0.83x
for scale only
8K
reasoning
1
2.20
1.84
0.83x
for scale only
8K
JSON
1
2.20
1.83
0.83x
for scale only
8K
prose
4
5.73
5.30
0.92x
for scale only
8K
code
4
5.71
5.30
0.93x
for scale only
8K
reasoning
4
5.73
5.32
0.93x
for scale only
8K
JSON
4
5.72
5.30
0.93x
for scale only
32K
prose
1
9.04
7.38
0.82x
for scale only
32K
code
1
9.05
7.37
0.81x
for scale only
32K
prose
4
24.05
27.57
1.15x
for scale only
32K
code
4
24.00
27.55
1.15x
for scale only
128K
prose
1
36.42
30.09
0.83x
for scale only
128K
code
1
36.30
30.08
0.83x
for scale only
K4: aggregate throughput, CuteAFD ÷ vLLM fork (right is more tokens per second on CuteAFD)
What this shows. All generated tokens of a batch per second of wall time, CuteAFD ÷ vLLM fork; small triangles are content types.
content type, outside the bandcontent type, inside the bandmedian of the content typesvLLM fork (1.0)noise band
How to use it. Find the row for your prompt length and number of requests at once; the grey band is the noise band stated above.
Table view: the exact numbers
Prompt
Content
Streams
vLLM fork, tok/s
CuteAFD, tok/s
CuteAFD ÷ vLLM fork
Reading
1K
prose
1
110.03
121.23
1.10x
faster
1K
code
1
141.75
162.21
1.14x
faster
1K
reasoning
1
157.15
199.71
1.27x
faster
1K
JSON
1
125.67
138.36
1.10x
faster
1K
prose
4
222.21
237.47
1.07x
level
1K
code
4
280.17
297.32
1.06x
level
1K
reasoning
4
289.58
323.21
1.12x
faster
1K
JSON
4
267.61
284.61
1.06x
level
8K
prose
1
89.76
99.08
1.10x
faster
8K
code
1
111.65
135.59
1.21x
faster
8K
reasoning
1
119.51
153.40
1.28x
faster
8K
JSON
1
101.66
120.25
1.18x
faster
8K
prose
4
154.45
176.28
1.14x
faster
8K
code
4
184.44
200.45
1.09x
faster
8K
reasoning
4
183.90
216.78
1.18x
faster
8K
JSON
4
175.16
200.04
1.14x
faster
32K
prose
1
55.55
64.71
1.17x
faster
32K
code
1
63.12
76.20
1.21x
faster
32K
prose
4
79.28
88.81
1.12x
faster
32K
code
4
86.35
96.69
1.12x
faster
128K
prose
1
22.58
26.59
1.18x
faster
128K
code
1
23.64
28.35
1.20x
faster
Caveats
Long prompts with several streams mostly measure scheduling. The vLLM fork interleaves chunked prefill with decode, so its streams' decode overlaps other requests' prefill (a median 40-81% of each decode window) and their first tokens come early; CuteAFD finishes each prefill faster but queues the requests behind it. Streams that decode without another stream's prefill running decode at the same speed on both engines. At 32K and 128K, 71-92% of a batch's wall time passes before its last first token, so the aggregate there mostly reflects CuteAFD's faster long prefill (about 4,400-4,500 against 3,700-3,900 tokens/s).
Draft policies differ. The vLLM fork drafts 3 tokens per step with a BF16 drafter; CuteAFD drafts adaptively with an FP8 drafter. The vLLM fork accepted 1.53 of 3 drafted tokens per step; CuteAFD exposes no counter.
Inputs differ in two details. Each request's first line is a nonce, different between the engines on K3.25 (prompt bodies identical); the 128K code prompts hold literal <think> text that the vLLM stack parses as control tokens.
The frozen K4 grid stopped at 4 streams; this follow-up ran the cells both engines admit, outside the protocol, with the same prompts and seeds.
Design FOLLOWUPS-K4f.md (declared before any request). The cells the frozen grid dropped that both engines admit, on the protocol's Block T prompts, seeds and nonce salt; one serving launch per arm; no request errors. Prompt-token counts identical except the 128K code prompts on CuteAFD (literal <think> text, as in the protocol).
Machine state. Drift subsets after the vLLM and CuteAFD side cells matched 2026-10-27: decode 0.95-1.03x on both engines; time to first token within 2% except one vLLM cell (1.12x).
Medians over content types and replicates; 1,024 output tokens per request; per-stream decode = tokens per second of one request; aggregate = all tokens finished per second.
Cell (input × streams)
Decode per stream, tok/s (vLLM / CuteAFD / W8A16+amax)
Aggregate, tok/s
CuteAFD ÷ vLLM, aggregate
First token, s
CuteAFD ÷ vLLM, first token
1K × 8
52 / 58 / 58
370 / 370 / 369
1.00
1.52 / 2.84 / 2.95
1.87
1K × 16
33 / 36 / 36
322 / 465 / 459
1.44
2.49 / 4.44 / 4.62
1.78
8K × 8
41 / 45 / 44
224 / 235 / 230
1.05
9.91 / 9.96 / 10.37
1.01
8K × 16
24 / 26 / 26
195 / 267 / 262
1.37
18.3 / 19.2 / 20.0
1.05
32K × 8
23 / 42 / 43
93 / 101 / 98
1.09
41.0 / 54.4 / 56.6
1.33
128K × 2
66 / 104 / 112
25 / 29 / 28
1.15
58.2 / 59.7 / 62.2
1.03
Reading (±8% band):
Throughput under load: level at 1K × 8 and 8K × 8; CuteAFD ahead at 16 streams (1.37-1.44x), at 32K × 8 (1.09x) and 128K × 2 (1.15x). On K3.25, 1K × 8 favoured the vLLM fork by 7-15%; on K4 it is level.
First token under load: the vLLM fork answers short prompts sooner with many requests in flight (1K: 1.8-1.9x sooner); level at 8K and 128K × 2; the vLLM fork sooner at 32K × 8 (1.33x). Mechanism as on K3.25: the vLLM fork interleaves chunked prefill with decode; CuteAFD's prefill is faster per request but queued requests wait.
W8A16 + amax matches CuteAFD as shipped at high concurrency: aggregate 0.97-1.00x, first token +4% in every cell.
32K × 16 not run: CuteAFD's K4 KV pool (447,488 tokens) does not hold 16 × 33,792.