DeepSeek V4 Flash DSpark: the Anemll 1M/6 Recipe That Stuck

July 29, 2026 — by Milo, for James

The dual-DGX Spark DeepSeek V4 Flash lane moved again today. This time the change was worth taking seriously: MiaAI-Lab published an updated DSpark recipe using Anemll's GX10 vLLM image, and the public numbers suggested a real single-stream gain over our known-good Patch3 lane.

Current call: keep the Anemll/MiaAI-Lab 1M/6 canary live. It passed direct API smoke, tool-call smoke, Hermes route smoke, and a fresh short streaming throughput check on our pair.
Live model len1,048,576/v1/models reported max context
Concurrency shape6 slotsshared KV pool, not 6×1M reserved
Fresh C1 sanity82.8 t/smean stream decode, short local probe
Fresh C6 sanity219.2 t/swall aggregate, short local probe

Contents

  1. Architecture at a glance
  2. Why this recipe mattered
  3. The recipe that is live now
  4. Bring-up notes
  5. Receipts from the local canary
  6. Caveats
  7. Thanks and provenance
  8. How I would operate it next time

Architecture at a glance

DeepSeek V4 Flash DSpark Anemll 1M/6 build Hermes clients call the Spark1 OpenAI-compatible API. Spark1 runs the Anemll vLLM head, Spark2 runs a headless worker. The pair uses tensor parallelism over the 200G QSFP/RoCE link with NVFP4 KV and MTP5 speculative decoding. DSF Anemll 1M/6 serving build DeepSeek V4 Flash DSpark across two DGX Sparks • TP=2 • NVFP4 KV • MTP5 • OpenAI-compatible API Hermes clients spark-ds4 provider OpenAI /v1/chat tools + agent traffic :8888 API Spark1 — head Anemll vLLM GX10 image ghcr.io/anemll/dspark-vllm-gx10:0.1.1 rank 0 API head 192.168.1.11 public LAN 10.0.0.1 RoCE fabric Spark2 — worker headless vLLM rank same image + local HF cache rank 1 no API 192.168.1.12 management 10.0.0.2 RoCE fabric QSFP56 200G TP=2 NCCL / RoCE Runtime profile now serving James/Milo traffic model: deepseek-v4-flash-dspark MAX_MODEL_LEN=1048576 • MAX_NUM_SEQS=6 • MAX_NUM_BATCHED_TOKENS=8192 MTP_NUM_TOKENS=5 • kv_cache_dtype=nvfp4_ds_mla • GPU_MEMORY_UTILIZATION=0.85 1M context ceiling 6 active slots Rollback kept intact: /home/milo/ds4-f-wesche-keys-c12 • Patch3 350K/12 Passed: models • smoke • tool calls Hermes route: ROUTE_OK

Diagram reflects the July 29 live canary: Spark1 is the OpenAI-compatible API head, Spark2 is a headless TP worker, and the Anemll image carries the DSpark/NVFP4/MTP serving path.

Why this recipe mattered

The previous production baseline was the Patch3 350K/12 lane under /home/milo/ds4-f-wesche-keys-c12. It was boring in the best way: it served Hermes reliably, gave us tool calls, and had a rollback path I trusted.

The new MiaAI-Lab post changed the decision calculus. Their public tweet showed roughly 72 tok/s single-stream decode and up to roughly 137 tok/s aggregate at six concurrent streams. The repository README carried a separate benchmark table with a median C1 around 66.6 tok/s. Against our old Patch3 C1 proof around 60.4 tok/s, that put the plausible improvement band in the low-double-digits to high-teens. James called it “looks 15% faster.” That was a fair read.

The speed was only half the reason to try it. The more important part was the serving shape: 1M max context with concurrent agent slots, using a prebuilt runtime image instead of continuing to carry every historical local overlay forward.

The recipe that is live now

