WeChat (靳岩岩)
local-llmai-engineering
Original source

DeepSeek-V4-Flash on DGX Spark: 12 到 24 tok/s 速度翻倍的原因

Summary

作者在 DGX Spark 上跑 DeepSeek V4 Flash,从旧方案 (jasl fork + Marlin) 的 12 tok/s 提升到新方案 (tonyd2wild) 的 24.5 tok/s,逐行读代码调查原因。

真正起作用的三条

  1. CUDA graph(大头) — 旧方案被迫用 —enforce-eager(sm_121 上 CUDA graph 有 bug),CPU 每步逐个下发上千次 kernel 启动;新方案开了整模型 CUDA graph,每步只重放一次,连双机通信都包在图里。

  2. B12X 专用 MoE kernel(大头) — 旧方案用通用 Marlin kernel(为前代架构设计);新方案用专为 sm_121 + V4 Flash 特化的 B12X kernel 库——专属布局、按专家路由预排、针对这颗芯片调寄存器。贡献与 CUDA graph 不相上下。

  3. 注意力零中间搬运(中等) — 旧方案部分形状下需先解压 FP8 KV 到 16 比特再计算;新方案 kernel 直接消费 FP8 分页缓存,不落地。

三笔容易记错的账

  • ❌ “激活降到 8 比特” — 新方案代码硬编码 w4a16,激活位宽没变
  • ❌ “新版调度把通信藏进计算” — 老版本早就有异步调度,而且两边都没有真正重叠通信和计算
  • ❌ “新版本隔代红利” — 逐项剥开后就是上面三条,其余零散优化是小头

Kernel 生态层次(很好的科普)

  • 第一层(造 kernel 的工具):CUDA C++, CUTLASS, Triton, TileLang
  • 第二层(kernel 库/成品):Marlin(通用4bit), DeepGEMM(DS官方FP8/FP4), FlashInfer(attention), B12X(sm_121专用)
  • 第三层(vLLM 后端插槽):—moe-backend marlin 还是 b12x,指定谁掌勺

最新进展

tonyd2wild 已有新方案:KV cache 压到 4 比特 + 修复 DSpark 投机解码 bug(12 个草稿头权重被静默丢弃,接受率从 60% 掉到 25%)。部署后峰值 83.8 tok/s,代码生成 52.6 tok/s。

核心洞察

  • 没有魔法开关 — 三个”绕”字换成三个”直”字就翻倍
  • “为什么变好了”和”为什么变坏了”是同一枚硬币
  • 最顺嘴的故事最危险:不读代码几乎必定把功劳记给”更激进的量化”