798 lines
47 KiB
Plaintext
798 lines
47 KiB
Plaintext
---
|
||
title: DeepSeek-V4
|
||
description: "Deploy DeepSeek-V4 with SGLang — verified launch commands, benchmarks, and tuning for Flash Official (0731), Flash, Flash Vision (Exp), Pro, and Pro Official (0813)."
|
||
---
|
||
|
||
## Deployment
|
||
|
||
<a id="install" />
|
||
|
||
<Accordion title="Install SGLang">
|
||
|
||
For all methods and hardware platforms, see the [official SGLang installation guide](../../../docs/get-started/install). The two paths below match the **Python / Docker** toggle in the command panel.
|
||
|
||
<Tabs>
|
||
|
||
<Tab title="Python (pip / uv)">
|
||
|
||
```bash Command
|
||
pip install --upgrade pip
|
||
pip install uv
|
||
uv pip install --prerelease=allow sglang
|
||
```
|
||
|
||
Then run the **Python** output of the command panel below in that environment.
|
||
|
||
</Tab>
|
||
|
||
<Tab title="Docker">
|
||
|
||
For how to launch the image, see [Install → Method 3: Using Docker](../../../docs/get-started/install#method-3-using-docker). A minimal example (substitute the inner `sglang serve ...` with whatever the command generator below produces):
|
||
|
||
**NVIDIA GPUs**
|
||
|
||
A single image — `lmsysorg/sglang:latest` — covers the **datacenter GPUs** in this cookbook (B200 / B300 / GB200 / GB300 / H100 / H200 / RTX PRO 6000). The one exception is **Flash Vision (Exp)**, whose support has not shipped in a release yet: its cells use the preview image `lmsysorg/sglang:dev-dsv4-flash-vision` (the command panel picks it automatically — see the [Flash Vision notes](#vision-note)). **DGX Spark** is the other exception: its three cells (Flash Official FP4, Flash Official NVFP4, Flash Vision FP4) use the DGX Spark–only preview image `lmsysorg/sglang:dev-v4f-2dgx-v2` (the command panel picks it automatically — see the [DGX Spark notes](#spark-note)); do not use that image on any other hardware.
|
||
|
||
```bash Command
|
||
docker pull lmsysorg/sglang:latest
|
||
|
||
docker run --gpus all \
|
||
--shm-size 32g \
|
||
-p 30000:30000 \
|
||
-v ~/.cache/huggingface:/root/.cache/huggingface \
|
||
--env "HF_TOKEN=<your-hf-token>" \
|
||
--ipc=host \
|
||
lmsysorg/sglang:latest \
|
||
sglang serve <use args below>
|
||
```
|
||
|
||
**AMD GPUs (ROCm)**
|
||
|
||
AMD uses the daily-updated `lmsysorg/sglang-rocm` images. You can find the latest images on [Docker Hub](https://hub.docker.com/r/lmsysorg/sglang-rocm/tags). We recommend the ROCm 7.2 version.
|
||
|
||
For example:
|
||
- **MI355X** → `lmsysorg/sglang-rocm:v0.5.18-rocm720-mi35x-20260829`
|
||
- **MI300X** → `lmsysorg/sglang-rocm:v0.5.18-rocm720-mi30x-20260829`
|
||
|
||
```bash Command
|
||
docker pull lmsysorg/sglang-rocm:v0.5.18-rocm720-{mi35x,mi30x}-20260829
|
||
|
||
docker run \
|
||
--device=/dev/kfd --device=/dev/dri \
|
||
--group-add video \
|
||
--cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
|
||
--shm-size 32g --ipc=host \
|
||
-p 30000:30000 \
|
||
-v ~/.cache/huggingface:/root/.cache/huggingface \
|
||
--env "HF_TOKEN=<your-hf-token>" \
|
||
lmsysorg/sglang-rocm:v0.5.18-rocm720-{mi35x,mi30x}-20260829 \
|
||
sglang serve <use args below>
|
||
```
|
||
|
||
</Tab>
|
||
|
||
</Tabs>
|
||
|
||
</Accordion>
|
||
|
||
Pick your hardware + recipe to generate the launch command. The three serving strategies cover the common operating points:
|
||
|
||
- **Low-Latency** — fastest reply for a single user. Pick for chat.
|
||
- **Balanced** — good speed with several users at once. Use for typical multi-user serving.
|
||
- **High-Throughput** — most tokens per second across many users. Best for batch jobs.
|
||
|
||
import { Deployment } from "/src/snippets/_deployment.jsx";
|
||
import { config } from "/src/snippets/configs/deepseek-ai/deepseek-v4.jsx";
|
||
import { benchmarks } from "/src/snippets/configs/deepseek-ai/deepseek-v4-benchmarks.jsx";
|
||
|
||
<Note>
|
||
The **Flash Vision (Exp)** variant runs on a dedicated preview Docker image, `lmsysorg/sglang:dev-dsv4-flash-vision` — its support ([sgl-project/sglang#37253](https://github.com/sgl-project/sglang/pull/37253)) has not shipped in a release yet. The command panel's Docker mode emits that image automatically for Flash Vision cells; see the [Flash Vision notes](#vision-note).
|
||
</Note>
|
||
|
||
<Deployment config={config} benchmarks={benchmarks} />
|
||
|
||
<Note>
|
||
For a runnable end-to-end example, see the [DeepSeek-V4-Flash demo notebook](https://github.com/sgl-project/sglang/blob/main/docs/demo/deepseek_v4_flash.ipynb).
|
||
</Note>
|
||
|
||
<div style={{fontSize: "0.85em", lineHeight: "1.55", color: "#6b7280", margin: "0.5rem 0 1rem 0"}}>
|
||
<p style={{margin: "0 0 0.3rem 0"}}><strong>Panel controls</strong> (top of the command box):</p>
|
||
<ul style={{margin: 0, paddingLeft: "1.25rem"}}>
|
||
<li style={{marginBottom: "0.2rem"}}><strong>Python / Docker</strong> — bare <code>sglang serve …</code> for an existing SGLang env, or a <code>docker run … sglang serve …</code> wrap against the per-hardware image from the <a href="#install">Install SGLang</a> panel above.</li>
|
||
<li style={{marginBottom: "0.2rem"}}><strong>⧉ Copy</strong> — copies the current command (with whichever framing is active) to your clipboard.</li>
|
||
<li style={{marginBottom: "0.2rem"}}><strong>$ cURL</strong> — a sample request against <code>localhost:30000</code> to confirm the server is up.</li>
|
||
<li style={{marginBottom: "0.2rem"}}><strong>⚙ Env</strong> — edits the placeholders (<code>HOST_IP</code>, <code>PORT</code>, <code>HF_TOKEN</code>, <code>NODE_RANK</code>, <code>NODE0_IP</code>) the command and cURL share. Persists in localStorage across cookbooks.</li>
|
||
<li><strong>Verified / Not Verified</strong> badge — green when the <code>(hw, variant, quant, strategy, nodes)</code> combo has been run end-to-end on real hardware; yellow when auto-derived from a neighbor and not yet re-checked.</li>
|
||
</ul>
|
||
</div>
|
||
|
||
## Playground
|
||
|
||
The Playground is where you experiment with **SGLang features beyond the verified matrix**. The Deploy panel above only emits combinations the SGLang team has signed off on; the Playground lets you turn on additional knobs on top of whichever cell the Deploy panel is currently showing. The base is read live from your Deploy selection — only your overrides change.
|
||
|
||
The knobs come in two flavors:
|
||
|
||
- **Built-in SGLang features** — parallelism overrides (TP / CP / DP-Attention — DP-Attention's value is the DP degree, with `off` to disable), MoE backend + EP, reasoning / tool-call parsers, speculative-decoding presets, prefill/decode disaggregation, HiCache tiers, and HiSparse hierarchical sparse attention (decode-role only — the card appears once PD-Disagg mode is set to decode).
|
||
- **DeepSeek-V4 specific features** — MegaMoE W4A8 / W4A4 fused kernel (Blackwell only; Hopper SM90 uses a separate all-FP8 MegaMoE path — see Configuration Tips below).
|
||
|
||
Lines highlighted **green** are added by your overrides; lines with **red strikethrough** were in the verified base but stripped by an override. When no override differs from the base cell, the playground inherits the base's **Verified** badge; any actual change flips it to **Not Verified** until the new configuration is run end-to-end and submitted back.
|
||
|
||
import { Playground } from "/src/snippets/_playground.jsx";
|
||
|
||
<Playground config={config} />
|
||
|
||
<div style={{fontSize: "0.85em", lineHeight: "1.55", color: "#6b7280", margin: "0.5rem 0 1rem 0"}}>
|
||
<p style={{margin: "0 0 0.3rem 0"}}><strong>Panel controls</strong> reuse <strong>Python / Docker</strong> · <strong>⧉ Copy</strong> · <strong>$ cURL</strong> · <strong>⚙ Env</strong> from the Deploy panel, plus one extra:</p>
|
||
<ul style={{margin: 0, paddingLeft: "1.25rem"}}>
|
||
<li><strong>Submit ↗</strong> — opens a pre-filled GitHub issue so you can land your override combo as a new verified cookbook cell. Shown only while the badge says <strong>Not Verified</strong>; click it once you've actually run the command on your hardware and confirmed it works.</li>
|
||
</ul>
|
||
</div>
|
||
|
||
## 1. Model Introduction
|
||
|
||
**DeepSeek-V4** is the next-generation Mixture-of-Experts model from DeepSeek, released 2026-04-24 under an **MIT License**. The 0731 Flash and 0813 Pro refreshes add checkpoints with a bundled DSpark draft head, and the experimental Flash Vision checkpoint builds image understanding on top of the 0731 Flash base:
|
||
|
||
<table style={{width: "100%", borderCollapse: "collapse", tableLayout: "fixed"}}>
|
||
<colgroup>
|
||
<col style={{width: "30%"}} />
|
||
<col style={{width: "15%"}} />
|
||
<col style={{width: "15%"}} />
|
||
<col style={{width: "40%"}} />
|
||
</colgroup>
|
||
<thead>
|
||
<tr style={{borderBottom: "2px solid #d55816"}}>
|
||
<th style={{textAlign: "left", padding: "10px 12px", fontWeight: 700, whiteSpace: "nowrap", backgroundColor: "rgba(255,255,255,0.02)"}}>Variant</th>
|
||
<th style={{textAlign: "right", padding: "10px 12px", fontWeight: 700, whiteSpace: "nowrap", backgroundColor: "rgba(255,255,255,0.05)"}}>Total params</th>
|
||
<th style={{textAlign: "right", padding: "10px 12px", fontWeight: 700, whiteSpace: "nowrap", backgroundColor: "rgba(255,255,255,0.02)"}}>Active (MoE)</th>
|
||
<th style={{textAlign: "left", padding: "10px 12px", fontWeight: 700, whiteSpace: "nowrap", backgroundColor: "rgba(255,255,255,0.05)"}}>Use</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}><strong><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash">DeepSeek-V4-Flash</a></strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.05)"}}><strong>284B</strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.02)"}}>13B</td>
|
||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>single-node serving on B200 / B300 / GB200 / GB300 / H200 (TP=4); RTX PRO 6000 (TP=2); H100 (TP=8)</td>
|
||
</tr>
|
||
<tr>
|
||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}><strong><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731">DeepSeek-V4-Flash-0731</a></strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.05)"}}><strong>304</strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.02)"}}>13B</td>
|
||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>Flash Official (0731), with a bundled DSpark draft head; verified on 8×B200, 4×GB300, and 4×H200</td>
|
||
</tr>
|
||
<tr>
|
||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}><strong><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-Vision-Exp">DeepSeek-V4-Flash-Vision-Exp</a></strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.05)"}}><strong>305B</strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.02)"}}>13B</td>
|
||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>Flash Vision (Exp) — experimental multimodal (image-text-to-text): the 0731 Flash base + vision encoder & aligner; verified on 4×B200 (TP=4), requires the <a href="#vision-note">preview build</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}><strong><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro">DeepSeek-V4-Pro</a></strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.05)"}}><strong>1.6T</strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.02)"}}>49B</td>
|
||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>high-capacity: B200 / B300 (TP=8) · GB300 (TP=4) · H200 FP4 (TP=8) · GB200 (2-node, TP=8) · H200 FP8 (2-node, TP=16) · H100 (2-node, TP=16)</td>
|
||
</tr>
|
||
<tr>
|
||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}><strong><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro-0813">DeepSeek-V4-Pro-0813</a></strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.05)"}}><strong>1.65T</strong></td>
|
||
<td style={{padding: "9px 12px", textAlign: "right", backgroundColor: "rgba(255,255,255,0.02)"}}>49B</td>
|
||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>Pro Official (0813), with a bundled DSpark draft head; verified on 4×GB300 (TP=4) · B200 / B300 / H200 FP4 (TP=8) · GB200 (2-node, TP=8) · H100 (2-node, TP=16) · MI355X</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
The Instruct checkpoints ship as **FP4 MoE experts + FP8 attention / dense** (one mixed-precision checkpoint covers every FP4-capable GPU). Matching `*-Base` repos ship pure FP8 mixed and are for further pre-training only — not for chat or tool calling.
|
||
|
||
**Highlights:** hybrid CSA + HCA attention (~27% inference FLOPs / ~10% KV cache vs DSv3.2 at 1M context), manifold-constrained hyper-connections (mHC), Muon optimizer, **1M-token context** (32T+ pre-training tokens), three reasoning modes (*Non-think* / *Think High* / *Think Max* — use ≥ 384K context for Think Max), and a dedicated `encoding_dsv4.encode_messages` Python encoder + DSML tool-call grammar.
|
||
|
||
**Recommended generation:** `temperature=1.0`, `top_p=1.0`.
|
||
|
||
**Resources:** HuggingFace · [Flash Official (0731)](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731) · [Flash](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash) · [Flash Vision (Exp)](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-Vision-Exp) · [Pro](https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro) · [Pro Official (0813)](https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro-0813) · ModelScope · [Flash](https://modelscope.cn/models/deepseek-ai/DeepSeek-V4-Flash) · [Pro](https://modelscope.cn/models/deepseek-ai/DeepSeek-V4-Pro).
|
||
|
||
## 2. Configuration Tips
|
||
|
||
{/* TODO: expand this section as more recipes are validated end-to-end. */}
|
||
|
||
**Concurrency & DeepEP dispatch buffer**
|
||
|
||
Must hold: `max-running-requests × MTP_draft_tokens ≤ SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK`. Violating it blows DeepEP's dispatch buffer at steady-state load (`deep_ep.cpp:1105`). When tuning, move `--cuda-graph-max-bs-decode`, `--max-running-requests`, and the env together.
|
||
|
||
The generator currently picks values on the **conservative** side (mirroring an internal stress-test matrix). They run safely out of the box but likely leave throughput on the table — please tune them up toward your actual workload's peak concurrency and report findings back so the defaults can be revised.
|
||
|
||
**Speculative decoding**
|
||
|
||
The original Flash and Pro recipes use EAGLE. Flash Official (0731) and Pro Official (0813) use the bundled DSpark draft head; see [DSpark](#3-4-dspark-speculative-decoding) for its launch and tuning notes.
|
||
|
||
<Warning>
|
||
Do not use EAGLE on the checkpoints that bundle a DSpark head. On 0813, `--speculative-algorithm EAGLE` starts and serves without any error, but the draft head it binds accepts nothing — every decode batch logs `accept len: 1.00, accept rate: 0.00`, so you pay the draft cost for zero speedup. Output stays correct, which is what makes it easy to miss. Switch to `--speculative-algorithm DSPARK`; the startup log then reports `Draft checkpoint bundles a DSpark head`.
|
||
</Warning>
|
||
|
||
For the original Flash and Pro checkpoints:
|
||
|
||
- `low-latency`: steps=3, draft-tokens=4 → largest win at bs=1.
|
||
- `balanced`: steps=1, draft-tokens=2 → gentler MTP, reduces throughput hit at higher batch.
|
||
- `high-throughput`: MTP disabled — at saturation the verify step costs more than it saves.
|
||
- MTP runs on the v2 speculative path.
|
||
|
||
<a id="spark-note" />
|
||
|
||
**DGX Spark (2x GB10): Flash Official FP4 / NVFP4, Flash Vision FP4**
|
||
|
||
The **DGX Spark** row has three recipes, all **Balanced · Multi-Nodes**: **Flash Official (0731) · FP4**, **Flash Official (0731) · NVFP4**, and **Flash Vision (Exp) · FP4**. None of these checkpoints fits one 128GB GB10, so every recipe runs TP=2 across two DGX Sparks connected over ConnectX-7 (RoCE). Every other DGX Spark combination is greyed out on purpose.
|
||
|
||
- **Docker image** — all three cells use `lmsysorg/sglang:dev-v4f-2dgx-v2`, a preview build made **only for DGX Spark** (branch `b12x-vision` @ `452239a74f`): it bakes in the SM12x `b12x` MoE (W4A8) and compressed-MLA attention kernels ([#34878](https://github.com/sgl-project/sglang/pull/34878), [#35899](https://github.com/sgl-project/sglang/pull/35899), [#34018](https://github.com/sgl-project/sglang/pull/34018)), the Flash Vision model support ([#37253](https://github.com/sgl-project/sglang/pull/37253)), the b12x image-prefill fix that lets Flash Vision serve images on SM12x, the NVFP4 MTP-layer dispatch fix, and the CuTeDSL and NCCL pins the GB10 pair needs. Do not use it on other hardware, and use the panel's Docker mode — the bare Python command needs the `b12x` kernel package this image ships.
|
||
- **Run the same command on both Sparks** with `--node-rank 0` / `--node-rank 1` and `--dist-init-addr` pointing at node 0 over the ConnectX-7 link. The `docker run` flags the panel emits (`--network host --ulimit memlock=-1:-1 --cap-add IPC_LOCK --device /dev/infiniband`) are what let NCCL use RDMA; without them NCCL silently falls back to TCP and decode slows by roughly 40%.
|
||
- **Env knobs** in the cells are part of the recipe: `SGLANG_SM120_FLASHMLA_BACKEND=b12x` selects the b12x attention path, `SGLANG_B12X_MAX_TOKENS` must equal `--chunked-prefill-size`, and `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True` avoids unified-memory fragmentation OOMs on GB10.
|
||
- **NVFP4 (`nvidia/DeepSeek-V4-Flash-0731-NVFP4`)** — only the routed experts are NVFP4; attention, shared experts and the DSpark MTP layer stay in the checkpoint's native formats. On SM12x that means three extra flags: `--moe-runner-backend flashinfer_cutlass` (b12x's MoE is MXFP4-only and trtllm-gen kernels are sm100-only), `--speculative-moe-runner-backend b12x` (the DSpark draft's MTP experts are MXFP4 and run on b12x), and `--disable-shared-experts-fusion` (HashTopK rejects fused shared experts under the cutlass runner). Throughput and DSpark acceptance match the FP4 cell within noise.
|
||
- **Flash Vision** — images are served natively on the b12x recipe with the same flags as Flash Official (send `image_url` content on `/v1/chat/completions`, see [Vision](#3-5-vision-image-inputs)); text-only requests work unchanged. Expect roughly 15–20% lower text throughput than Flash Official on this checkpoint — its bundled DSpark head accepts fewer drafts (~3.2 vs ~3.9) — with text accuracy intact.
|
||
|
||
<a id="vision-note" />
|
||
|
||
**DeepSeek-V4-Flash-Vision-Exp (Experimental)**
|
||
|
||
[`deepseek-ai/DeepSeek-V4-Flash-Vision-Exp`](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-Vision-Exp) is DeepSeek's first experimental multimodal V4 checkpoint: the 0731 Flash base plus a vision encoder and aligner, served through the same `sglang serve` flow with OpenAI-style `image_url` inputs (see [Vision](#3-5-vision-image-inputs) below). Select the **Flash Vision** variant in the Deploy panel for its recipes.
|
||
|
||
- **Preview build required** — support lands via [sgl-project/sglang#37253](https://github.com/sgl-project/sglang/pull/37253) and has not shipped in a release. Docker mode on the Flash Vision cells already emits the preview image `lmsysorg/sglang:dev-dsv4-flash-vision`; for a Python environment, install SGLang from that PR's branch. The DGX Spark Flash Vision cell is the exception: it uses the DGX Spark image `lmsysorg/sglang:dev-v4f-2dgx-v2` (see the [DGX Spark notes](#spark-note)).
|
||
- **Verified matrix** — MMMU-Pro via sgl-eval at `temperature 1.0`, `top-p 0.95`, `--reasoning-effort max`.
|
||
- **Engine auto-configuration** — the engine picks the `flashinfer_mxfp4` MoE runner and auto-disables shared-experts fusion for this checkpoint (its HashTopK routing rejects fused shared experts); don't pass `--enforce-shared-experts-fusion`.
|
||
- **Chunked prefill & radix cache stay enabled** — the scheduler keeps image spans consistent automatically: chunked-prefill truncation points are span-aligned (an image span always prefills within a single extend, overshooting the chunk budget by at most one span), and a radix-cache prefix match ending deep inside an image span is re-issued from the span start.
|
||
- **Speculative decoding** — the checkpoint bundles a DSpark head, and the low-latency recipes enable it with `--speculative-algorithm DSPARK` (verified with image batches on B200 via the MMMU-Pro round; the other hardware rows are pending verification). The balanced and high-throughput recipes run target-only: they use DP Attention, which DSpark is incompatible with on current releases. As on the 0731/0813 checkpoints, do not pass the EAGLE flags.
|
||
|
||
**Shared experts fusion (Blackwell, flashinfer_mxfp4)**
|
||
|
||
On the Blackwell fp4 recipes (`--moe-runner-backend flashinfer_mxfp4`), the shared expert runs as a separate FP8 MLP on an alternate stream by default. Adding:
|
||
|
||
```bash Command
|
||
--enforce-shared-experts-fusion
|
||
```
|
||
|
||
routes it as one extra MXFP4 expert through the same trtllm-gen MoE kernel, so the whole MoE runs on a single stream (~4 fewer kernel launches and 2 fewer stream syncs per MoE layer). The shared expert is requantized from FP8 to MXFP4 at load time. Measured on GB200 tp4: gsm8k and AIME25 accuracy on par with the unfused baseline; Mean TTFT -13% to -21% and P99 ITL -15% to -53% at QPS 1-8 with neutral throughput.
|
||
|
||
Only for deployments without expert parallelism (e.g. the single-node low-latency recipes): with `moe_ep_size > 1` the flag is rejected at startup, unless the DeepEP/MegaMOE per-rank shared-slot path is in use. Not applicable to [Flash Vision (Exp)](#vision-note) — the engine auto-disables the fusion on that checkpoint.
|
||
|
||
**Compressed attention state dtype**
|
||
|
||
DeepSeek-V4 uses hybrid compressed attention for long-context efficiency. `SGLANG_DSV4_COMPRESS_STATE_DTYPE` controls the dtype of the C4 / C128 compressed attention state pools. Supported values are `float32` / `fp32` (default: `float32`) and `bfloat16` / `bf16`. For BF16 on the offline compression path:
|
||
|
||
```bash Command
|
||
SGLANG_DSV4_COMPRESS_STATE_DTYPE=bf16 \
|
||
sglang serve \
|
||
--model-path deepseek-ai/DeepSeek-V4-Flash \
|
||
<other args>
|
||
```
|
||
|
||
This BF16 setting applies only to the compressed attention state pools and reduces the GPU memory footprint of each compressed-state slot. It does not change model weight precision or the main KV cache dtype. With automatic pool sizing and no explicit capacity cap, the same memory budget holds more slots, and the startup log shows larger `c4_state` and `c128_state` pool sizes. Keep the default `float32` setting for the most conservative behavior.
|
||
|
||
**EPLB + Waterfill (Experimental)**
|
||
|
||
For recorded/static EPLB reproduction, first record an expert-distribution file by following
|
||
[Capture expert selection distribution in MoE models](../../../docs/basic_usage/native_api.mdx#capture-expert-selection-distribution-in-moe-models).
|
||
For reproduction runs, use the generated `expert_distribution_recorder_*.pt` as
|
||
the initial expert location. **Please checkout to latest main branch for this feature.**
|
||
|
||
For non-PD reproduction, use:
|
||
|
||
```bash Command
|
||
--moe-a2a-backend deepep \
|
||
--deepep-mode auto \
|
||
--init-expert-location /path/to/expert_distribution_recorder_*.pt \
|
||
--enable-waterfill
|
||
```
|
||
|
||
For PD-Disagg reproduction, use `normal` mode on the prefill server and
|
||
`low_latency` mode on the decode server. Add the same `--init-expert-location`
|
||
flag to both commands:
|
||
|
||
```bash Command
|
||
# prefill
|
||
--moe-a2a-backend deepep \
|
||
--deepep-mode normal \
|
||
--init-expert-location /path/to/expert_distribution_recorder_*.pt \
|
||
--enable-waterfill
|
||
|
||
# decode
|
||
--moe-a2a-backend deepep \
|
||
--deepep-mode low_latency \
|
||
--init-expert-location /path/to/expert_distribution_recorder_*.pt \
|
||
--enable-waterfill
|
||
```
|
||
|
||
You can also add `--ep-num-redundant-experts` and `--eplb-algorithm` to customize
|
||
EPLB placement.
|
||
|
||
Waterfill also supports MegaMOE. Use `--moe-a2a-backend megamoe
|
||
--enable-waterfill` to keep the MegaMOE backend while applying Waterfill to the
|
||
fused shared expert slot.
|
||
|
||
**FP4 Indexer (Experimental)**
|
||
|
||
DeepSeek-V4 uses the default indexer path unless `--enable-deepseek-v4-fp4-indexer` is set. Enable this flag to use the experimental FP4 C4 indexer. This path is intended for decode-heavy long-context workloads where reducing indexer cache bandwidth is beneficial.
|
||
|
||
On **NVIDIA (SM100 / SM120)**, pair the flag with DeepGEMM FP4 indexer support and the FlashInfer MXFP4 MoE runner:
|
||
|
||
```bash Command
|
||
# Please use the latest main branch for this feature.
|
||
sglang serve \
|
||
--model-path deepseek-ai/DeepSeek-V4-Flash \
|
||
--tp 4 \
|
||
--moe-runner-backend flashinfer_mxfp4 \
|
||
--enable-deepseek-v4-fp4-indexer
|
||
```
|
||
|
||
On **AMD MI355X (gfx95)**, the AITER FP4 indexer kernels are available on ROCm. Keep the standard MI355 recipe and add only the indexer flag. Do not need to pass `--moe-runner-backend flashinfer_mxfp4`:
|
||
|
||
```bash Command
|
||
# Please use the latest ROCm image for this feature.
|
||
sglang serve \
|
||
--model-path deepseek-ai/DeepSeek-V4-Pro \
|
||
--tp 8 \
|
||
--attention-backend dsv4 \
|
||
--enable-deepseek-v4-fp4-indexer \
|
||
<other args from the Deploy panel>
|
||
```
|
||
|
||
**NVFP4 Hybrid Checkpoints**
|
||
|
||
The [`nvidia/DeepSeek-V4-Pro-NVFP4`](https://huggingface.co/nvidia/DeepSeek-V4-Pro-NVFP4) and
|
||
[`nvidia/DeepSeek-V4-Flash-NVFP4`](https://huggingface.co/nvidia/DeepSeek-V4-Flash-NVFP4) checkpoints
|
||
quantize MoE experts to **NVFP4** while keeping attention and dense layers in
|
||
**FP8**. The official releases have matching NVFP4 checkpoints at
|
||
[`nvidia/DeepSeek-V4-Flash-0731-NVFP4`](https://huggingface.co/nvidia/DeepSeek-V4-Flash-0731-NVFP4) and
|
||
[`nvidia/DeepSeek-V4-Pro-0813-NVFP4`](https://huggingface.co/nvidia/DeepSeek-V4-Pro-0813-NVFP4).
|
||
All of them require `--moe-runner-backend flashinfer_trtllm_routed` which will be automatically selected if not provided.
|
||
|
||
```bash Command
|
||
sglang serve \
|
||
--model-path nvidia/DeepSeek-V4-Pro-NVFP4 \
|
||
--tp 8
|
||
```
|
||
|
||
or
|
||
|
||
```bash Command
|
||
sglang serve \
|
||
--model-path nvidia/DeepSeek-V4-Flash-NVFP4 \
|
||
--tp 8
|
||
```
|
||
|
||
Requires Blackwell (SM100+). The MTP layer in this checkpoint stays
|
||
MXFP4-packed and is routed through the `Mxfp4FlashinferTrtllmMoEMethod` path
|
||
automatically.
|
||
|
||
The official (0731 / 0813) NVFP4 checkpoints preserve the bundled DSpark draft
|
||
head, so their low-latency recipes use `--speculative-algorithm DSPARK` instead
|
||
of the EAGLE/MTP shape flags — same as the corresponding original-precision
|
||
official checkpoints.
|
||
|
||
<a id="hopper-note" />
|
||
|
||
**Hopper (H100 / H200) note**
|
||
|
||
Two options are available for running DeepSeek-V4 on Hopper:
|
||
|
||
- **Original FP4 checkpoints** — run the MoE experts with W4A16 kernels (Marlin or the FlashInfer SM90 CUTLASS runner) as the command generator picks for Hopper cells. With FlashInfer >= 0.6.18 you can instead select the **W4A8** path — MXFP4 weights with FP8 activations via FlashInfer's Humming kernels — by adding `--flashinfer-mxfp4-moe-precision fp8` to `--moe-runner-backend flashinfer_mxfp4`; the low-latency Hopper cells now generate this form. Both work on H100 and H200; FP4 is the only option for H100 (no FP8 path). It is TP-only; on H200 the Pro variant fits on a single 8-GPU node, while H100 Pro needs 2 nodes (TP=16).
|
||
- **Converted FP8 checkpoints** (H100 and H200 only) — pre-repackaged FP8 weights at [`sgl-project/DeepSeek-V4-Flash-FP8`](https://huggingface.co/sgl-project/DeepSeek-V4-Flash-FP8) and [`sgl-project/DeepSeek-V4-Pro-FP8`](https://huggingface.co/sgl-project/DeepSeek-V4-Pro-FP8) unlock DP-attention + DeepEP and richer parallelism (e.g. Pro TP=16 across 2 nodes).
|
||
|
||
On these FP8 checkpoints you can additionally enable the all-FP8 **MegaMoE** path on SM90 for higher long-context / large-decode throughput — see the **SM90 (Hopper) FP8 MegaMoE** note in Configuration Tips below.
|
||
|
||
PD-Disagg recipes on H200 may require `docker run --privileged --ulimit memlock=-1`
|
||
(or `--device /dev/infiniband:/dev/infiniband --cap-add IPC_LOCK`) so mooncake
|
||
can discover the IB HCAs; without IB exposure mooncake silently falls back to
|
||
TCP, which can lead to garbled KV transfer on large checkpoints.
|
||
|
||
**RTX PRO 6000 (SM120 / Blackwell Desktop) note**
|
||
|
||
RTX PRO 6000 (96 GB) runs **Flash only** with the FlashInfer MXFP4 MoE runner.
|
||
V4-Pro doesn't fit on 8× 96 GB; the Deploy panel greys out unsupported recipes.
|
||
HiCache and MegaMoE are **not** supported on RTX PRO 6000.
|
||
|
||
**AMD (MI300X / MI355X) note**
|
||
|
||
- **Model checkpoints** — for correct accuracy, the FP4 model uses the stock `deepseek-ai/DeepSeek-V4-{Flash,Pro}`, and the FP8 model uses the repackaged `sgl-project/DeepSeek-V4-{Flash,Pro}-FP8`.
|
||
- **Supported models** — **MI300X** supports DeepSeek-V4-Flash in FP8; **MI355X** supports DeepSeek-V4-Flash / Pro in both FP4 and FP8. All recipes run single-node.
|
||
- **TP / DP setting (MI355X)** — both TP=4 and TP=8 are supported. At low concurrency we recommend **TP-only**; at high concurrency use **TP + DP** (balanced / high-throughput recipes). The verified MI355X DP recipes additionally set `--dp 8 --enable-dp-attention --enable-dp-attention-local-control-broadcast --tokenizer-worker-num 8 --stream-interval 20 --prefill-decode-interval 10`.
|
||
- **MTP** — speculative decoding is supported; add `--speculative-algorithm EAGLE --speculative-num-steps 3 --speculative-eagle-topk 1 --speculative-num-draft-tokens 4`.
|
||
- **Kernels** — uses the Unified KV attention and the flydsl MoE.
|
||
- **FP4 indexer (MI355X)** — FP4 C4 indexer is supported via `--enable-deepseek-v4-fp4-indexer` on top of the standard ROCm recipe.
|
||
- **Agentic long-context (MI355X Pro FP4)** — for multi-turn trace replay, add `--enable-prefill-delayer --prefill-delayer-token-usage-low-watermark 0.7` on the DP path so a single long prefill does not monopolise the engine.
|
||
|
||
**MoRI EP (AMD expert parallelism)**
|
||
|
||
On AMD, expert parallelism uses the **MoRI** all-to-all backend (`--moe-a2a-backend mori`), not DeepEP. Add the flags below on top of the verified recipe when sharding experts across GPUs; set `--ep-size` to the EP degree (typically the GPU count on one node).
|
||
|
||
Two optional env vars improve MoRI throughput (both off by default):
|
||
|
||
```bash Command
|
||
export SGLANG_MORI_DISPATCH_DTYPE=mxfp8
|
||
export SGLANG_MORI_RECV_BOUND=1
|
||
|
||
sglang serve \
|
||
--model-path {MODEL_PATH} \
|
||
--tp 8 --dp 8 --enable-dp-attention \
|
||
--ep-size 8 --moe-a2a-backend mori --deepep-mode normal \
|
||
<other args from the Deploy panel>
|
||
```
|
||
|
||
- **FP4**: enable both env vars.
|
||
- **FP8**: use `SGLANG_MORI_RECV_BOUND=1` only; omit `SGLANG_MORI_DISPATCH_DTYPE=mxfp8`.
|
||
|
||
**MegaMoE**
|
||
|
||
MegaMoE fuses expert dispatch + GEMM into a single kernel for higher throughput
|
||
on MoE layers. To enable it, use the **MegaMoE** chip in the Playground
|
||
below — the playground will swap `--moe-a2a-backend deepep` for
|
||
`--moe-a2a-backend megamoe` and add the relevant launch settings automatically.
|
||
|
||
Two variants are exposed:
|
||
- **W4A8** — default MegaMoE kernel (FP4 weights, FP8 activations).
|
||
- **W4A4** — adds `--enable-w4a4-mxfp4-megamoe` to run the custom W4A4 kernel
|
||
(FP4 activations). The flag configures the required DeepGEMM settings.
|
||
Higher throughput with negligible accuracy drop (~89.5 GPQA on Pro).
|
||
|
||
Notes:
|
||
- The W4A8 / W4A4 variants above are **Blackwell-only** (B200 / B300 / GB200 / GB300). On **Hopper (SM90, H100 / H200)** use the all-FP8 MegaMoE path described below instead.
|
||
- MegaMoE is **only wired into the `high-throughput` recipe** on Blackwell (per [sgl-project/sglang#26451](https://github.com/sgl-project/sglang/pull/26451)). The chip is hidden on `low-latency` and `balanced` — switch to `high-throughput` to expose it.
|
||
- When running MegaMoE, don't set `--moe-runner-backend` manually.
|
||
- Adjust `SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK` based on your workload and memory usage. Setting higher number of tokens for MegaMoE requires more HBM space (recommended: 8320 for high-throughput).
|
||
|
||
**SM90 (Hopper) FP8 MegaMoE (Experimental)**
|
||
|
||
On SM90 (Hopper, H100 / H200), the all-FP8 MegaMoE path routes MoE through the
|
||
DeepGEMM `mega_moe` runner for higher long-context / large-decode throughput on
|
||
the FP8 checkpoints. Unlike the Blackwell W4A8 / W4A4 variants above, experts
|
||
stay in **FP8** — keep `SGLANG_DSV4_FP4_EXPERTS=0`. It requires a `sgl-deep-gemm`
|
||
build with SM90 FP8 MegaMoE support. **Please use the latest image for this
|
||
feature.**
|
||
|
||
Enable the MegaMoE path with `--moe-a2a-backend megamoe`
|
||
```bash Command
|
||
SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK=4096 \
|
||
SGLANG_DSV4_FP4_EXPERTS=0 \
|
||
sglang serve \
|
||
--model-path sgl-project/DeepSeek-V4-Flash-FP8 \
|
||
--tp 8 \
|
||
--moe-a2a-backend megamoe \
|
||
--chunked-prefill-size 4096
|
||
```
|
||
|
||
`SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK` caps the number of tokens
|
||
the MegaMoE path processes per rank (i.e. per GPU); the MegaMoE path is only used
|
||
for batches at or below this cap. The right value depends on your parallelism /
|
||
token-split scheme, and larger values reserve more HBM.
|
||
|
||
**GB300 PD-Disagg cross-pod MNNVL**
|
||
|
||
On some GB300 clusters with cross-pod KV transfer over NVLink, mooncake may
|
||
fail with `nvlink_transport.cpp:497 Requested address ... not found!`. If
|
||
this happens, prepend `MC_FORCE_MNNVL=1 NCCL_MNNVL_ENABLE=1 NCCL_CUMEM_ENABLE=1`
|
||
to both prefill and decode `sglang serve` commands.
|
||
|
||
## 3. Advanced Usage
|
||
|
||
### 3.1 Reasoning
|
||
|
||
Enable the `deepseek-v4` reasoning parser (toggle **Reasoning Parser** in the **Parsers** card of the [Playground above](#playground)) to separate thinking from the final answer into `reasoning_content` vs `content`.
|
||
|
||
<Accordion title="Streaming with Thinking Process (Python)">
|
||
|
||
```python Example
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(
|
||
base_url="http://localhost:30000/v1",
|
||
api_key="EMPTY"
|
||
)
|
||
|
||
response = client.chat.completions.create(
|
||
model="deepseek-ai/DeepSeek-V4-Flash",
|
||
messages=[
|
||
{"role": "user", "content": "Solve this problem step by step: What is 15% of 240?"}
|
||
],
|
||
max_tokens=2048,
|
||
extra_body={"chat_template_kwargs": {"thinking": True}},
|
||
stream=True,
|
||
)
|
||
|
||
thinking_started = False
|
||
has_thinking = False
|
||
has_answer = False
|
||
|
||
for chunk in response:
|
||
if not chunk.choices:
|
||
continue
|
||
delta = chunk.choices[0].delta
|
||
|
||
if getattr(delta, "reasoning_content", None):
|
||
if not thinking_started:
|
||
print("=============== Thinking =================", flush=True)
|
||
thinking_started = True
|
||
has_thinking = True
|
||
print(delta.reasoning_content, end="", flush=True)
|
||
|
||
if delta.content:
|
||
if has_thinking and not has_answer:
|
||
print("\n=============== Content =================", flush=True)
|
||
has_answer = True
|
||
print(delta.content, end="", flush=True)
|
||
|
||
print()
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
<Accordion title="Example Output">
|
||
|
||
```text Output
|
||
We are asked: "What is 15% of 240?" This is a simple percentage problem. I need to provide a step-by-step solution. The user wants the solution explained step by step. I'll calculate 15% of 240: 0.15 * 240 = 36. I'll break it down into steps: understand what percent means, convert percentage to decimal or fraction, then multiply. I'll present the answer clearly.</think>To find 15% of 240, follow these steps:
|
||
|
||
**Step 1: Understand the meaning of percent**
|
||
"Percent" means "per hundred," so 15% means 15 out of every100, or \( \frac{15}{100} \).
|
||
|
||
**Step2: Convert the percentage to a decimal or fraction**
|
||
\( 15\% = \frac{15}{100} = 0.15 \)
|
||
|
||
**Step3: Multiply by the given number**
|
||
Multiply the decimal form by 240:
|
||
\( 0.15 \times 240 \)
|
||
|
||
**Step4: Perform the multiplication**
|
||
\( 0.15 \times 240 = 36 \)
|
||
|
||
**Answer:** 15% of 240 is **36**.
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
### 3.2 Tool Calling
|
||
|
||
Enable the `deepseekv4` tool-call parser (toggle **Tool Call Parser** in the **Parsers** card of the [Playground above](#playground)) to surface structured tool calls via `message.tool_calls`.
|
||
|
||
<Accordion title="Python Example with Thinking Process">
|
||
|
||
```python Example
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(
|
||
base_url="http://localhost:30000/v1",
|
||
api_key="EMPTY"
|
||
)
|
||
|
||
tools = [
|
||
{
|
||
"type": "function",
|
||
"function": {
|
||
"name": "get_weather",
|
||
"description": "Get the current weather for a location",
|
||
"parameters": {
|
||
"type": "object",
|
||
"properties": {
|
||
"location": {"type": "string", "description": "The city name"},
|
||
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
|
||
},
|
||
"required": ["location"],
|
||
},
|
||
},
|
||
}
|
||
]
|
||
|
||
response = client.chat.completions.create(
|
||
model="deepseek-ai/DeepSeek-V4-Flash",
|
||
messages=[{"role": "user", "content": "What's the weather in Beijing?"}],
|
||
tools=tools,
|
||
extra_body={"chat_template_kwargs": {"thinking": True}},
|
||
stream=True,
|
||
)
|
||
|
||
thinking_started = False
|
||
has_thinking = False
|
||
tool_calls_accumulator = {}
|
||
|
||
for chunk in response:
|
||
if not chunk.choices:
|
||
continue
|
||
delta = chunk.choices[0].delta
|
||
|
||
if getattr(delta, "reasoning_content", None):
|
||
if not thinking_started:
|
||
print("=============== Thinking =================", flush=True)
|
||
thinking_started = True
|
||
has_thinking = True
|
||
print(delta.reasoning_content, end="", flush=True)
|
||
|
||
if getattr(delta, "tool_calls", None):
|
||
if has_thinking and thinking_started:
|
||
print("\n=============== Content =================\n", flush=True)
|
||
thinking_started = False
|
||
for tool_call in delta.tool_calls:
|
||
index = tool_call.index
|
||
if index not in tool_calls_accumulator:
|
||
tool_calls_accumulator[index] = {"name": None, "arguments": ""}
|
||
if tool_call.function:
|
||
if tool_call.function.name:
|
||
tool_calls_accumulator[index]["name"] = tool_call.function.name
|
||
if tool_call.function.arguments:
|
||
tool_calls_accumulator[index]["arguments"] += tool_call.function.arguments
|
||
|
||
if delta.content:
|
||
print(delta.content, end="", flush=True)
|
||
|
||
for index, tool_call in sorted(tool_calls_accumulator.items()):
|
||
print(f"Tool Call: {tool_call['name']}")
|
||
print(f" Arguments: {tool_call['arguments']}")
|
||
|
||
print()
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
<Accordion title="Example Output">
|
||
|
||
```text Output
|
||
The user wants to know the weather in Beijing. I'll use the get_weather function with Beijing as the location. I don't need to specify a unit, so I'll just use the default.</think>
|
||
|
||
<|DSML|tool_calls>
|
||
<|DSML|invoke name="get_weather">
|
||
<|DSML|parameter name="location" string="true">Beijing</|DSML|parameter>
|
||
</|DSML|invoke>
|
||
</|DSML|tool_calls>
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
### 3.3 HiCache (Hierarchical KV Caching)
|
||
|
||
HiCache enables multi-tier KV cache offloading (GPU → CPU → Storage), significantly expanding effective context capacity for long-context and multi-turn scenarios. Combined with UnifiedRadixTree, it provides intelligent prefix caching across all tiers.
|
||
|
||
To enable HiCache, open the **HiCache** card in the [Playground above](#playground) and flip **Enable**:
|
||
|
||
- **L2 (GPU + CPU)** — leave Storage on `auto` (default). Cold KV pages spill to CPU pinned memory only.
|
||
- **L3 (GPU + CPU + Storage)** — pick a Storage backend (`file` / `mooncake` / `hf3fs` / `nixl`); the Playground emits the canonical `page_first_direct` mem-layout + `direct` IO backend + `wait_complete` prefetch policy, matching the [HiCache best-practices recipe](../../../docs/advanced_features/hicache_best_practices).
|
||
|
||
For AMD devices,
|
||
- **L2 (GPU + CPU)** — leave Storage on `auto` (default). Cold KV pages spill to CPU pinned memory only. Use `direct` IO backend + `page_first_direct` or `layer-first` mem-layout.
|
||
- **L3 (GPU + CPU + Storage)** — pick a Storage backend (`file`); the Playground emits the canonical `page_first_direct` mem-layout + `direct` IO backend + `wait_complete` prefetch policy, matching the [HiCache best-practices recipe](../../../docs/advanced_features/hicache_best_practices).
|
||
|
||
The Write policy knob defaults to `write_through` (the upstream default); switch to `write_back` / `write_through_selective` to trade durability for write speed when the storage tier is slow.
|
||
|
||
For more details, see the [HiCache documentation](../../../docs/advanced_features/hicache).
|
||
|
||
### 3.4 DSpark (Speculative Decoding)
|
||
|
||
Flash Official (0731) and Pro Official (0813) bundle a DSpark draft head in `deepseek-ai/DeepSeek-V4-Flash-0731` and `deepseek-ai/DeepSeek-V4-Pro-0813`. The target and draft weights therefore come from the same checkpoint: enable DSpark with `--speculative-algorithm DSPARK` and do not set a separate `--speculative-draft-model-path`.
|
||
|
||
The experimental [Flash Vision checkpoint](#vision-note) also bundles a DSpark head, enabled the same way: the Flash Vision low-latency recipes ship with `--speculative-algorithm DSPARK` (verified with image batches on B200 via the MMMU-Pro round; other hardware rows pending). The balanced and high-throughput Flash Vision recipes stay target-only because they run DP Attention.
|
||
|
||
Unlike the EAGLE recipes for the original Flash and Pro checkpoints, this recipe omits `--speculative-num-steps`, `--speculative-eagle-topk`, and `--speculative-num-draft-tokens`. SGLang reads the DSpark shape from the checkpoint.
|
||
|
||
<Note>
|
||
The Pro Official (0813) low-latency speed numbers in the Deploy panel were measured with `SGLANG_SIMULATE_ACC_LEN=4`, which pins the DSpark accept length at exactly 4.00. The recipe as shipped earns **4.678** on the same engine, so those rows read slightly conservative. The GSM8K figure for that cell is from the shipped command.
|
||
</Note>
|
||
|
||
The verified 4×GB300 FP4 low-latency command is:
|
||
|
||
```bash Command
|
||
sglang serve \
|
||
--trust-remote-code \
|
||
--model-path deepseek-ai/DeepSeek-V4-Flash-0731 \
|
||
--tp 4 \
|
||
--moe-runner-backend flashinfer_mxfp4 \
|
||
--speculative-algorithm DSPARK \
|
||
--mem-fraction-static 0.90 \
|
||
--chunked-prefill-size 4096 \
|
||
--swa-full-tokens-ratio 0.1 \
|
||
--host 0.0.0.0 \
|
||
--port 30000
|
||
```
|
||
|
||
Keep `--mem-fraction-static 0.90` on this topology to leave enough headroom for the batch-256 verify graph. The first cold start can take 10–15 minutes while FlashInfer autotunes and SGLang captures the draft and verify graphs; later starts reuse the cache. This path is verified end-to-end on 4×GB300 with SGLang v0.5.16.
|
||
|
||
**Tune proposed draft tokens.** `--speculative-dspark-block-size N` asks DSpark to propose `N` tokens per step; the target verifies a window of `N + 1`. If the flag is omitted, SGLang reads the value from the checkpoint. Both the 0731 and 0813 checkpoints resolve to five proposed tokens (the startup log reports `gamma=5, verify_num_draft_tokens=6`), which is the verified default. Use the **DSpark Proposed Draft Tokens** slider in the [Playground](#playground) to sweep one through five.
|
||
|
||
Larger blocks can improve decode latency when acceptance stays high, but they also increase verification work and graph memory. Start from the checkpoint default, then sweep downward under the real prompt-length and concurrency distribution. The gain is usually largest for short interactive traffic and narrows as prefill dominates. Track P50/P99 TTFT and TPOT, total throughput, accepted length, GPU memory, and stop rate rather than choosing from acceptance alone.
|
||
|
||
For every candidate, compare with the same recipe without `--speculative-algorithm DSPARK`. Restart the server between the DSpark and non-speculative legs, keep the request corpus, sampling, concurrency, and warmup identical, and give each `bench_serving` leg its own `--flush-cache`. Leave `--speculative-draft-attention-backend` unset unless a separate profiling run justifies an override.
|
||
|
||
DSpark currently requires CUDA and `pp_size == 1`. It is not compatible with PD disaggregation on current SGLang releases; selecting a prefill or decode role in the Playground automatically removes the inherited DSpark flags. The MI355X Flash Official recipes therefore run target-only, and so do the DP-Attention recipes in the Deploy panel — for a DP-Attention configuration that does run DSpark, see the [agentic recipe below](#3-6-agentic-long-context-with-hicache-dram-offload-b200-fp4-dspark). If a larger draft block or concurrency causes graph-capture OOM, lower `--mem-fraction-static`, the draft block size, or the configured maximum running requests, then rerun both performance and accuracy gates.
|
||
|
||
### 3.5 Vision (Image Inputs)
|
||
|
||
The experimental [`DeepSeek-V4-Flash-Vision-Exp`](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-Vision-Exp) checkpoint (the **Flash Vision** variant in the Deploy panel — see the [configuration notes](#vision-note)) takes images via the OpenAI-compatible `image_url` content type, as public URLs or base64 `data:` URIs; text and images mix freely in one message. Vision input works with the same server the Deploy panel produces — no extra model-specific flags needed.
|
||
|
||
<Accordion title="Image Understanding (Python)">
|
||
|
||
```python Example
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")
|
||
|
||
response = client.chat.completions.create(
|
||
model="deepseek-ai/DeepSeek-V4-Flash-Vision-Exp",
|
||
messages=[{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "image_url",
|
||
"image_url": {"url": "https://raw.githubusercontent.com/sgl-project/sglang/main/examples/assets/example_image.png"}},
|
||
{"type": "text", "text": "Describe this image in a few sentences."},
|
||
],
|
||
}],
|
||
)
|
||
|
||
message = response.choices[0].message
|
||
if getattr(message, "reasoning_content", None):
|
||
print("=============== Thinking =================")
|
||
print(message.reasoning_content)
|
||
print("=============== Content =================")
|
||
print(message.content)
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
<Accordion title="Example Output">
|
||
|
||
```text Output
|
||
Pending update...
|
||
```
|
||
|
||
</Accordion>
|
||
|
||
### 3.6 Agentic Long-Context with HiCache DRAM Offload (B200 FP4, DSpark)
|
||
|
||
**TP8, concurrency 8–16:**
|
||
```bash Command
|
||
SGLANG_ENABLE_UNIFIED_RADIX_TREE=1 \
|
||
python3 -m sglang.launch_server \
|
||
--model-path deepseek-ai/DeepSeek-V4-Pro-0813 \
|
||
--trust-remote-code \
|
||
--tp 8 \
|
||
--moe-runner-backend flashinfer_mxfp4 \
|
||
--enable-deepseek-v4-fp4-indexer \
|
||
--disable-flashinfer-autotune \
|
||
--mem-fraction-static 0.90 \
|
||
--swa-full-tokens-ratio 0.1 \
|
||
--chunked-prefill-size 8192 \
|
||
--tool-call-parser deepseekv4 \
|
||
--reasoning-parser deepseek-v4 \
|
||
--speculative-algorithm DSPARK \
|
||
--speculative-dspark-block-size 6 \
|
||
--enable-hierarchical-cache \
|
||
--hicache-ratio 2.75 \
|
||
--hicache-write-policy write_through \
|
||
--hicache-io-backend direct \
|
||
--hicache-mem-layout page_first_direct
|
||
```
|
||
|
||
DSv4 HiCache sizes the host tier with `--hicache-ratio` (host/device token ratio), not `--hicache-size`. Concurrency 1–5 runs the same command without the HiCache flags.
|
||
|
||
**DEP8 (DP Attention), concurrency 64–160:**
|
||
```bash Command
|
||
SGLANG_ENABLE_UNIFIED_RADIX_TREE=1 \
|
||
SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK=8320 \
|
||
python3 -m sglang.launch_server \
|
||
--model-path deepseek-ai/DeepSeek-V4-Pro-0813 \
|
||
--trust-remote-code \
|
||
--tp 8 \
|
||
--dp 8 \
|
||
--enable-dp-attention \
|
||
--enable-dp-lm-head \
|
||
--ep-size 8 \
|
||
--moe-a2a-backend megamoe \
|
||
--enable-w4a4-mxfp4-megamoe \
|
||
--enable-deepseek-v4-fp4-indexer \
|
||
--disable-shared-experts-fusion \
|
||
--disable-flashinfer-autotune \
|
||
--mem-fraction-static 0.88 \
|
||
--swa-full-tokens-ratio 0.02 \
|
||
--chunked-prefill-size 49152 \
|
||
--tool-call-parser deepseekv4 \
|
||
--reasoning-parser deepseek-v4 \
|
||
--speculative-algorithm DSPARK \
|
||
--speculative-dspark-block-size 6 \
|
||
--enable-hierarchical-cache \
|
||
--hicache-ratio 8 \
|
||
--hicache-write-policy write_through \
|
||
--hicache-io-backend direct \
|
||
--hicache-mem-layout page_first_direct
|
||
```
|
||
|
||
`--chunked-prefill-size` is a global budget divided by `--dp`, so this keeps 6144 tokens per rank.
|