Prhub

#31363 docs(cookbook): re-benchmark DeepSeek-V4 on sglang 0.5.15

原始 PR 作者 dougyster 合并时间 2026-07-22 06:55 文件变更 8 提交数 21 评论 41 代码增减 +231 / -71

执行摘要

DeepSeek-V4 基准测数更新至 v0.5.15,引擎支持 per-cell 百分位

根据 PR body 描述,需将 DeepSeek-V4 cookbook 的基准测试数据更新到 sglang v0.5.15/v0.5.15.post1,替换此前基于 v0.5.12.post1 的数值,以反映新版本的性能变化。同时,B200/B300 NVFP4 低延迟单元格此前缺失,需补充;h200 pro fp4 low-latency 单元格因 detokenizer 挂死而留空,需通过参数调整解决。

值得精读(尤其是 review 评论中的审计思路,可作为团队性能测试的标准流程参考)。设计上关注 _deployment.jsx 中 per-cell 百分位覆盖的极简实现方式,以及如何通过注释明确数据契约。

讨论亮点

Review 中审核者 zijiexia 进行了详细的数据一致性审计,对每个单元格的吞吐量进行 closed-loop 上界检验,发现并标记了多个异常点(如 b300 flash ht conc-4096 的 TPOT 不降反升、b300 pro ht TTFT 缩放异常等)。作者 dougyster 对每个被标记的点都提供了 cache-cold 下的 3 次重复测量数据,并解释或重新测量后更新。另一个讨论焦点是 GB200 单元格的处理:它们基于旧版 Mean 数据,但页面全局已改为 P50;最终作者添加了 per-cell latencyPercentile 支持,将这些单元格标注为 Mean,而非直接删除。关于 dockerImages 是否固定版本号,zijiexia 建议保留 latest 以推荐用户使用最新版,作者采纳。

实现拆解

  1. 核心数据更新(deepseek-v4-benchmarks.jsx):逐个更新所有 36 个单节点单元格的 sglang_version 字段,并用 cache-cold 模式下 3 次运行中第一次的测量值填充 ttft_ms、tpot_ms、tokens_per_sec_per_gpu。新增 B200/B300 NVFP4 低延迟单元格;恢复 GB200 单元格但标记为 Mean 百分位(通过新增 per-cell 机制)。
  2. 渲染引擎增强(_deployment.jsx):修改 renderBenchmarkCard 函数中 pct 变量的解析逻辑,从 config.latencyPercentile || "P50" 改为 (entry && entry.latencyPercentile) || config.latencyPercentile || "P50",允许每个 benchmarks 条目携带自己的 latencyPercentile 覆盖页面级设置。同时更新文档注释说明该机制。
  3. 配置调整(deepseek-v4.jsx):将全局 latencyPercentile"Mean" 改为 "P50";在 speed benchmark 命令中添加 --flush-cache 确保 reproduce 命令与 cache-cold 测量方法一致;将 h200 pro fp4 low-latency 的 --mem-fraction-static 从 0.83 改为 0.90 以避免 detokenizer 挂死。
  4. 模板与技能文档同步:修改两个模板文件(benchmarks.jsx.tmpl、config.jsx.tmpl)以反映新的数据契约(per-cell latencyPercentile、--flush-cache 参数);更新 review 技能文档(SKILL.md)和 authoring reference,明确要求 benchmark 命令包含 --flush-cache,并说明 per-cell 覆盖规则。
文件 模块 状态 重要度
docs_new/src/snippets/configs/deepseek-ai/deepseek-v4-benchmarks.jsx 基准数据 modified 7.22
docs_new/src/snippets/_deployment.jsx 渲染引擎 modified 5.49
docs_new/src/snippets/configs/deepseek-ai/deepseek-v4.jsx 模型配置 modified 5.31
.claude/skills/cookbook-add-model/templates/benchmarks.jsx.tmpl 模板 modified 2.75
.claude/skills/cookbook-add-model/templates/config.jsx.tmpl 模板 modified 2.75
.claude/skills/cookbook-review-pr/SKILL.md 技能文档 modified 2.34
.claude/skills/cookbook-add-model/references/authoring-reference.md 创作参考 modified 2.18
.claude/skills/cookbook-migrate-model/SKILL.md 技能文档 modified 2.05

关键符号

renderBenchmarkCard (pct line) Deployment

关键源码片段

docs_new/src/snippets/configs/deepseek-ai/deepseek-v4-benchmarks.jsx core-logic

