docs(DeepSeek-V4): add GB200 platform to cookbook recipe (#23725)
This commit is contained in:
@@ -29,13 +29,13 @@ tag: NEW
|
|||||||
<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", 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.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", 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: B200 / GB300 / H200 on 4 GPUs</td>
|
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>single-node serving: B200 / GB200 / GB300 / H200 on 4 GPUs</td>
|
||||||
</tr>
|
</tr>
|
||||||
<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", 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.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", 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 8 GPU / GB300 4 GPU / H200 16 GPU (2 nodes)</td>
|
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}>high-capacity: B200 8 GPU / GB200 8 GPU (2 nodes) / GB300 4 GPU / H200 16 GPU (2 nodes)</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -88,6 +88,10 @@ Please refer to the [official SGLang installation guide](../../../docs/get-start
|
|||||||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}>NVIDIA B200</td>
|
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}>NVIDIA B200</td>
|
||||||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}><code>lmsysorg/sglang:deepseek-v4-blackwell</code></td>
|
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}><code>lmsysorg/sglang:deepseek-v4-blackwell</code></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}>NVIDIA GB200</td>
|
||||||
|
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}><code>lmsysorg/sglang:deepseek-v4-grace-blackwell</code></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}>NVIDIA GB300</td>
|
<td style={{padding: "9px 12px", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.02)"}}>NVIDIA GB300</td>
|
||||||
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}><code>lmsysorg/sglang:deepseek-v4-grace-blackwell</code></td>
|
<td style={{padding: "9px 12px", backgroundColor: "rgba(255,255,255,0.05)"}}><code>lmsysorg/sglang:deepseek-v4-grace-blackwell</code></td>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
//
|
//
|
||||||
// Hardware (quantization determined by GPU generation):
|
// Hardware (quantization determined by GPU generation):
|
||||||
// B200 → FP4 weights, Flash TP=4 / Pro TP=8 single-node
|
// B200 → FP4 weights, Flash TP=4 / Pro TP=8 single-node
|
||||||
|
// GB200 → FP4 weights, Flash TP=4 / Pro TP=8 2-node
|
||||||
// GB300 → FP4 weights, Flash TP=4 / Pro TP=4 single-node
|
// GB300 → FP4 weights, Flash TP=4 / Pro TP=4 single-node
|
||||||
// H200 → FP8 weights, Flash TP=4 / Pro TP=16 2-node
|
// H200 → FP8 weights, Flash TP=4 / Pro TP=16 2-node
|
||||||
// Model variant → HF slug:
|
// Model variant → HF slug:
|
||||||
@@ -27,6 +28,7 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
items: [
|
items: [
|
||||||
{ id: "b200", label: "B200 (FP4)", default: true },
|
{ id: "b200", label: "B200 (FP4)", default: true },
|
||||||
{ id: "b300", label: "B300 (FP4)", default: false },
|
{ id: "b300", label: "B300 (FP4)", default: false },
|
||||||
|
{ id: "gb200", label: "GB200 (FP4)", default: false },
|
||||||
{ id: "gb300", label: "GB300 (FP4)", default: false },
|
{ id: "gb300", label: "GB300 (FP4)", default: false },
|
||||||
{ id: "h200", label: "H200 (FP8)", default: false },
|
{ id: "h200", label: "H200 (FP8)", default: false },
|
||||||
],
|
],
|
||||||
@@ -138,6 +140,8 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
"b200|big": { slug: "deepseek-ai/DeepSeek-V4-Pro", tp: 8, multinode: false },
|
"b200|big": { slug: "deepseek-ai/DeepSeek-V4-Pro", tp: 8, multinode: false },
|
||||||
"gb300|small": { slug: "deepseek-ai/DeepSeek-V4-Flash", tp: 4, multinode: false },
|
"gb300|small": { slug: "deepseek-ai/DeepSeek-V4-Flash", tp: 4, multinode: false },
|
||||||
"gb300|big": { slug: "deepseek-ai/DeepSeek-V4-Pro", tp: 4, multinode: false },
|
"gb300|big": { slug: "deepseek-ai/DeepSeek-V4-Pro", tp: 4, multinode: false },
|
||||||
|
"gb200|small": { slug: "deepseek-ai/DeepSeek-V4-Flash", tp: 4, multinode: false },
|
||||||
|
"gb200|big": { slug: "deepseek-ai/DeepSeek-V4-Pro", tp: 8, multinode: true, nnodes: 2 },
|
||||||
// H200 needs an FP8-only Instruct ckpt (deepseek-ai's Flash/Pro repos ship
|
// H200 needs an FP8-only Instruct ckpt (deepseek-ai's Flash/Pro repos ship
|
||||||
// FP4-mixed weights that Hopper can't run). sgl-project publishes FP8
|
// FP4-mixed weights that Hopper can't run). sgl-project publishes FP8
|
||||||
// repackagings for both variants.
|
// repackagings for both variants.
|
||||||
@@ -150,6 +154,8 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
"b200|big": { tp: 8, multinode: false },
|
"b200|big": { tp: 8, multinode: false },
|
||||||
"gb300|small": { tp: 4, multinode: false },
|
"gb300|small": { tp: 4, multinode: false },
|
||||||
"gb300|big": { tp: 4, multinode: false },
|
"gb300|big": { tp: 4, multinode: false },
|
||||||
|
"gb200|small": { tp: 4, multinode: false },
|
||||||
|
"gb200|big": { tp: 8, multinode: true, nnodes: 2 },
|
||||||
"h200|small": { tp: 4, multinode: false },
|
"h200|small": { tp: 4, multinode: false },
|
||||||
"h200|big": { tp: 16, multinode: true, nnodes: 2 },
|
"h200|big": { tp: 16, multinode: true, nnodes: 2 },
|
||||||
};
|
};
|
||||||
@@ -183,12 +189,21 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
"gb300|big|cp",
|
"gb300|big|cp",
|
||||||
"gb300|small|pd-disagg",
|
"gb300|small|pd-disagg",
|
||||||
"gb300|big|pd-disagg",
|
"gb300|big|pd-disagg",
|
||||||
|
"gb200|small|low-latency",
|
||||||
|
"gb200|small|balanced",
|
||||||
|
"gb200|small|max-throughput",
|
||||||
|
"gb200|small|cp",
|
||||||
|
"gb200|big|low-latency",
|
||||||
|
"gb200|big|balanced",
|
||||||
|
"gb200|big|max-throughput",
|
||||||
]);
|
]);
|
||||||
// Recipes whose command is intentionally not yet provided (e.g. blocked by an
|
// Recipes whose command is intentionally not yet provided (e.g. blocked by an
|
||||||
// upstream limitation). Showing a minimal placeholder is friendlier to users
|
// upstream limitation). Showing a minimal placeholder is friendlier to users
|
||||||
// than emitting a commented-out invalid command.
|
// than emitting a commented-out invalid command.
|
||||||
const TBD_RECIPES = new Set([
|
const TBD_RECIPES = new Set([
|
||||||
"h200|big|cp",
|
"h200|big|cp",
|
||||||
|
"gb200|small|pd-disagg",
|
||||||
|
"gb200|big|pd-disagg",
|
||||||
]);
|
]);
|
||||||
const TBD_PLACEHOLDER = "# to be provided";
|
const TBD_PLACEHOLDER = "# to be provided";
|
||||||
const BEING_VERIFIED_NOTE =
|
const BEING_VERIFIED_NOTE =
|
||||||
@@ -242,14 +257,18 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
h200: ["SGLANG_DSV4_FP4_EXPERTS=0"], // allinone _ENV_H200
|
h200: ["SGLANG_DSV4_FP4_EXPERTS=0"], // allinone _ENV_H200
|
||||||
b200: [], // _ENV_B200 minus NVSHMEM
|
b200: [], // _ENV_B200 minus NVSHMEM
|
||||||
gb300: [], // _ENV_GB300
|
gb300: [], // _ENV_GB300
|
||||||
|
// GB200 multinode needs NCCL MNNVL for cross-node NVLink communication.
|
||||||
|
gb200: multinode ? ["NCCL_MNNVL_ENABLE=1", "NCCL_CUMEM_ENABLE=1"] : [],
|
||||||
}[hardware];
|
}[hardware];
|
||||||
|
|
||||||
// Recipe-specific env (matches allinone exactly, taking size into account).
|
// Recipe-specific env (matches allinone exactly, taking size into account).
|
||||||
const recipeEnv = [];
|
const recipeEnv = [];
|
||||||
if (recipe === "low-latency") {
|
if (recipe === "low-latency") {
|
||||||
// H200 big low-latency has extra dispatch-token cap (allinone line 233).
|
// Big low-latency dispatch-token cap.
|
||||||
if (hardware === "h200" && isBig) {
|
if (hardware === "h200" && isBig) {
|
||||||
recipeEnv.push("SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=128");
|
recipeEnv.push("SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=128");
|
||||||
|
} else if (hardware === "gb200" && isBig) {
|
||||||
|
recipeEnv.push("SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=256");
|
||||||
}
|
}
|
||||||
} else if (recipe === "balanced") {
|
} else if (recipe === "balanced") {
|
||||||
if (hardware === "h200") {
|
if (hardware === "h200") {
|
||||||
@@ -293,6 +312,7 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
// allinone:
|
// allinone:
|
||||||
// H200 small: pure TP + MTP_314
|
// H200 small: pure TP + MTP_314
|
||||||
// H200 big: DP-attn + DeepEP + MTP_314 + cg=32 max-run=64 + multi-node + mem-frac 0.82
|
// H200 big: DP-attn + DeepEP + MTP_314 + cg=32 max-run=64 + multi-node + mem-frac 0.82
|
||||||
|
// GB200 big: pure TP + multinode + flashinfer_mxfp4 + MTP_314 + mem-frac 0.82 (no DP-attn/DeepEP)
|
||||||
// Blackwell: TP + flashinfer_mxfp4 + MTP_314 + chunked-prefill-size 4096 + autotune-fix
|
// Blackwell: TP + flashinfer_mxfp4 + MTP_314 + chunked-prefill-size 4096 + autotune-fix
|
||||||
// Big Blackwell additionally: mem-frac 0.82
|
// Big Blackwell additionally: mem-frac 0.82
|
||||||
flags.push(` --tp ${tp}`);
|
flags.push(` --tp ${tp}`);
|
||||||
@@ -335,7 +355,11 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
flags.push(" --speculative-num-steps 1");
|
flags.push(" --speculative-num-steps 1");
|
||||||
flags.push(" --speculative-eagle-topk 1");
|
flags.push(" --speculative-eagle-topk 1");
|
||||||
flags.push(" --speculative-num-draft-tokens 2");
|
flags.push(" --speculative-num-draft-tokens 2");
|
||||||
if (isBig) flags.push(" --mem-fraction-static 0.82");
|
if (isBig && hardware === "gb200") {
|
||||||
|
flags.push(" --mem-fraction-static 0.78");
|
||||||
|
} else if (isBig) {
|
||||||
|
flags.push(" --mem-fraction-static 0.82");
|
||||||
|
}
|
||||||
if (hardware === "h200") {
|
if (hardware === "h200") {
|
||||||
flags.push(" --cuda-graph-max-bs 128");
|
flags.push(" --cuda-graph-max-bs 128");
|
||||||
flags.push(" --max-running-requests 128");
|
flags.push(" --max-running-requests 128");
|
||||||
@@ -345,6 +369,9 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
} else if (isBig && hardware === "gb300") {
|
} else if (isBig && hardware === "gb300") {
|
||||||
flags.push(" --cuda-graph-max-bs 128");
|
flags.push(" --cuda-graph-max-bs 128");
|
||||||
flags.push(" --max-running-requests 256");
|
flags.push(" --max-running-requests 256");
|
||||||
|
} else if (isBig && hardware === "gb200") {
|
||||||
|
flags.push(" --cuda-graph-max-bs 64");
|
||||||
|
flags.push(" --max-running-requests 128");
|
||||||
}
|
}
|
||||||
// allinone H200 gates DEEPEP_LARGE_SMS_FLAG on !multinode — only H200 big
|
// allinone H200 gates DEEPEP_LARGE_SMS_FLAG on !multinode — only H200 big
|
||||||
// is multi-node; all Blackwell cells get the flag unconditionally.
|
// is multi-node; all Blackwell cells get the flag unconditionally.
|
||||||
@@ -359,7 +386,11 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
flags.push(" --enable-dp-attention");
|
flags.push(" --enable-dp-attention");
|
||||||
if (multinode) flags.push(...multiNodeFlags(nnodes));
|
if (multinode) flags.push(...multiNodeFlags(nnodes));
|
||||||
flags.push(" --moe-a2a-backend deepep");
|
flags.push(" --moe-a2a-backend deepep");
|
||||||
if (isBig) flags.push(" --mem-fraction-static 0.82");
|
if (isBig && hardware === "gb200") {
|
||||||
|
flags.push(" --mem-fraction-static 0.78");
|
||||||
|
} else if (isBig) {
|
||||||
|
flags.push(" --mem-fraction-static 0.82");
|
||||||
|
}
|
||||||
if (hardware === "h200") {
|
if (hardware === "h200") {
|
||||||
flags.push(" --cuda-graph-max-bs 128");
|
flags.push(" --cuda-graph-max-bs 128");
|
||||||
flags.push(" --max-running-requests 256");
|
flags.push(" --max-running-requests 256");
|
||||||
@@ -369,6 +400,9 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
} else if (isBig && hardware === "gb300") {
|
} else if (isBig && hardware === "gb300") {
|
||||||
flags.push(" --cuda-graph-max-bs 128");
|
flags.push(" --cuda-graph-max-bs 128");
|
||||||
flags.push(" --max-running-requests 256");
|
flags.push(" --max-running-requests 256");
|
||||||
|
} else if (isBig && hardware === "gb200") {
|
||||||
|
flags.push(" --cuda-graph-max-bs 64");
|
||||||
|
flags.push(" --max-running-requests 256");
|
||||||
}
|
}
|
||||||
if (!multinode) flags.push(DEEPEP_LARGE_SMS_FLAG);
|
if (!multinode) flags.push(DEEPEP_LARGE_SMS_FLAG);
|
||||||
} else if (recipe === "cp") {
|
} else if (recipe === "cp") {
|
||||||
@@ -416,7 +450,18 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
const envAll = [...HW_ENV, ...recipeEnv, ...COMMON_ENV];
|
const envAll = [...HW_ENV, ...recipeEnv, ...COMMON_ENV];
|
||||||
const envBlock = envAll.length ? envAll.join(" \\\n") + " \\\n" : "";
|
const envBlock = envAll.length ? envAll.join(" \\\n") + " \\\n" : "";
|
||||||
const base = `${envBlock}sglang serve \\\n${flags.join(" \\\n")}`;
|
const base = `${envBlock}sglang serve \\\n${flags.join(" \\\n")}`;
|
||||||
const withMultinode = multinode ? prependMultiNodeNote(base, nnodes) : base;
|
// GB200 multinode may need machine-specific NVSHMEM / Gloo env vars;
|
||||||
|
// emit them as commented hints above the env block so users know to check.
|
||||||
|
let cmd = base;
|
||||||
|
if (hardware === "gb200" && multinode) {
|
||||||
|
cmd =
|
||||||
|
`# The following env vars may be needed depending on your cluster:\n` +
|
||||||
|
`# GLOO_SOCKET_IFNAME=<your-nic>\n` +
|
||||||
|
`# NVSHMEM_ENABLE_NIC_PE_MAPPING=1\n` +
|
||||||
|
`# NVSHMEM_HCA_LIST=<your-hca-list>\n` +
|
||||||
|
cmd;
|
||||||
|
}
|
||||||
|
const withMultinode = multinode ? prependMultiNodeNote(cmd, nnodes) : cmd;
|
||||||
const verifyKey = `${hardware}|${modelSize}|${recipe}`;
|
const verifyKey = `${hardware}|${modelSize}|${recipe}`;
|
||||||
if (TBD_RECIPES.has(verifyKey)) return TBD_PLACEHOLDER;
|
if (TBD_RECIPES.has(verifyKey)) return TBD_PLACEHOLDER;
|
||||||
return VERIFIED_RECIPES.has(verifyKey)
|
return VERIFIED_RECIPES.has(verifyKey)
|
||||||
@@ -447,14 +492,15 @@ export const DeepSeekV4Deployment = () => {
|
|||||||
const specKey = `${hardware}|${modelSize}`;
|
const specKey = `${hardware}|${modelSize}`;
|
||||||
const { tp: pdTp, multinode, nnodes } = PD_TP_SPEC[specKey];
|
const { tp: pdTp, multinode, nnodes } = PD_TP_SPEC[specKey];
|
||||||
const slug = HW_SIZE_SPEC[specKey].slug;
|
const slug = HW_SIZE_SPEC[specKey].slug;
|
||||||
const ibDevice = { h200: "mlx5_0", b200: "mlx5_7", gb300: "" }[hardware];
|
const ibDevice = { h200: "mlx5_0", b200: "mlx5_7", gb300: "", gb200: "" }[hardware];
|
||||||
const isGB300 = hardware === "gb300";
|
const isGB300 = hardware === "gb300";
|
||||||
const isBlackwell = hardware === "b200" || isGB300;
|
const isBlackwell = hardware === "b200" || hardware === "gb200" || isGB300;
|
||||||
|
|
||||||
const HW_ENV = {
|
const HW_ENV = {
|
||||||
h200: ["SGLANG_DSV4_FP4_EXPERTS=0"],
|
h200: ["SGLANG_DSV4_FP4_EXPERTS=0"],
|
||||||
b200: [],
|
b200: [],
|
||||||
gb300: [],
|
gb300: [],
|
||||||
|
gb200: [],
|
||||||
}[hardware];
|
}[hardware];
|
||||||
// Whitelist #5: only SGLANG_MOONCAKE_CUSTOM_MEM_POOL kept; MC_FORCE_MNNVL /
|
// Whitelist #5: only SGLANG_MOONCAKE_CUSTOM_MEM_POOL kept; MC_FORCE_MNNVL /
|
||||||
// NCCL_MNNVL_ENABLE / NCCL_CUMEM_ENABLE may also be needed depending on the
|
// NCCL_MNNVL_ENABLE / NCCL_CUMEM_ENABLE may also be needed depending on the
|
||||||
|
|||||||
Reference in New Issue
Block a user