Instructions to use runrunway/Kimi-K3-REAP-448experts with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use runrunway/Kimi-K3-REAP-448experts with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="runrunway/Kimi-K3-REAP-448experts", trust_remote_code=True)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("runrunway/Kimi-K3-REAP-448experts", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use runrunway/Kimi-K3-REAP-448experts with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "runrunway/Kimi-K3-REAP-448experts" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "runrunway/Kimi-K3-REAP-448experts", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/runrunway/Kimi-K3-REAP-448experts
- SGLang
How to use runrunway/Kimi-K3-REAP-448experts with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "runrunway/Kimi-K3-REAP-448experts" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "runrunway/Kimi-K3-REAP-448experts", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "runrunway/Kimi-K3-REAP-448experts" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "runrunway/Kimi-K3-REAP-448experts", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use runrunway/Kimi-K3-REAP-448experts with Docker Model Runner:
docker model run hf.co/runrunway/Kimi-K3-REAP-448experts
Kimi-K3-REAP-448experts
A 50% expert-pruned, quality-unvalidated research artifact derived from moonshotai/Kimi-K3.
This is not Kimi K3. Half of the routed experts have been deleted and there has been no recovery training, so none of the base model's published benchmark results carry over β assume they do not hold here. If you want a working K3, use the original weights.
Compared with our earlier Kimi-K3-REAP-224experts, this checkpoint prunes half as aggressively and was selected with a calibration corpus that includes Chinese. In our own hands-on use it is the first of our three tiers that behaves like a usable model β see Hands-on impressions below, and note carefully what that section does and does not claim.
β οΈ What we do and do not know
1. No benchmark has been run on this checkpoint. None.
We have not measured SWE-bench, MMLU, perplexity, or anything else on these weights. Everything below is either a property of the surgery (verifiable), a subjective impression from our own use, or an expectation (not verified). Do not read "50% is safer than 75%" as "50% is safe", and do not read our impressions as scores.
What is known from the literature: we are not aware of a published result where a MoE survives 50% expert pruning without a healing phase and keeps its scores. Expect degradation.
2. There is no knee in the saliency curve at this ratio
Pruning to 448 experts discards 37.5% of the measured saliency mass (at 672 experts it would be 16.6%). The marginal cost per pruned expert rises monotonically through this region β 50% is a hardware-driven choice (it is what fits one 8ΓH200 node), not a point the measurements recommend.
3. Non-English: no longer visibly broken, but still not measured
Our 224-expert checkpoint is severely broken in Chinese β asked for a short story in Chinese it locks into a single-token loop, while its English reasoning in the same forward pass stays coherent. We traced that to the calibration corpus being >99% English: REAP scores an expert by its mean router-weighted activation over the tokens it actually sees, so experts specialising in an unseen language score near zero and are pruned first.
This checkpoint was selected with Chinese data added to the corpus (26% of calibration tokens), which measurably changes which experts survive β see below. On this checkpoint the collapse does not reproduce: the same prompts that break the 224 build return fluent, coherent Chinese here. That is a subjective observation on a handful of prompts, not a measurement of Chinese ability, and it is confounded β see the note at the end of the hands-on section. Treat non-English as "not visibly broken", not as validated.
4. Multimodal path is untouched but untested
Only text MoE experts were pruned; the vision tower is intact and we have never run an image through it. Assume nothing.
Hands-on impressions (not a benchmark)
We served this checkpoint and drove it with our own internal coding agent β a normal tool-calling loop over shell, file read/write/edit, and grep. This is subjective experience from a small number of sessions, not an evaluation. No task suite, no scoring, no repetitions, no baseline comparison. We are reporting it because "we never tried it" and "we tried it and it held up" are different states, and the card previously said the former.
What held up:
- Multi-step agentic work. A single session ran ~40 tool calls across roughly 35 model turns, building a small program from scratch, and stayed on task throughout. No turn-to-turn incoherence, no loss of the plan, no repair spiral of the kind we saw on the 224 build.
- Structured output. Every tool call in that session came back as valid JSON, and every call the agent issued executed without a malformed-arguments failure. K3's typed tool-call format deserves much of this credit.
- Chinese. Fluent and coherent, including the exact prompts that make the 224 build degenerate. We also scanned every assistant message in the session for degenerate repetition: the longest run of a repeated substring anywhere was 3 (a code-fence backtick). On the 224 build the same check finds runs in the thousands.
- Growing context. Prompt length grew past 30k tokens within one session with no degradation we could perceive.
What we did not establish: anything quantitative. We did not measure code correctness, instruction following, knowledge, math, long-context retrieval, or Chinese quality beyond "it is not degenerate". Nor did we compare against unpruned K3 on the same tasks β so we cannot tell you what the pruning cost. Assume it cost something.
β οΈ The Chinese result is confounded β do not cite it as proof the calibration fix works. Our 224 build differs from this one in two ways at once: the pruning ratio (75% β 50%) and the calibration corpus (English-only β Chinese-inclusive). Chinese working here is consistent with the corpus change being the cause, and our per-expert measurements predict the ratio change alone should not have fixed it (the affected experts sit at the bottom of the ranking at every cut point) β but that is a prediction, not a controlled result. The clean experiment is a 448 build selected with the English-only ranking, which we have not run.
The calibration-language effect, measured
This is the part of this artifact we think is genuinely worth publishing. Adding a Chinese corpus does not merely nudge the ranking β it changes which experts are kept, far beyond what adding the same amount of data can explain.
We compared three expert rankings computed from the same model and pipeline:
| Ranking | Corpus |
|---|---|
| A | 0.70 M tokens, English |
| B | 1.42 M tokens, English (A plus a second English shard) |
| C | 1.92 M tokens, English + Chinese (B plus 0.50 M Chinese tokens) |
At 448 kept experts per layer, over all 92 MoE layers (41,216 kept slots):
| Change | Slots whose keep/drop flips | |
|---|---|---|
| A β B: +0.72 M English | 1,222 | 2.96% β the noise floor |
| B β C: +0.50 M Chinese | 3,971 | 9.63% β 3.2Γ the floor, from less added data |
The Chinese-driven flips are not random churn near the cut point: 70% of the promoted experts are routed at least 1.5Γ more often (per token) by the Chinese corpus than by the English one, and their English support is well below the corpus median β that is, they were being under-measured rather than genuinely unimportant. The same pattern holds at 25% and 75% pruning.
Note what does not change: retained saliency mass at 448 is 62.6% under ranking B and 62.5% under C. The corpus changes which experts are kept, not how much mass survives. A language-blind corpus does not produce a visibly worse-looking pruning decision β which is precisely why this failure mode is easy to ship by accident.
We are not aware of this effect being documented in the expert-pruning literature, where evaluation is generally monolingual English.
What was and wasn't touched
Each of the 92 MoE layers keeps the 448 highest-saliency routed experts out of 896.
Because K3 ships in native MXFP4 (mxfp4-pack-quantized, group_size=32), removing an
expert is pure tensor surgery on the packed weights β nothing is dequantized or
requantized, and the per-group scales of surviving experts stay bit-for-bit valid, since
only whole experts are ever dropped.
| Component | Treatment |
|---|---|
Routed experts experts.{0..895}.w{1,2,3} |
Pruned to 448, renumbered 0..447, packed weights copied verbatim |
Router gate.weight, gate.e_score_correction_bias |
Rows sliced to kept experts (bias is frozen at inference, so no requantile pass is needed) |
Shared experts, latent routed_expert_up/down_proj |
Untouched |
| KDA / MLA attention, AttnRes projections | Untouched |
Norms, embeddings, lm_head, vision tower |
Untouched |
Kept experts stay in ascending original order, so router rows and expert indices remain
consistent. K3 uses topk_group=1 (no grouped routing), so no group-balance bookkeeping
is affected.
How the saliency was computed
REAP (router-weighted expert activation, mean-pooled over routed tokens). Scores are
accumulated in the latent space (β=3584): K3 applies routed_expert_down_proj before the
per-expert loop, and the shared up-projection is identical across experts in a layer, so it
cannot change their relative ranking.
| Coverage | 92 MoE layers (layer 0 is dense) Γ 896 experts, all finite, zero never-routed |
| Calibration tokens | 1.92 M |
| Support per expert | median 30,012 |
| Corpus | 74% English (code-instruction, reasoning, agentic coding traces), 26% Chinese (code instructions, reasoning, technical and general Q&A) |
| Sequence length | 32,768, left-truncated |
Because a token reaches only 16 of 896 experts, per-expert support is thinner than we would like; matching the coverage of our 256-expert experiments would need ~3.7 M tokens. Read the ranking as well-resolved at the top and noisier near the cut.
Retained saliency mass by tier, from the same scores: 25% pruned β 83.4%, 50% (this model) β 62.5%, 62.5% β 50.4%, 75% β 37.0%.
Serving
837 GB of weights β this needs 8ΓH200 (1128 GB) or equivalent; it does not fit a 4ΓH200
node. Requires vLLM 0.27+ and trust_remote_code. At the time of writing the only
working x86_64 path is the official image β the nightly wheels are aarch64-only.
docker run --gpus all -p 8000:8000 vllm/vllm-openai:kimi-k3-x86_64 \
--model runrunway/Kimi-K3-REAP-448experts \
--served-model-name k3-reap-448 \
--tensor-parallel-size 8 \
--enable-expert-parallel \
--trust-remote-code \
--enable-prefix-caching \
--enable-auto-tool-choice \
--tool-call-parser kimi_k3 \
--reasoning-parser kimi_k3
Notes from actually serving this build on 8ΓH200:
- The host NVIDIA driver must be β₯ 580 (CUDA 13.x) β the image ships
torch 2.13+cu130and fails late, after the weights download, on older drivers. --enable-prefix-cachingmust be passed explicitly; it is off by default for Kimi K3. Worth it: in an agent loop, which resends a long shared prefix every turn, we saw prefix cache hit rates near 90%.- Expert parallelism is preferable to pure tensor parallelism here β it keeps each MXFP4 expert whole on one rank instead of sharding quantized matrices across ranks. 448 divides evenly by 8, 6 and 4, so EP stays available at all three node shapes.
- On Hopper the MXFP4 MoE dispatches to the Marlin W4A16 path (
Using 'MARLIN' Mxfp4 MoE backend/Using MarlinExpertsin the log), so weights stay 4-bit in memory rather than being upconverted. The cost is that there are no FP4 tensor cores on Hopper and the matmuls run at bf16 rates: we measured roughly 40 tokens/s single-stream generation. Expect Blackwell to be substantially faster. - Weight load was ~108 GiB per rank (β861 GiB total) in about 57 s, and the server was
answering requests ~3 minutes after launch. During Marlin weight repacking vLLM logs a
No available shared memory broadcast block found in 60 secondswarning β in our runs this was benign. - K3's 69 KDA layers carry constant-size recurrent state, so KV is far cheaper than a
dense-KV transformer: at a 128k context window we got a ~707k-token KV cache, and a
30k-token prompt used under 5% of it. There is room to raise
--max-model-lenwell past the 32k we started with. - If startup dies in
flashinfer_autotuneor cudagraph capture withcp_world_size must be positive, pass--no-enable-flashinfer-autotuneand--attention-config '{"backend": "FLASHMLA"}'. Both were needed on Hopper. - If you point a client at this endpoint, make the client's declared context window match
your
--max-model-lenand check what output cap it actually puts on the wire. A client whose window bookkeeping disagrees with the server can land in a range where the server rejects the request but the client's own compaction has not triggered yet β which does not self-heal, it just fails every retry. This cost us an afternoon and was entirely our configuration, not the weights.
Other pruning ratios
Saliency is decoupled from the ratio β the same scores cut any tier without recomputation, and the pruning itself is CPU-only. If you want more headroom, 672 experts (25% pruned) discards only 16.6% of the saliency mass.
Our other published tiers, both from the same saliency scores:
| Tier | Size | Fits | Our standing |
|---|---|---|---|
| 448 (this model) | 837 GB | 8ΓH200 | The one we would use. Held up in hands-on agent use. |
| 384 | 734 GB | 6ΓH200 | Untested by us. Exists only because 6-GPU nodes were easier to get than 8. |
| 224 | 475 GB | 4ΓH200 | Past the breaking point β we do not recommend using it. Kept up as a data point. |
If you have 8 GPUs, take this one.
License and attribution
Derived from Kimi K3, Β© 2026 Moonshot AI, under the Kimi K3 License (included as
LICENSE), which permits derivative works and their distribution provided the copyright
and permission notice are retained. The base model, tokenizer, chat template, modeling code
and all of the capability that survives here are Moonshot AI's work; this repository
contributes only the expert selection and the surgery that applies it, and the defects
described above are ours, not theirs.
Pruning criterion: REAP, from Cerebras' work on router-weighted expert activation pruning.
Provided as is, without warranty of any kind β see Section 5 of the license.
- Downloads last month
- 26
Model tree for runrunway/Kimi-K3-REAP-448experts
Base model
moonshotai/Kimi-K3