DeepSeek published DeepSeek-V4.1-Flash on Hugging Face on 10 September 2026 at 02:17 UTC, MIT licensed and ungated. I spent the day reading the files and poking the model through an OpenAI compatible endpoint instead of reading the announcement. Here is what is worth knowing before you start a download measured in hundreds of gigabytes.
TL;DR
- 552B backbone, 8B active in prefill and 16B in decode, 1,048,576 token context, reads images.
- Original checkpoint: 510.3 GB across 48 shards, FP8 with FP4 routed experts.
- Smallest community quant on day one: 168.9 GB. There is no four bit build yet.
- No released runtime can execute any of it. llama.cpp support is pull request 28696, opened the same day, still a draft, and it is a convert PR.
- The KV cache is 890 bytes per token. A full million token context is about 930 MB. That is the actual release.
- The reasoning effort is a 1 to 100 dial, not a switch, and telling it to stop makes the turn longer.
The number that fools people
Eight billion active parameters in prefill, sixteen in decode. Both figures are real and both describe compute per token, not memory. The router picks six of 384 routed experts per token and picks differently for the next one, so all 552B have to stay reachable.
There is a second store on top: DeepSeek calls it Engram, a conditional memory of 196B parameters looked up sparsely per token. It is in the checkpoint and it is not small.
Active parameters decide how fast it runs. Resident weights decide whether it starts.
What the quants actually weigh
Measured from the Hub on the evening of the release, summed per build:
| Build | Size | Notes |
|---|---|---|
| Original FP8 with FP4 experts | 510.3 GB | 48 shards, DeepSeek's own |
| MLX 2 bit with MTP | 238.8 GB | Apple silicon |
| GGUF Q2_K | 191.8 GB | 7 shards |
| GGUF mixed IQ2_XXS + Q2_K | 168.9 GB | smallest published |
The smallest one averages 2.25 bits per weight across the routed experts, and its author says plainly that it was made without an importance matrix, on a constant unit importance vector, as a memory bounded choice rather than a calibrated one. Two bit without calibration is not a free lunch.
The wall
You can download 168.9 GB today. You cannot run it.
Support lives in llama.cpp PR 28696, convert : add DeepSeek V4.1 (DeepseekV41ForCausalLM), opened 10 September 2026 at 10:23 UTC, about eight hours after the weights, and still marked draft. Read the title: it teaches the converter to write the GGUF. Writing the file and executing it are separate pieces of work.
The person who published the mixed two bit build says the same thing on the model card, and it is the most useful sentence written about this model so far: it is a weights artifact, and no runtime has yet been shown to execute it end to end.
This is normal for day one. GLM-5.3-Flash sat behind an unmerged PR for the same reason two weeks ago. It resolves in days or weeks. It has not resolved yet.
One trap if you convert it yourself
DeepSeek V4.1 stores FP8 block scales in 32 by 32 blocks. DeepSeek V4 used 128 by 128.
Carry the old value across and every weight in the model is silently rescaled. No error, no warning. You get a file that loads, runs and produces confident nonsense, which is the worst failure mode there is because it looks like a bad quant rather than a bad conversion.
If you see token soup out of a self converted build, check the block size before you blame anything else.
The part that is actually clever
Long context has a cost most tables hide. Every token leaves a key and value entry behind that stays in memory for the life of the conversation. On an agent that reads a repo, runs a command, reads the output and repeats for two hundred steps, that cache is the bill.
Three things bring it down here:
- A causal encoder decoder. 40 layers split into a 20 layer causal encoder and a 20 layer decoder. The decoder does not derive its global KV from each of its own layers, it projects it from the final encoder hidden states. One projection instead of twenty caches.
- CSA2. Each attention layer gets one of three static modes, Full, Reindex or Reuse, so layers share main KV and indexer keys. A hierarchical sparse indexer in the decoder restricts later indexing layers to a candidate pool built by the first Full layer, which stops indexing cost growing with context length.
- FP4 for the cache itself, E2M1 with one E4M3 scale per sixteen channels. Four bit weights are common. Four bit cache is not.
Result: 890 bytes per token, which DeepSeek puts at about a quarter of V4 Flash and one four hundred and thirty seventh of V1. A million token window costs roughly 930 MB of cache.
Their published benchmark table has exactly the shape you would predict. On agentic tests it takes the top row repeatedly against models with far more active compute: Terminal-Bench 2.1 at 90.6, DeepSWE v1.1 at 74.2, AutomationBench at 54.8, Codeforces rating 3471. On single shot reasoning it does not, and it lands slightly below its own V4 Pro sibling on GPQA Diamond. Those are vendor numbers, read them as such, but the pattern is consistent enough to be believable.
What the reasoning dial does when you tell it to stop
The model card describes a continuously controllable reasoning effort from 1 to 100. Every instruct benchmark was run at 100.
That collides with the OpenAI compatible convention, where reasoning_effort is a coarse setting with a none position. I ran the same question three times each way through DeepInfra, 700 max tokens, nothing else changed:
| Run | No signal | reasoning_effort: "none" |
|---|---|---|
| 1 | 42 out, 123 chars reasoning | 82 out, 0 chars |
| 2 | 42 out, 118 chars reasoning | 53 out, 0 chars |
| 3 | 42 out, 123 chars reasoning | 51 out, 0 chars |
The off signal did not stop the thinking. It stopped the thinking from being labelled, and the monologue moved into content, unmarked. In two of three runs no actual answer fit in the budget.
If you are building on this model: treat it as always reasoning, and do not offer your users a switch that makes their replies longer and dearer.
One more thing worth knowing. reasoning_effort: "max" is accepted, but acceptance proves nothing: an invalid value comes back 422 with the whole enum, which is provider level validation rather than a model capability. Measured on a hard prompt, max produced 308 characters of reasoning against 337 for high. There is no higher rung to reach for.
Two things I checked because tags lie
Vision. The card says multimodal, so I sent three 8x8 PNGs of different colours with one question each. Red, blue, green, correct every time. The older V4 Flash 0731 returns an error on image input, so this is genuinely new in the line.
Tools. A single get_weather function definition came back as a real tool_calls entry with {"city": "Berlin"}. Native, no prompt translation needed.
What to run locally instead this week
If you want a capable model on hardware you own today:
- Qwen 3.8 27B, 10.7 GB to 54.7 GB depending on the quant, Apache 2.0. The one that fits a single card.
- Ling 3.0 Flash, 27 GB at the smallest build, MIT, 5.1B active.
- GLM-5.3 Flash, 93.1 GB at the smallest build, MIT, reads images.
And if you want V4.1 Flash itself before the runtime lands, it is a hosted model for now, the same way Qwen 3.8 was until its open checkpoint hit HuggingFace on 12 August.
I maintain Locally Uncensored, a desktop app for running these models on your own machine, and the hosted catalogue at lu-labs.ai picked this one up on release day. The measurements above were taken while deciding how to label it in our own model picker, which is why they exist at all.
Top comments (0)