Model update · DeepSeek · weight diff

DeepSeek-V4.1-Flash-1017: what changed

DeepSeek calls it a minor update. The config is byte-identical and every tensor keeps its name and shape, yet all 48 shards changed. We diffed 2,421 tensors over HTTP range reads: the main model moved by about one percent, the draft model behind its speculative decoding was rebuilt.

DeepSeekMIT
DeepSeek-V4.1-Flash-1017

MoE · Engram · DSpark · Oct 17 update

  • 4×B200·78 s·621 GiB·580
restore78 s cold start1,196 s
deepseek-v41-flash-1017Run
+11.1Terminal-Bench 4.0, the largest gain on the card
0 / 48shards left unchanged; config byte-identical
1.2%typical change in the main model’s full-precision weights
98%change in the draft model’s experts: rebuilt

01 · THE CLAIMA minor update with major gains

On October 17 DeepSeek published DeepSeek-V4.1-Flash-1017 and called it a minor update to V4.1-Flash, with “substantial improvements across reasoning, coding, agentic tasks, and visual benchmarks”, shorter outputs and faster task execution. These are the model card’s numbers, not ours:

model card · DS-V4.1-Flash-1017 against DS-V4.1-Flashpoints gained
Terminal-Bench 4.0 +11.1 (31.2 → 42.3) ProgramBench +8.8 (20.3 → 29.1) Apex Bench v1.1 +7.5 (64.6 → 72.1) HLE w/o tools +5.8 (36.8 → 42.6) Automation-Bench v1.0.6 +5.7 (54.8 → 60.5) Chartography (w/tools) +4.1 (78.9 → 83) Agents’ Last Exam +3.6 (31.8 → 35.4) BabyVision (w/tools) +2.9 (89.6 → 92.5) DeepSWE v1.1 +2.8 (74.2 → 77) NL2Repo-Bench +2.8 (65.4 → 68.2) ZeroBench-main (w/tools) +2.0 (49 → 51)

Terminal-Bench 4.0 and ProgramBench gain 11 and 9 points, HLE without tools 5.8. A minor version label usually means a light fine-tune, so we looked at what actually changed between the two checkpoints.

02 · THE FILESSame architecture, new bytes everywhere

The two repositories agree on structure exactly. config.json is byte-identical, and both checkpoints hold 96,085 tensors with the same names, data types and shapes, laid out over the same 48 safetensors shards. Every one of the 48 shards has a different SHA-256, so no shard was carried over unchanged. Around the weights, 1017 recommends top_p 1.0 (V4.1-Flash said 0.95 or 1.0) and drops the Jinja chat_template.jinja, the technical report and the evaluation patch; prompts are encoded with encoding.py or DeepSeek’s new deepseek-recipe library.

Where the 475 GiB go also tells you which parts a fine-tune can afford to touch:

DeepSeek-V4.1-Flash-1017 · checkpoint by component475 GiB
routed experts 268.9 GiB · 56.6% Engram tables 188.8 GiB · 39.7% MTP layers 7.2 GiB · 1.5% attention 4.7 GiB · 1.0% everything else 5.5 GiB · 1.2%

The 384 routed experts in each of 40 layers are FP4, packed two codes per byte with an E8M0 scale per block of 32, and take 57% of the checkpoint. The two Engram layers, lookup tables of 384 million FP8 rows each that the model reads from like a memory, take another 40%. Attention, the shared experts, the three MTP layers, the embeddings, the vision encoder and everything else fit in the remaining 17 GiB.

03 · METHODDiffing 950 GiB without downloading it

A safetensors file starts with a JSON header that gives every tensor’s type, shape and byte range, so an HTTP range read of the first few kilobytes of each shard maps the whole checkpoint. From there we read the same 16 KiB windows, at 25% and 75% into each tensor, from both releases and compared them. We sampled 2,421 tensors: every non-expert tensor of all 40 layers, 4 of the 384 experts in each layer and in each MTP layer, both Engram layers, and blocks 0, 16 and 31 of the vision encoder. That is about 110 MiB read instead of 950 GiB downloaded.

Two numbers per tensor. Codes changed is the share of stored values whose bits differ. Relative change is ‖Δ‖ / ‖W‖ over the decoded values. For BF16 and F32 tensors the relative change is the weight change itself. For FP4 and FP8 it is measured on the codes before their block scales, and quantization adds a floor: re-quantizing a slightly different weight flips a share of coarse FP4 codes even when the underlying weight barely moved. So the full-precision tensors give the clean picture, and the quantized ones are compared with each other.

04 · RESULTA light touch on the model, a new draft model

full-precision (BF16, F32) weights · median per part · log scale‖Δ‖ / ‖W‖
0.1% 1% 10% 100% attention sinks 0.2% final norm 0.5% layer norms 0.8% hyper-connections 1.5% output head 1.5% token embeddings 1.8% Engram query projection 2.6% vision encoder 2.6% expert router 5.0% sparse-attention indexer 5.8% vision → LM aligner 8.7% MTP layers, norms and router 9.4% DSpark heads 37.3% Engram key projection 97.4%
main modelvisiondraft stack: MTP layers and DSpark heads

