LFM2.5-DSpark:推测解码实现 3.2x 推理加速攻略 · 干货攻略
- 链接:https://x.com/maximelabonne/status/2085384100416782828
- 分类:x-tips
- 来源:X @maximelabonne
- 作者:Jay
- 更新:2026-08-26
- 仓库:LiquidAI/LFM2.5-2.6B-DSpark
这是什么
DSpark(Decoding Spark)是 Liquid AI 为 LFM2.5 系列模型发布的推测解码(Speculative Decoding)draft 模型系列,覆盖三个尺寸:
| Draft 模型 | 目标模型 | Draft 参数量 |
|---|---|---|
| LFM2.5-1.2B-Instruct-DSpark | LFM2.5-1.2B-Instruct | ~295.7M |
| LFM2.5-2.6B-DSpark | LFM2.5-2.6B | ~327.7M |
| LFM2.5-8B-A1B-DSpark | LFM2.5-8B-A1B | ~327.7M |
Draft 模型架构:5 层纯注意力(attention-only)解码器 + 隐藏状态投影层 + Markov 链 head + 置信度调度验证器,总计 ~300M 参数。每个 draft 模型比目标模型轻约 10 倍,以"sidecar"方式附加在目标模型上,不替换目标模型权重。
核心机制(DSpark 三组件): 1. DFlash-style 并行主干:基于目标模型上下文特征单次前向传播,为所有 draft token 产出 hidden states 2. Markov 链 head:轻量级顺序 head,建模相邻 token 间的依赖关系,提升后续位置接受率 3. 置信度调度验证器:预测每个 token 的存活概率,修剪低置信度后缀(验证成本大于收益时跳过)
为什么值得关注
@maximelabonne(Liquid AI Head of Post-Training)分享了什么
Maxime Labonne 在 X 上宣布了 DSpark draft checkpoints 发布,核心信息:
- 推理吞吐提升高达 3.18x:H100 上 LFM2.5-8B-A1B-DSpark MATH500 场景 428→1362 tok/s;MacBook M4 Max 上 LFM2.5-2.6B 61→139 tok/s,均为 vendor 实测数字
- 零质量损失:Greedy 解码下输出与目标模型完全一致(每条被拒绝的 token 都被目标模型正确 token 替代),benchmark pass@1 / exact match 不变
- 函数调用延迟降低 57%:多工具场景下 LFM2.5-2.6B 函数调用延迟平均降低 57%,对 Agent 场景意义重大
- 即开即用:发布当天支持 llama.cpp 和 SGLang,无需等待上游合并
解决了什么问题
LLM 推理在 decode 阶段是内存带宽受限(memory-bound)——延迟主要来自把权重从 DRAM 加载到 SRAM,而非密集计算。传统自回归 decode 每个 token 都要完整加载一次目标模型权重,效率极低。
推测解码用轻量 draft 模型批量生成候选 token,再让目标模型一次前向传播验证全部候选——一次权重加载验证多个 token,把内存带宽瓶颈转为计算受限(compute-bound),从而提速。
但现有推测解码方案(如 EAGLE-3、DFlash)各有局限:DFlash 并行主干无法建模 token 间依赖,接受率随位置下降;Markov 链 head 只建模相邻 token,无法利用更长上下文。
DSpark 将两者结合,并加入置信度调度,在 LFM 线性状态空间模型架构上首次实现生产级推测解码。
核验过程
官方来源
- HuggingFace 官方博客(huggingface.co/blog/LiquidAI/lfm25-dspark):完整 benchmark 数据表、架构说明、三组件原理、命令行示例、模型下载链接
- Liquid AI 官方博客(liquid.ai/blog/lfm2.5-dspark):与 HF 博客数据一致,含 H100 和 M4 Max 双平台 5 数据集详细对比图
- HuggingFace 模型卡(LiquidAI/LFM2.5-2.6B-DSpark):确认 draft 模型为
LiquidAI/LFM2.5-2.6B的 drafter;SGLang 约 2.6x 加速
交叉验证结论
| 说法 | 来源 | 核验结果 |
|---|---|---|
| LFM2.5-2.6B DSpark H100 mean 2.67x(323→864 tok/s) | HF 博客 + 官方博客 | ✅ 完全一致 |
| LFM2.5-2.6B DSpark M4 Max mean 2.27x(61→139 tok/s) | HF 博客 + 官方博客 | ✅ 完全一致 |
| LFM2.5-8B-A1B DSpark H100 mean 2.54x(418→1074 tok/s) | HF 博客 + 官方博客 | ✅ 完全一致 |
| LFM2.5-8B-A1B DSpark M4 Max mean 1.18x(90→106 tok/s) | HF 博客 + 官方博客 | ✅ 完全一致(MoE 限制) |
| MATH500 上 H100 3.06x(326→1000 tok/s,LFM2.5-2.6B) | HF 博客 + 官方博客 + Unite.AI 报道 | ✅ 三方一致 |
| 8B-A1B H100 MATH500 3.18x(428→1362 tok/s) | HF 博客 + 官方博客 + Unite.AI 报道 | ✅ 三方一致 |
| 函数调用延迟降低 57%(多工具场景平均) | HF 博客 + 官方博客 + daily.dev | ✅ 三方一致 |
| Greedy 输出与目标模型完全一致,pass@1 不变 | HF 博客 | ✅ 确认(机制保证) |
| Draft 模型 ~300M 参数(5 层 attention-only) | HF 博客 | ✅ 确认 |
| Day-one 支持 llama.cpp(PR#27383)和 SGLang(PR#31041) | HF 博客 | ✅ 确认 |
| M4 Max 使用 FP16 GGUF + Metal,H100 使用 BF16 + SGLang | HF 博客 | ✅ 确认(两种不同配置) |
⚠️ 注意:H100 基准使用 SGLang + BF16,M4 Max 基准使用 llama.cpp + Metal + FP16 GGUF。两种配置和引擎均不同,数字不可直接横向比较。X 帖中笼统说"3.2x"是取 H100 MATH500 的峰值;实际使用中加速比取决于硬件、模型和数据集。
上手步骤
方式一:SGLang(GPU 推荐)
前置条件:需要 SGLang build 含 DSpark LFM2 target 支持,对应 PR #31041。
python -m sglang.launch_server \
--model-path LiquidAI/LFM2.5-2.6B \
--speculative-algorithm DSPARK \
--speculative-draft-model-path LiquidAI/LFM2.5-2.6B-DSpark \
--speculative-draft-attention-backend flashinfer \
--disable-radix-cache \
--mem-fraction-static 0.75 \
--port 30000
然后用 OpenAI-compatible 接口调用:
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "LiquidAI/LFM2.5-2.6B",
"messages": [{"role": "user", "content": "Explain speculative decoding in 3 sentences."}]
}'
基准命令(不加 DSpark):去掉三个
--speculative-*参数即可做对比。
方式二:llama.cpp(Apple Silicon / 边缘推荐)
前置条件:需要含 DSpark 支持的 llama.cpp build,对应 PR #27383,需启用 Metal 加速。
llama-server -m LFM2.5-2.6B-F16.gguf \
-md LFM2.5-2.6B-DSpark-F16.gguf \
--spec-type draft-dspark \
--spec-draft-n-max 10 \
--spec-draft-n-min 0 \
-fa on \
-ngl 99
参数说明:
- -m / -md:分别指定目标模型和 draft 模型(两边都用 F16;QAD Q4_0 + DSpark 的组合官方未测试)
- --spec-type draft-dspark:指定推测解码类型
- --spec-draft-n-max 10:最大 draft 长度(drafter 配置 block size 为 9,n-max 会被 clamp 到此值)
- -fa on -ngl 99:启用 Flash Attention 和加载全部层到 GPU
下载 Draft 模型
所有 DSpark draft checkpoints 均已在 HuggingFace 发布:
| 模型 | Safetensors | GGUF |
|---|---|---|
| LFM2.5-1.2B-Instruct-DSpark | HF 仓库 | HF GGUF |
| LFM2.5-2.6B-DSpark | HF 仓库 | HF GGUF |
| LFM2.5-8B-A1B-DSpark | HF 仓库 | HF GGUF |
验证 DSpark 是否生效
SGLang 响应会包含 usage 字段中 draft_tokens(或用 --log-prefix-draft);llama-server 输出中每个 response 的 timing 行会报告 draft_n / draft_n_accepted,例如 draft_n=7/5 表示提议 7 个 token、接受 5 个。
坑与适用边界
坑 1:MoE 模型(8B-A1B)在 Apple Silicon 上收益极小
LFM2.5-8B-A1B 是 MoE(Mixture of Experts)架构。llama.cpp Metal 后端验证 k 个 token 会激活更多 expert,权重流量反而更大。M4 Max 上 8B-A1B DSpark 仅获得 1.18x 加速(H100 上 2.54x)。如果你要在 MacBook 上跑 8B,请勿期待 DSpark 带来显著加速。
坑 2:H100 和 MacBook 基准不可横向比较
H100 基准用 SGLang + BF16,M4 Max 用 llama.cpp + Metal + FP16 GGUF——引擎、精度、后端均不同。X 帖流传"3.2x 加速"是 H100 MATH500 峰值,不宜直接与 MacBook 对比。
坑 3:DSpark 和 QAD 尚未联合测试
QAD(量化感知蒸馏)指南中提到 1.2B/2.6B QAD Q4_0 在同一 repo。DSpark draft 模型目前仅提供 F16 版本,Q4_0 draft + Q4_0 target 的组合 Liquid AI 尚未测试,混用需自行 benchmark。
坑 4:温度必须为 0
所有官方 benchmark 均在 temperature=0(greedy)下测量。Markov head 的接受率依赖于精确分布匹配,温度扰动会破坏这一前提,导致接受率大幅下降、加速效果消失。DSpark 不适用于 temperature>0 的场景。
坑 5:Draft 模型和目标模型版本必须严格匹配
Draft 模型只能配对对应的目标模型版本(1.2B-Instruct 只能配 1.2B-Instruct,不能配 2.6B)。混用会导致接受率极低甚至输出错误。
适用边界
- 最适合:H100/A100 等数据中心 GPU 部署 LFM2.5-2.6B 或 1.2B;对函数调用延迟敏感的 Agent 场景;需要在 MacBook M 系列上跑 LFM2.5-2.6B 且对交互速度有要求
- 不适合:MacBook + 8B-A1B(MoE Metal 后端限制);需要 temperature>0 的生成任务;追求绝对最低内存占用(draft 模型增加约 300M 额外权重)
- 与 QAD 的关系:两者可互补——QAD 解决量化精度损失,DSpark 解决推理吞吐,QAD+DSpark 联合使用官方未测试
一句话结论
LFM2.5-DSpark 以 ~300M 参数的 sidecar draft 模型实现 H100 上平均 2.67x / MacBook M4 Max 平均 2.27x 推理加速,零质量损失;在 SGLang(GPU)或 llama.cpp(Metal/边缘)均可即开即用,是 LFM2.5 系列本地/云端部署提效的实用手段。
数据来源:HuggingFace 官方博客 huggingface.co/blog/LiquidAI/lfm25-dspark + Liquid AI 官方博客 liquid.ai/blog/lfm2.5-dspark + HuggingFace 模型卡 LiquidAI/LFM2.5-2.6B-DSpark;H100 基准使用 SGLang + BF16,M4 Max 使用 llama.cpp + Metal + FP16,两套配置不可直接横向比较。