Optimization progress report

DeepSeek‑V4‑Flash
on 2× DGX Spark

当前最好部署、有效优化与精度风险复盘

最好单次 / 目标76.08 / 80tok/s · SGLang · C1 · 2048-token

2026.08.09 · Mid-project Review

Current best result

当前可复现中位数 71.58 tok/s,最好单次 76.08

02

同一长输出口径:单并发、prompt 约 84 token、输出 2048 token、streaming 首 token 不计、temperature=0、thinking=false。

71.58SGLANG · 3-RUN MEDIAN

三轮为 76.08 / 71.58 / 70.60 tok/s

76.08SGLANG · BEST OBSERVED

TTFT 约 290 ms;尚未稳定常驻到 80

67.35MS · FIXED VERIFY

B186 固定负载;GPU 周期中位约 64.17 ms

vLLM 参考72.19 / 74.77

3轮中位 / 最好单次;MTP6 配置

距离 80+11.8%

按 SGLang 中位数计算,需要再省约 6.7 ms

早期基线58.32

512-token stream;不同输出长度,仅用于看演进

说明:fixed effective tok/s 会被 MTP 接受率波动影响;分析 kernel 收益时优先看 verify latency。各页增益不可直接相加。

B189 official C1 3×2048 · B186 fixed harness · vLLM B114

Machine & benchmark

两台 GB10 用 TP2 协作;本次结果代表短上下文持续解码

03
RANK 0

DGX Spark #1

gx10-2ebe · SSH :43333

NVIDIA GB10 · 20-core ARM

121 GiB 统一内存 · 273 GB/s 理论带宽

TP 地址 192.168.100.11

服务入口 :30000 · earlyoom active

TP2 · NCCL 双 HCA
两台共同算一层
每层都需要跨机同步
RANK 1

DGX Spark #2

gx10-74a7 · SSH :43322

NVIDIA GB10 · 20-core ARM

121 GiB 统一内存 · 128 GB LPDDR5X

TP 地址 192.168.100.10

双 RoCE 数据口 Up · earlyoom active

服务 CTX=8192;长输出测试实际约 84 + 2048 token。MEMFRAC=0.758,不能用 0.85;压测不使用 ignore_eos。

运行时检查与 B189 benchmark protocol · 2026-08-09

Best deployment stacks

SGLang 已复刻 vLLM 的关键路径,并叠加自定义 kernel

04
CURRENT · SGLANG B186

当前常驻

  • DSpark exact speculative,gamma=6
  • Direct DSV4 attention + Head32 FlashMLA
  • Draft WQA/WKV、MHC、local argmax 融合
  • B12X NVFP4 W4A16 MoE small-M kernel
  • FP8 projection / page-size 256 / FP8 KV
  • CUDA Graph BS 1–6;NCCL 2.30.7 双 HCA

71.58 median · 76.08 best

REFERENCE · VLLM B114

当前最好 vLLM 对照

  • DSpark speculative,num spec tokens=6
  • FlashInfer B12X MXFP4 MoE
  • DeepSeek-V4 专用 attention / FP8 KV
  • Full + piecewise CUDA Graph
  • TP2 / NCCL 跨机
  • 尝试 DeepGEMM Mega-MoE 后反而降到约 61–67 tok/s

72.19 median · 74.77 best

“无额外精度损失”是相对当前原生 FP8/NVFP4 checkpoint 而言,并不表示模型等同于全 BF16。FP8 KV cache 的风险另有专页。

SGLang B186/B189 · vLLM B114/B117/B120

Optimization 01 · speculative decoding

DSpark gamma=6:先猜 6 个 token,再由大模型一次验收

05

动机:大模型逐 token 解码很慢。如果小型 draft 能提前猜中多个 token,就能把一次大模型计算摊到多个输出 token 上。

新手版原理

  • 1Draft 先猜:DSpark head 一次提出最多 6 个候选 token。
  • 2Target 再验:完整 DeepSeek 同时检查这些候选,错的地方立即截断。
  • 3选 gamma=6:gamma=5 猜得少;gamma=7 验证成本又超过新增接受收益。

效果与风险

+4.2%fixed effective tok/s;stream 约 +0.1%

平均 committed 约 4.23 → 4.73;verify 成本约 +7.3%,但每轮交付更多 token。gamma=7 的 fixed 反而 −4.6%。

无额外损失

exact verification 保证最终 token 仍由 target 决定。网上“MTP 开大质量下降”主要针对直接采用 draft 输出,不适用于本部署。

数字置信度:高 · B67/B68 同口径 A/B

B67 gamma 5→6 · B68 gamma 7

Optimization 02 · attention path

Direct DSV4 attention:绕开通用框架的“转接层”