核心数据文件,包含所有 36 个单节点单元格的基准测试数据,从 0.5.12.post1 更新到 0.5.15/0.5.15.post1,新增 NVFP4 单元格,恢复 GB200 单元格(标注为 Mean)。

// DeepSeek-V4 per-cell benchmark numbers, keyed by the same `match` tuple as
// deepseek-v4.jsx cells. See _deployment.jsx for the speed/accuracy schema.
// Measured on sglang v0.5.15 / v0.5.15.post1 (per-cell sglang_version).
// tokens_per_sec_per_gpu is total (input+output) tok/s/GPU = output/GPU × (isl+osl)/osl.
export const benchmarks = [
  // ====================================================================
  // B200 + FP4
  // ====================================================================
  {
    match: { hw: "b200", variant: "flash", quant: "fp4", strategy: "low-latency", nodes: "single" },
    sglang_version: "0.5.15",
    speed: [
      { workload: { dataset: "random", isl: 8192, osl: 1024, max_concurrency: 1 },
        ttft_ms: 302, tpot_ms: 2.91, tokens_per_sec_per_gpu: 677 },
      { workload: { dataset: "random", isl: 8192, osl: 1024, max_concurrency: 16 },
        ttft_ms: 454, tpot_ms: 8.76, tokens_per_sec_per_gpu: 3059 },
    ],
  },
  // B200 NVFP4 (newly added)
  {
    match: { hw: "b200", variant: "flash", quant: "nvfp4", strategy: "low-latency", nodes: "single" },
    sglang_version: "0.5.15",
    speed: [
      { workload: { dataset: "random", isl: 8192, osl: 1024, max_concurrency: 1 },
        ttft_ms: 308, tpot_ms: 2.88, tokens_per_sec_per_gpu: 682 },
      { workload: { dataset: "random", isl: 8192, osl: 1024, max_concurrency: 16 },
        ttft_ms: 466, tpot_ms: 8.67, tokens_per_sec_per_gpu: 3059 },
    ],
  },
  // GB200 cell with per-cell latencyPercentile set to "Mean"
  {
    match: { hw: "gb200", variant: "flash", quant: "nvfp4", strategy: "low-latency", nodes: "single" },
    sglang_version: "0.5.12.post1 (PR #25820)",
    latencyPercentile: "Mean", // overrides global P50; legacy data not re-measured
    speed: [ /* ... */ ],
  },
]
docs_new/src/snippets/_deployment.jsx core-logic

渲染引擎,负责将基准数据渲染到 cookbook 页面。本次修改为支持 per-cell latencyPercentile,通过回退链(entry → config → "P50")实现,保持向后兼容。

const renderBenchmarkCard = (entry) => {
  // [key, label, unit, compute?]. Optional compute(measurement) supplies
  // derived metrics (preferred over measurement[key] when present).
  // pct 的解析策略:优先使用 entry 自带的 latencyPercentile(用于遗留 Mean 数据),
  // 其次回退到 config 级别设置(页面级 P50 或 Mean),最后默认 "P50".
  const pct = (entry && entry.latencyPercentile) || config.latencyPercentile || "P50";
  const SPEED_LABELS = [
    ["ttft_ms", `TTFT (${pct})`, "ms"],
    ["tpot_ms", `TPOT (${pct})`, "ms"],
    // ...
  ];
  // ...
}
docs_new/src/snippets/configs/deepseek-ai/deepseek-v4.jsx core-logic

DeepSeek-V4 模型的页面配置,包括硬件支持、变体、量化、启动参数等。本次修改涉及三大配置变化:latencyPercentile 从 Mean 改为 P50,speed 命令添加 --flush-cache,h200 pro 的 mem-fraction-static 从 0.83 改为 0.90。

export const config = {
  modelName: "DeepSeek-V4",  latencyPercentile: "P50", // changed from "Mean"; all re-measured cells use P50  // ... supportedHardware, hardware, variants, quantizations, strategies, nodesOptions ...  benchmarkCommands: {
    speed:
`python3 -m sglang.bench_serving \
  --backend sglang \
  --host {{CURL_HOST}} --port {{CURL_PORT}} \
  --model {{MODEL_NAME}} \
  --dataset-name {{DATASET}} \
  --random-input-len {{ISL}} --random-output-len {{OSL}} \
  --num-prompts {{NUM_PROMPTS}} --max-concurrency {{MAX_CONCURRENCY}} \
  --warmup-requests 64 --flush-cache`, // added --flush-cache to match cache-cold measurement    // ... accuracy commands
  },  cells: [
    // ... h200 pro fp4 low-latency cell
    {
      match: { hw: "h200", variant: "pro", quant: "fp4", strategy: "low-latency", nodes: "single" },
      verified: true,
      env: [],
      flags: [
        "--trust-remote-code",
        "--model-path {{MODEL_NAME}}",
        "--tp 8",
        "--mem-fraction-static 0.90", // changed from 0.83; avoids detokenizer hang
        "--host {{HOST_IP}}",
        "--port {{PORT}}",
        // ...
      ],
    },
  ],
}