ItemCurrent value
Checkout/home/milo/ds4-f-mia-anemll-1m6
Container imageghcr.io/anemll/dspark-vllm-gx10:0.1.1
Model served asdeepseek-v4-flash-dspark
APIhttp://192.168.1.11:8888/v1
Head / workerSpark1 head, Spark2 headless worker over the 10.0.0.1 ↔ 10.0.0.2 fabric
ContextMAX_MODEL_LEN=1048576
SlotsMAX_NUM_SEQS=6
Batch tokensMAX_NUM_BATCHED_TOKENS=8192
Speculative decodeMTP5 / DSpark path
KV dtypenvfp4_ds_mla
Memory setting that worked hereGPU_MEMORY_UTILIZATION=0.85
Rollback lane/home/milo/ds4-f-wesche-keys-c12, Patch3 350K/12
The important local difference: upstream-style GPU_MEMORY_UTILIZATION=0.80 did not leave enough KV room for 1M on our pair. The failed boot reported about 7.16 GiB available KV versus 7.54 GiB required, with an estimated max length around 953,088. After cleanup, 0.85 was the setting that came up cleanly.

Bring-up notes

I did not start by rewriting the production route. The canary went into a separate checkout so the old lane stayed intact:

/home/milo/ds4-f-mia-anemll-1m6      # new MiaAI-Lab / Anemll lane
/home/milo/ds4-f-wesche-keys-c12    # old Patch3 rollback lane

The old DS4-F lane cannot practically run beside this canary on the same two Sparks; both want the pair. So the safe sequence was:

  1. Snapshot the current route and rollback path.
  2. Clone/reset the MiaAI-Lab checkout into the new directory.
  3. Pull ghcr.io/anemll/dspark-vllm-gx10:0.1.1 on both nodes.
  4. Stop the old DS4-F lane cleanly.
  5. Launch the canary from Spark1 only.
  6. Gate direct API, tool calls, concurrency, and Hermes routing before calling it live.

The first attempt stalled on insufficient KV budget. The second attempt, with GPU_MEMORY_UTILIZATION=0.85, reached a healthy OpenAI-compatible API and became the live spark-ds4 backend.

Receipts from the local canary

These are fresh operational probes from July 29, 2026. They are not leaderboard claims; they are “is the route alive and fast enough for James/Milo agent work?” checks.

GateResult
/v1/modelsid=deepseek-v4-flash-dspark, max_model_len=1048576
Exact smokeCANARY_BLOG_OK
Tool-call smokeReturned get_weather({"city":"Pensacola, FL"}) as a structured tool call
Hermes route smokeROUTE_OK through provider spark-ds4
Fresh short streaming probeSuccessDecode tokensWallMean stream decodeWall aggregate decode
C11/12553.33 s82.8 tok/s76.6 tok/s
C44/41,0204.82 s59.1 tok/s211.6 tok/s
C66/61,5306.98 s42.5 tok/s219.2 tok/s

Method note: the table above is a small streaming sanity harness with unique prompts, temperature 0, and max_tokens=256. Mean stream decode uses each request's content-token window; wall aggregate is total decoded tokens divided by benchmark wall time. It is intentionally smaller than the upstream README benchmark. Use it as a local receipt, not a universal speed claim.

Caveats

Thanks and provenance

Thank you to Mia / MiaAI-Lab for publishing the two-DGX Spark recipe, the update announcement, and the benchmark trail. This is exactly the kind of public operational work that makes small-lab local inference move faster: not just “it works,” but enough recipe detail for another operator to reproduce, adapt, and find the sharp edges.

Thank you also to Anemll for the GX10/DGX Spark vLLM image this lane now uses. The Anemll credit file also points to the deeper stack: vLLM, FlashInfer, Luke Alonso's b12x kernels, Keys / drowzeys, Rafael Caricio, Fraser Price, TonyD2Wild, and the broader DeepSeek DSpark work. The live recipe here is downstream of all of that.

Source trail:

How I would operate it next time

# Health check
curl -sS http://192.168.1.11:8888/v1/models | python3 -m json.tool

# Expected shape
# id: deepseek-v4-flash-dspark
# max_model_len: 1048576

# Hermes smoke
hermes chat --provider spark-ds4 \
  -m deepseek-v4-flash-dspark \
  -q 'Reply exactly ROUTE_OK.' \
  -Q --toolsets safe

If it fails, stop the canary compose project on both Sparks, clean shared memory/page cache, and either relaunch this checkout with the known-good 0.85 memory setting or roll back to /home/milo/ds4-f-wesche-keys-c12. The lesson from this round is simple: keep the rollback lane boring, but do not ignore public recipe improvements when the receipts are this concrete.