06

动机:通用 attention 为很多模型准备了转换、检查和临时张量;DeepSeek-V4 的形状固定,这些通用步骤在短解码里会显得很贵。

具体做了什么

  • 1把 position、mask、KV layout 直接接到 DSV4 专用 attention。
  • 2修正 wrapper 和 graph 内的参数传递,减少 Python/框架层绕行。
  • 3Target 与 draft 都固定走已验证的 DSV4 backend。

效果与风险

11.43 → 43.74tok/s · 历史早期阶段,约 3.8×

这是“修正执行路径 + 去掉框架开销”的合并效果,不应理解成单个 attention kernel 独自提升 3.8×。当前 trace 中 attention 只剩约 0.98 ms/verify。

无算法损失

计算的仍是同一 DSV4 attention;只改变调用路径。可能存在普通浮点末位差异。

数字置信度:中 · 历史阶段结果,非当前逐项 A/B

早期 Direct DSpark/DSV4 attention 路径修复记录

Optimization 03 · draft projection fusion

Fused WQA/WKV:把两趟小矩阵计算合成一趟

07

动机:draft 模型很小,真正计算时间不长,反而容易被“启动两个 kernel、写回中间结果、再读回来”的固定开销拖慢。

具体做了什么

  • 1将 query 与 key/value projection 放进同一个 fused kernel。
  • 2中间结果尽量停留在寄存器/片上存储,不往统一内存来回写。
  • 3减少 kernel launch,并让 draft 更快交出 6 个候选。

效果与风险

+14.9%stream tok/s;fixed +6.6%

B50 → B58:stream 58.32 → 67.03;fixed 56.93 → 60.68。这是目前最清晰的单项端到端收益。

无目标侧损失

融合可能改变 draft 的浮点舍入与接受率,但最终结果仍经过 target exact verification。

数字置信度:高 · 端到端 A/B

B50 baseline vs B58 fused draft WQA/WKV

Optimization 04 · FlashMLA shape

Head32 FlashMLA:用更适合小 head 的 attention 配置

08

动机:同一个 attention kernel 并非所有 head 数都高效。GB10 上的短序列、小批次,需要较小的工作分块,避免很多线程空等。

具体做了什么

  • 1选择 32-head 对应的 FlashMLA 专用形状,而不是通用大 tile。
  • 2减少无效线程和尾部空转,让小请求更容易填满 SM。
  • 3保留相同 KV cache 与 attention 数学定义。

效果与风险

+1.8%fixed;stream 约 +0.5%

B58 → B59:stream 67.03 → 67.37;fixed 60.68 → 61.75。单项不大,但方向稳定,已常驻。

无额外损失

只更换执行形状;数学操作不变。仍可能有浮点规约顺序造成的末位差异。

数字置信度:高 · 同口径 A/B

B58 vs B59 Head32 FlashMLA

Optimization 05 · native NVFP4 MoE

B12X W4A16 MoE:让 GB10 直接吃模型自带的 4-bit 专家权重

09

动机:MoE 专家权重占模型主体。若先完整反量化再计算,统一内存容量和带宽都会吃不消;默认后端对这个 DeepSeek-V4 NVFP4 形状也不够理想。

具体做了什么

  • 1建立 SGLang → B12X 的 bridge,直接读取 checkpoint 的 NVFP4 expert weights。
  • 2kernel 内按块读取 4-bit 权重与 scale,在寄存器中反量化后做 BF16 MMA。
  • 3同时服务 target 43 层和 draft 3 个 stage,共用预分配 workspace。

效果与风险

决定性基础项没有可公平比较的当前端到端 A/B

它解决的是“能否在两台 128 GB Spark 上高效跑原生 NVFP4 MoE”。当前每个 verify 的 W4 累计约 30.9 ms,也是后续最大瓶颈。

checkpoint 原生

没有再次量化;相对当前 NVFP4 checkpoint 无额外损失。相对全精度模型,量化损失已由 checkpoint 本身引入。

效果量级:决定性;精确 tok/s 无干净 A/B

B12X W4A16 bridge · current B186 trace

Optimization 06 · W4 small-M kernel

W4 small-M 专用化:少量 token 不再套用“大货车”kernel

10

动机:每次 target 验证只有 7 个 token。通用 GEMM 按 16 行或更大分块,会让大量线程计算填充行,并浪费 shared memory。

具体做了什么

  • 1用 M8 activation tile 匹配 7-token verify,减少填充计算。
  • 2shared-scale ring、scale shuffle 和更紧凑的三/两级流水隐藏加载等待。
  • 3当前采用 4 blocks/SM;2、3 blocks/SM 在完整图里均为负收益。

效果与风险