评论区精华

数据一致性审计与异常点标记 正确性

zijiexia 对每个单元格的吞吐量进行了 closed-loop 上界检验,发现 b300 flash ht conc-4096 的 TPOT 异常(比 conc-1024 更低),b300 pro ht TTFT 缩放过大(4.7x vs 其他平台 2.0-2.7x)等。dougyster 提供了 3 次 cache-cold 重复测量数据,并重新测量了可疑点。最终确认部分异常是测量 artifact(如 stale 数据行读取),重新测量后得到正确值。

结论:所有被标记的异常点均通过重新测量验证,更新后的数据通过了一致性检验。 · 已解决

GB200 单元格保留与百分位标注 设计

zijiexia 指出 GB200 单元格的旧版 Mean 数据在全局 P50 页面下会被误标为 P50。dougyster 最初计划删除,但后来选择了更好的方案:在 _deployment.jsx 中添加 per-cell latencyPercentile 支持,将 GB200 单元格单独标记为 "Mean"。

结论:实现了 per-cell 覆盖机制,GB200 单元格保留并正确标注百分位。 · 已解决

dockerImages 是否固定版本号 设计

zijiexia 建议使用 latest 而非固定版本,因为文档应推荐用户跟踪最新版。dougyster 采纳并将所有 dockerImages 恢复为 latest。

结论:dockerImages 统一使用 lmsysorg/sglang:latest。 · 已解决

h200 pro 容量受限行为说明 正确性

zijiexia 注意到 h200 pro 各 concurrency 下 TPS 几乎恒定(~535-572),说明 KV 容量成为瓶颈(~15 并发),而 TTFT 却大幅上升(队列效应)。建议添加注释解释这种容量受限行为。

结论:dougyster 在代码注释中增加了说明,解释 TPS 平台是由于 KV 容量天花板,超出并发的请求会排队。 · 已解决

speed 命令添加 --flush-cache 参数 documentation

所有基准数据均在 cache-cold 下测量(--flush-cache),但 reproduce 命令中未包含该参数,导致用户重测时可能得到不一致的结果。zijiexia 在 review 中未直接提及该点,但 dougyster 主动在后续提交中添加。

结论:speed 命令和模板均添加 --flush-cache,确保 reproduce 命令与测量方法一致。 · 已解决

NVFP4 与 FP4 吞吐量推导不一致 正确性

zijiexia 发现此前 NVFP4 的 throughput 是直接测量 total tok/s/GPU,而 FP4/FP8 是通过 output tok/s 推导而得,导致两者不可比。dougyster 重新测量所有 NVFP4 单元格并统一使用 output/GPU × (isl+osl)/osl 推导公式。

结论:所有 quant 类型的吞吐量现在使用统一推导公式,header 注释也已更新。 · 已解决

风险与影响

主要风险在于数据准确性:虽然所有测量均经过 closed-loop 一致性校验和重复运行,但某些单元格(如部分 B300 数据)依赖特定硬件且测量次数有限,可能存在未捕获的异常。另外,GB200 单元格保留旧版 Mean 数据,其与新版 P50 数据的可比性需要明确标注给读者。引擎的 per-cell latencyPercentile 改动极小,测试覆盖不足,但逻辑简单且 fallback 到全局默认值,风险极低。

对用户:Cookbook 页面展示的 DeepSeek-V4 性能数据将更准确、时效性更强;新增的 NVFP4 单元格填补了此前空白;h200 pro 单元格从留空变为有数据。对系统:无直接影响(仅文档和渲染引擎)。对团队:确立了更严格的基准测试方法论(cache-cold、多次运行取第一次、closed-loop 审计),为未来 cookbook 数据维护提供参考。

部分单元格数据依赖特定硬件(如 GB200 未重新测量) per-cell 百分位覆盖机制缺少独立测试

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论