· James Meadlock & Milo · Funland dual DGX Spark

August DS4-F Testing: Anemll Stays Default

July closed with the Anemll 1M/6 recipe as the sticky dual-Spark route. Late July brought a fresh community package from r0b0tlab: vLLM 0.26.0+dspark.sm121.2, FlashInfer B12X, DSpark K=6, published C1 ~80.6 and C16 ~402. We ran a full A/B canary on the real pair, then put Anemll back.

Decision: KEEP ANEMLL 1M/6 as the production DS4-F lane.
Candidate is functionally good (tools + Hermes) and strong at C16, but Hermes-shaped Keys C1 is a tie and C4 drops ~13%. No cutover.
Live defaultAnemll 1M/6
Keys C1 (A vs B)72.4 / 72.7
Keys C4 delta−13%
B1 C16406.6 t/s
Dedicated C1 2k81.6 t/s
Hermes routeROUTE_OK

Architecture at a glance

Before → candidate → decision. Same pair, same weights, same Keys harness. Anemll is production again; the v0.26 image stays on disk.

What was tested

LaneRuntimeShapeRole this session
A · Anemll ghcr.io/anemll/dspark-vllm-gx10:0.1.1 1M / seqs=6 / batch=8192 / MTP5 / util=0.85 Baseline + restored default
B1 · r0b0tlab v0.26.0+dspark.sm121.2 digest sha256:269a1c6a… 327680 / seqs=16 / batch=16384 / K=6 / B12X Primary throughput canary
B2 · r0b0tlab long same image 327680 / seqs=1 / batch=8192 / K=6 Deep-prefill needle ladder (partial)

Weights revision on both nodes: 913f0657a874f76844e2e91cbe706dbcaceeb6d7. Pair was down at session start (Anemll container exited ~18h); restored before baseline benches.

Functional gates

GateAnemll Ar0b0tlab B1Anemll restore
/v1/models max_model_len1,048,576327,6801,048,576
Exact markerPASSPASSPASS
Tool call (get_weather)PASSPASSPASS
StreamingPASSPASS
Staggered C2PASS
Staggered C1616/16 PASS (agg 261.2 t/s)
Hermes spark-ds4ROUTE_OKROUTE_OKROUTE_OK
Correctness under churnbyte-identical; accept 0.333 (watch)

The Keys correctness harness labels low acceptance as FAIL; r0b0tlab’s own claims treat identical output as the hard gate and acceptance-under-churn as watch-only. We match that reading.

Throughput (same Keys harness)

Primary comparison uses benchmarks/keys-concurrency/bench_concurrent.py best-of-2 after warmup — the same ladder we used for the July Anemll and Patch3 reports.

ProbeAnemll Ar0b0tlab B1Delta
Keys C172.4 t/s72.7 t/s~tie (+0.4%)
Keys C4173.8 t/s151.1 t/s−13%
Keys C6211.0 t/s237.6 t/s+13%
Keys C8n/a (cap 6)259.3 t/s
Keys C16n/a406.6 t/smatches pub ~402
Dedicated C1 ×2048 mediannot run on A81.6 t/sbeats pub 80.58
Draft accept (Keys C1)~0.74–0.78~0.58–0.70lower on B1

After restore, Anemll Keys C1 was 69.7 t/s — normal cold variance versus the morning baseline, not a regression claim.

Read the harnesses separately. Keys short-gen C1 (~72 t/s) is not the same measurement as the dedicated 2048-token decode median (~81.6 t/s). Both are real; only the Keys ladder is apples-to-apples versus our Anemll baseline.

Long-context B2 (partial)

Separate boot: seqs=1, batch=8192, KV ~675k tokens. Needle retrieval (“secret code”) with synthetic filler:

TargetActual prompt tokensResultWall
~8k7,124PASS87.5 s
~32k28,368PASS291 s
~64k56,698PASS270 s
128k+Not completedstuck under seqs=1

This is not a Funland 300k qualification. It is proof that B2 deep-prefill works through ~57k actual tokens. Under max_num_seqs=1, one wedged long request owns the API until restart — plan a watchdog before finishing the ladder.

What changed since July

TopicJuly end-stateThis canary
Default routeAnemll 1M/6 after MiaAI-Lab recipeStill Anemll 1M/6 after explicit A/B
Community pressurePatch3 / Wesche-Keys / Anemll ladderr0b0tlab v0.26 SM121 package + GHCR image
Interactive C1 storyAnemll Keys C1 ~71 t/sCandidate Keys C1 ~tie; dedicated 2k decode strong
Multi-stream storyAnemll capped at C6 ~225 t/sCandidate C16 ~407 t/s if you need pile-up
Context ceilingServer 1M, Hermes capped 200kCandidate ~320k server; Hermes still 200k

Interpretation

For single-user Hermes / agent work on this pair, r0b0tlab v0.26 is not a free upgrade:

Where the candidate is genuinely interesting:

Current production call: leave spark-ds4 on Anemll 1M/6. Keep the v0.26 image tagged on both Sparks for a later multi-agent-focused canary, not a silent default flip.

Ops notes worth keeping

  1. HF hub snapshots need the full model repo mount (blobs + snapshots). Snapshot-only mounts break relative symlinks and fail model load.
  2. Multi-node Gloo needs VLLM_HOST_IP on each rank plus GLOO/TP/NCCL_SOCKET_IFNAME=bond0 and dual IB HCAs — otherwise init dies on 127.0.0.1.
  3. First B1 cold bind ~13–15 minutes (FlashInfer autotune + graphs). Warm restarts are faster.
  4. B2 seqs=1 means one stuck long request wedges the endpoint; restart the stack, don’t wait forever.

Provenance

ItemValue
Canary dateJuly 31, 2026 (Funland CDT)
Endpointhttp://192.168.1.11:8888/v1, model deepseek-v4-flash-dspark
Weightsdeepseek-ai/DeepSeek-V4-Flash-DSpark @ 913f0657…
Anemll imageghcr.io/anemll/dspark-vllm-gx10:0.1.1 · checkout /home/milo/ds4-f-mia-anemll-1m6
Candidate imageghcr.io/r0b0tlab/deepseek-v4-flash-dspark-v026-sm121:v0.26.0-sm121-optimized · digest sha256:269a1c6ac581f4fb2fe13110d2468159c3ca65c07ffb09b4080549673f625841
Keys harness/home/milo/ds4-f-wesche-keys-c12/benchmarks/keys-concurrency/bench_concurrent.py
Dedicated C1scripts/benchmark_dspark.py --concurrency 1 --repeats 5 --max-tokens 2048 (median of client decode rates)
Hermes proofhermes chat --provider spark-ds4 -m deepseek-v4-flash-dspark -q 'Reply exactly ROUTE_OK.' -Q --toolsets safe
Session artifacts~/.hermes/work/ds4f-canary-2026-07-31/DECISION.md and Spark1 /home/milo/ds4f-canary-2026-07-31/
Public upstream packager0b0tlab/DeepSeek-V4-Flash-DSpark-v026-SM121