延迟约 −1–2%verify latency 的组合收益

代表性演进:72.86 → 71.73 ms;最后 stage 2 调整约 67.91 → 67.74 ms(约 0.25%)。单个子改动易受并行重叠影响。

无额外损失

仍使用相同权重、scale 和输出定义;变化在 tile、加载与流水调度。

数字置信度:中 · 多项累积,非完全正交 A/B

B101 → B133 W4 small-M bundle · B184 → B185 stage 2

Optimization 07 · MHC/residual fusion

MHC 与残差融合:把一串很小的操作合并执行

11

动机:归一化、残差相加和 MHC 统计本身计算不多,但若每一步各起一个 kernel,启动和读写成本会超过计算本身。

具体做了什么

  • 1把 residual 的 pre/post 处理和 MHC partial/finalize 放进较少的 CUTLASS kernel。
  • 2中间统计尽量留在片上,减少统一内存往返。
  • 3让这些小操作更容易与相邻 GEMM 重叠。

效果与风险

延迟约 −1–3%估计量级;没有单独的干净端到端 A/B

当前 trace 中 MHC 累计约 1.90 ms/verify,几乎都在关键路径;说明仍值得继续压,但已不是第一大项。

低风险

数学公式不变;融合可能改变浮点求和顺序,理论上会有末位误差,但没有模型级算法损失。

数字置信度:低到中 · 依据 trace 与历史组合版本估计

B12X integration residual kernels · B186 trace

Optimization 08 · FP8 projections

FP8 projection / LM head:大矩阵少搬一半数据

12

动机:LM head 和若干 projection 每轮都要读很大的权重。使用 checkpoint 自带的 FP8 权重,可降低读取量,并针对固定 shape 选择更合适的 GEMM。

具体做了什么

  • 1Target WO-A、draft LM head 等路径直接走 FP8 blockwise GEMM。
  • 2为 4096 等热点维度固定 tile,减少通用 autotune 的次优选择。
  • 3在 CUDA Graph 中复用已编译 kernel,避免冷启动。

效果与风险

延迟约 −1.7%verify latency:71.73 → 70.51 ms

这是 draft LM-head FP8 专用路径的代表性前后差异。当前 FP8 blockwise GEMM 累计约 18.4 ms,但大部分已与其他工作重叠。

checkpoint 原生

相对当前 FP8 checkpoint 无新增量化;相对 BF16 全精度仍存在 checkpoint 固有误差。

数字置信度:中 · B133 → B142,相邻版本接受率有波动

B133 → B142 FP8 draft LM head / projection path

Optimization 09 · Markov head GEMM

FP8 Markov head:把 draft 的“下一步打分器”也换成专用 GEMM

13

动机:DSpark draft 每轮都要通过 Markov head 为候选 token 打分。它比主模型小,但调用频繁,通用实现仍会积少成多。

具体做了什么

  • 1为 Markov W2 等固定矩阵形状提供 FP8 kernel。
  • 2避免先转成更大 dtype 再走通用 GEMM。
  • 3把结果直接接到 graph 内的 greedy local argmax。

效果与风险

延迟约 −1.1%verify latency:70.51 → 69.70 ms

B142 → B143 的代表性改善约 0.80 ms/verify。真实 stream 收益会随候选接受长度变化。

无目标侧损失

draft 分数可能因 FP8 舍入改变候选或接受率;最终 token 仍由 exact target verification 决定。

数字置信度:中 · 相邻 fixed 版本

B142 → B143 FP8 Markov W2

Optimization 10 · native page 256

Page-size 256:让 KV cache 分页方式匹配 DSV4 kernel

14

动机:KV cache 像一本按页存放的书。页太小会频繁查目录,页布局不匹配则需要拆分和重排;DSV4 对 256-token 页有专用路径。

具体做了什么

  • 1服务端固定 page-size=256,并使用原生 page-256 attention 路径。
  • 2减少 page split、地址计算和不必要的数据重排。
  • 3Target 与 draft graph 采用同一套稳定 KV layout。

效果与风险

延迟约 −3.0%verify latency:69.70 → 67.59 ms

B143 → B145 包含 page split/native page-256 路径的组合收敛,是后半程最大的 verify latency 改善。

无额外损失

只改变 KV cache 的分页与访问方式,不改变保存的数值;精度风险来自下一页所述 FP8 KV dtype。

数字置信度:中 · 两个相邻页面相关版本的组合效果

B143 → B145 page split + native PBS256

Optimization 11 · FP8 KV cache

FP8 KV cache:省内存和带宽,但这是明确的精度风险项

15

动机:上下文越长,KV cache 越大。把 BF16 的 key/value 压成 FP8,理论上可将这部分容量和读取量减半。