The main model moved by about one percent. Layer norms changed by 0.8%, the hyper-connection mixers by 1.5%, the token embeddings by 1.8% and the output head by 1.5%. That is the signature of post-training on top of the same base: every weight moves, none moves much. The parts that moved most are the ones that decide where computation goes: the expert router (5.0%) and the sparse-attention indexer (5.8%), which picks the tokens each query attends to.

Vision moved more. The encoder changed by 2.6% and the aligner that projects image features into the language model by 8.7%, consistent with the visual benchmarks on the card.

The draft stack was retrained. DeepSeek-V4.1-Flash speculates with three MTP layers and DSpark heads that propose tokens for the main model to verify. Their full-precision weights changed by 9.4% at the median and the DSpark heads by 37.3%; the MTP experts, below, look like new weights. A better drafter means more accepted tokens per step, which is one way to deliver the “faster task execution” the card promises without touching the main model’s quality.

WeightsFormatCodes changedChange in decoded valuesTensors sampled
routed expertsFP4 (E2M1)26.6%21.4%480
MTP routed expertsFP4 (E2M1)88.0%98.5%36
attention projectionsFP8 (E4M3)64.4%8.3%200
shared expertsFP8 (E4M3)74.1%17.6%120
MTP attention and shared expertsFP8 (E4M3)94.9%56.6%24
Engram tablesFP8 (E4M3)28.7%7.3%2
expert block scalesE8M06.1%3.8%480

Read the quantized rows against each other. The main model’s FP4 experts flipped 26.6% of their codes; the MTP experts flipped 88.0%, with a decoded change of 98%: as different as two unrelated sets of weights. The Engram tables changed 28.7% of their entries by 7.3%, so the memory was updated too, while the projection that turns hidden states into Engram keys (97%) was replaced outright.

Where in depth

main model · layer norms · median per layerrelative change
0.0% 0.5% 1.0% 1.5% 2.0% 0 4 8 12 16 20 24 28 32 36 39 relative change

The norms changed most in the first eight layers, about 1.4%, and least in the middle of the stack, about 0.7%. The FP4 experts show the opposite shape, a few more codes flipped in the middle layers:

main model · routed experts · median per layerFP4 codes changed
0% 5% 10% 15% 20% 25% 30% 0 4 8 12 16 20 24 28 32 36 39 FP4 codes changed

05 · SERVING ITSame engine, new weights

Because the architecture did not change, the vLLM settings carry over: the 1017 profile is our 4×B200 profile for V4.1-Flash at the new revision, with tensor parallelism and expert parallelism over four GPUs, 32 GiB of FP8 KV cache per GPU, DSpark with five draft tokens and a 192K context, on vLLM’s SM100 kernels for the FP4 experts. On 8×B200 (four GPUs used), NVIDIA driver 580.173.02:

4×B200 · to the first served requestsame scale
vLLM cold start 1,196 s warmctl up, page cache 78.4 s
container, file trees · 2.6 sCRIU restore · 47.8 sCUDA state, 4 GPUs in parallel · 17.5 sshared GPU memory · 0.5 sweights reload, 293 GiB · 9.5 scanary · 0.5 s

A vLLM cold start takes 1,196 s before the first token. warmctl up restores the warmed engine in 78.4 s from page cache. CRIU is the largest step, 47.8 s, because the dump carries the Engram tables the engine keeps in pinned host memory: 326 GiB of process images next to 293 GiB of weights. The canary runs under a tolerance: FP4 experts are not bitwise repeatable, so the profile compares log-probabilities and warns rather than refusing to serve.

Tokens in → outConcurrentOutput tok/sTotal tok/sTTFT p50TPOT p50
1K → 51212457340.15 s3.2 ms
1K → 512321,7575,2702.41 s11.9 ms
1K → 5121284,43713,3100.44 s24.7 ms
1K → 2048646,87110,3060.08 s7.4 ms
8K → 51212043,4710.18 s4.3 ms
32K → 512115510,1040.55 s5.3 ms

Random-token prompts, medians per run. One request decodes at 316 tokens/s (3.2 ms per token with DSpark), 128 concurrent requests produce 4,437 output tokens/s, and 64 long generations 6,871. A 32K prompt gets its first token in 0.55 s.

06 · RUN ITBoth versions, side by side

The update is its own entry in the warmctl catalog, so warmctl up deepseek-v41-flash keeps serving the original while you compare:

$ curl -fsSL https://warmctl.io/install.sh | sh
$ warmctl up deepseek-v41-flash-1017

The profile and the v2.0.0-beta.7 release that ships it are on GitHub. The diff itself is two short scripts, headers.py and diff.py: Python’s standard library and HTTP range requests, adaptable to any pair of safetensors checkpoints on Hugging Face.