By Davide Ciffa

Lucebox cluster: DeepSeek V4.1 Flash at up to 103 tok/s on two boxes and one 100 GbE NIC link

Two Luceboxes joined by one 100 GbE cable run DeepSeek V4.1 Flash as one model, at up to 103 tok/s writing code. That is 1.9 times one Lucebox Zero 495 with 192 GB running the same engine. Each step sends about 95 small messages between the boxes, one after another, so what counts is how fast each one crosses.

A dual-port 100 GbE network card on a wooden deck among yellow flowers under a starry sky, below the word Clustering
One 100 GbE card in each box and one cable between them: about 95 messages a step.
up to 103 tok/swriting code with DeepSeek V4.1 Flash on two Luceboxes
1.9xone Lucebox Zero 495 with 192 GB on the same engine, 1.5x on long prose
18 µstypical wait for the other box, about 95 times a step

TL;DR

Below, both setups answer the same code prompt, replayed from the timings we recorded. Both clocks start at the first token, and each side shows the answer it actually returned.

One box writes the 256-token answer at 54.7 tok/s, two boxes at 102.3 tok/s. The answers split at line 11; more on that below.

Two boxes, one cable

Each Lucebox here is the Ryzen AI MAX+ 395 build: 128 GB of unified memory and a 32 GB Radeon AI PRO R9700. On its own, a 128 GB box can't keep all of DeepSeek V4.1 Flash's experts in memory. In our DeepSeek V4.1 Flash post it read the rarely used ones from the SSD and wrote code at up to 26 tok/s.

Two boxes have room for all of them. A ConnectX-5 Ex card in each box joins them with one 100 GbE cable, with no switch in between. The two engines talk over RDMA (RoCE v2) and run as one model: every token goes through every layer on both boxes at once.

What each box holds
Part of the modelOn each box
Routed expertsHalf of them, about 7,700: the 1,500 to 1,800 used most on the R9700 (16 to 18 GB), the other 6,000 in unified memory (62 GB)
Attention32 of the 64 heads
Shared expertHalf of its width
Output headHalf of the 129,280-token vocabulary
DrafterHalf of its heads and half of its experts

Split this way, the boxes add up their halves twice in every layer, after attention and after the experts. Nothing comes from the SSD while the model runs. As on one box, the placement is fitted to the pair, and the router picks the expert in fast memory when two choices are close.

Same engine, model and prompts on both setups.

Why a 100 GbE ConnectX

A decode step checks the drafter's next few tokens in one pass through all 40 layers. With the drafter and the output head, that makes about 95 messages a step, each 40 to 100 KB, one after another. Every microsecond a message takes is paid about 95 times a step.

Two things set how fast a message crosses. RDMA lets the card write it straight into the other box's memory, with no network stack and no extra copies on the way. The link rate sets how long it spends on the wire: 4 µs for 50 KB at 100 Gbit/s, 16 µs at 25 Gbit/s. Saving 12 µs on each of 95 messages is more than 1 ms a step. Reading a long prompt moves far more data than writing tokens, and there the link rate counts even more. That is why each box has a 100 GbE ConnectX.

The rest of a message's time goes to getting it out of one box's memory and into the other's: one RDMA write of 51 KB took 35 µs end to end.

One RDMA write at a time between the two boxes, against the time the same bytes take at the port's 100 Gbit/s.

Inside the engine, a typical message waits 18 µs for the other box's half, and a few wait much longer. Over about 95 messages a step, waiting adds up to roughly a tenth of the step.

Building the connection

Five choices made the difference:

GPUDirect RDMA, where the NIC reads and writes the R9700's memory directly, works on this hardware too. It ran at 1.1 to 1.7 GB/s, slower than going through host memory, so the engine doesn't use it.

Two boxes don't give exactly the same answer as one box. The boxes add their partial sums in bf16, and the router breaks close calls differently, since each setup has its own placement. When two tokens are nearly tied, that can flip the pick. In the replay, the answers split at line 11. Every drafted token is still checked by the full model.

It started from maikzz32's work on Strix Halo clusters, which already ran DeepSeek V4 Flash across boxes over RoCE.

From 60 to 103 tok/s

The first two-box run wrote code at 60 tok/s, about a quarter faster than one 192 GB box at the time. Most of what followed was about the two boxes waiting for each other, and then about the GPU work in between.

Decode speed writing code on two boxes, as each change landed.

Where the time goes now

A step takes about 41 ms and keeps 4.25 tokens on average when writing code. Drafting takes about 3 ms, picking the drafted tokens 1 ms and checking them 37 ms.

One decode step writing code, 4.25 tokens kept.

Inside the check, the messages cost in two places. Waiting for the other box takes about 3.6 ms. Packing each message and adding the one that comes back takes another 2.5 ms on the R9700.

The two boxes are evenly matched: each waits for the other about as long, so moving work from one box to the other would gain little.

Prose after a 2K-token prompt runs at 55 to 59 tok/s. The drafter guesses prose less well, so each step keeps 2.5 tokens instead of 4.25.

Hardware and setup

BoxesTwo Luceboxes: AMD Radeon AI PRO R9700 32 GB + Ryzen AI MAX+ 395 with 128 GB of unified memory, ROCm 7.2.4
NetworkNVIDIA ConnectX-5 Ex 100 GbE in each box, one direct QSFP28 cable, RoCE v2
One-box baselineOne Lucebox Zero 495: AMD Radeon AI PRO R9700 32 GB + Ryzen AI MAX+ PRO 495 with 192 GB of unified memory, the same engine build
ModelDeepSeek V4.1 Flash: our quantized model ROCMFP2S from Hugging Face and the 4.9 GB build of the DSpark drafter (Q2K-Q4K), with the ds41-gorgon profile and an expert placement and router bias fitted to each setup
WorkloadA code prompt and a 2K-token prose prompt, 256-token answers, greedy decoding

Bottom line

DeepSeek V4.1 Flash doesn't fit in one 128 GB box. On two, it writes code nearly twice as fast as on the biggest single box. Decode sends many small messages, one after another, so the link has to be fast for each one: the 100 GbE ConnectX writes every message straight into the other box's memory over RDMA, and the engine keeps each step on the GPU.


Related

Follow the cluster work

The engine is open source.

GitHub DeepSeek V4.1 post Discord