具体做了什么

  • 1Target 与 draft 均设置 kv-cache-dtype=fp8_e4m3。
  • 2统一内存压力更低,能给模型、CUDA Graph 和并发请求留空间。
  • 3短上下文 attention 仅约 1 ms,因此当前 C1 纯速度收益不会特别大。

效果与风险

容量约减半tok/s 无干净 A/B;长上下文收益大于本轮短上下文

当前日志提示没有提供专用 KV scaling factors,默认 scale=1.0。exact speculative verification 无法修复 target KV 量化误差。

潜在精度损失

这是当前栈中最需要单独做质量回归的优化;建议补长上下文 perplexity/任务集 A/B。

性能数字置信度:低 · 风险判断置信度:高(运行时明确告警)

Current B186 runtime: FP8 KV scale defaults to 1.0 warning

Optimization 12 · cross-node NCCL

双 HCA + NCCL CTA=4:减少两台机器互相等待

16

动机:TP2 每层都要把两台机器的部分结果合并。如果 collective 慢,GPU 即使算完也只能等另一台。

具体做了什么

  • 1同时启用两条 RoCE HCA,而不是只用一条 PCIe x4 数据口。
  • 2使用 NCCL 2.30.7,并把 NCCL_MAX_CTAS 调到 4。
  • 3协议保持自动选择;强制 Simple 虽然 microbenchmark 快,真实请求却回退。

效果与风险

+1.3%stream;TTFT 另降约 2.4%

大 payload all-reduce 约 0.400 → 0.220 ms。当前 trace 中 NCCL 仍约 5.0 ms/verify,且几乎完全暴露在关键路径上。

无算法损失

collective 数学不变;不同规约树/协议可能改变浮点末位,但不是模型级近似。

CTA=4 数字置信度:高;双 HCA 端到端增益仅有量级估计

B64 NCCL CTA A/B · current dual-HCA NCCL trace

Optimization 13 · CUDA Graph

CUDA Graph BS 1–6:把上千次 kernel 启动录成“宏”

17

动机:一次 verify 包含上千个小 kernel。逐个由 CPU 下达命令会产生空档;CUDA Graph 将固定流程预先录制,运行时一次提交。

具体做了什么

  • 1Target 录制 7-token graph,draft 录制 6-token graph,覆盖 BS 1–6。
  • 2把 draft greedy local argmax 一并折入 graph,避免回 CPU 决策。
  • 3不常驻 CG16:它增加内存,并让常见 C6 负收益。

效果与风险

GPU 空洞仅 1.96 ms每个约 64.17 ms 的 GPU verify 周期

CG6 在 C6 为 184.30 tok/s。CG16 在 C16 仅 +1.64%,却让 C6 从 184.30 降到 169.33(−8.1%),故保留 max BS=6。

无额外损失

只是重放相同 kernel;temperature=0 下 local argmax 与原 greedy 选择一致。

并发 A/B 置信度:高;C1 单独收益无当前 eager 对照

B64/B65 CG6 vs CG16 · B186 full trace

Optimization 14 · direct route preplan

Direct route preplan:启动前就准备好 draft 的专家路线

18

动机:draft 每轮只有 6 个 token。先把 token 按 expert 打包再启动 MoE,准备工作可能和真正计算一样显眼;固定 graph shape 可以提前计划。

具体做了什么

  • 1启动时为 M≤6 的 packed NVFP4 路径预编译 direct-topk launch。
  • 2draft graph 直接使用 top-k route,少走一次通用 route packing。
  • 3仅对精确匹配的 token count 启用,其他 shape 自动退回安全路径。

效果与风险

延迟约 −0.6%verify latency:67.74 → 67.35 ms

B185 → B186 改善约 0.39 ms/verify。当前 route/epilogue 累计约 0.77 ms,但几乎全部被其他计算隐藏。

无额外损失

token-to-expert 映射不变,只把准备步骤提前并选择专用 launch。

数字置信度:中到高 · 相邻 fixed A/B

B185 W4 stage2 → B186 direct preplan

Current bottleneck & next move

下一步只剩硬骨头:W4 MoE 与完全暴露的 NCCL

19

B186 每个 verify 的“未被其他 kernel 隐藏”时间;这是比简单累计 kernel 时间更接近关键路径的口径。

W4 routed-MoE
27.13 ms
FP8 blockwise GEMM
6.89 ms
NCCL collective
5.00 ms
BF16 GEMM
3.20 ms
Attention
0.98 ms

已否决:W4 blocks/SM=2/3、direct scale load、FP8 Stream-K、锁高 GPU 时钟。它们不是“方向错误”,而是当前具体实现均在完整图中负收益。