Liquid AI 给 LFM2.5-VL-3B 配了 280M 的专用草稿模型,llama.cpp / MLX-VLM / SGLang 首日支持。解码最高提速 3.13 倍,但端到端最低只有 1.30 倍——差距卡在 prefill 和视觉编码上。本文拆解三套硬件六个任务的实测数据、接受长度这一列说明了什么,以及什么场景下值得上。
本文编译自 Liquid AI 团队发表在 Hugging Face Blog 的《Accelerating vision-language models with LFM2.5-VL-DSpark》(2026 年 9 月 24 日),原文地址:https://huggingface.co/blog/LiquidAI/lfm2-5-vl-dspark 。文中数据与命令均出自该文及其配图。
Liquid AI 给它的 30 亿参数视觉语言模型 LFM2.5-VL-3B 配了一个专用草稿模型 LFM2.5-VL-3B-DSpark,把推测解码(speculative decoding)从纯文本场景搬到了看图的场景里。原文把这个草稿模型明确称作「实验性的 DSpark 草稿模型」(an experimental DSpark draft model)——它目前是实验性发布,不是稳定版本,下面所有数字和部署建议都要放在这个前提下看。宣传口径是解码环节最高提速 3.13 倍,代价是多加载 2.8 亿参数——相对 3B 的主模型只多出 8.9%。llama.cpp、MLX-VLM、SGLang 三个推理框架首日即可用。
这组数字看着很漂亮,但它有一个必须先说清楚的前提:3.13 倍是解码环节的倍数,不是你实际等待时间缩短的倍数。同一张表里,端到端的最好成绩是 2.62 倍,最差只有 1.30 倍。这中间的落差不是宣传注水,而是 VLM 这类模型的结构决定的。理解这个落差,比记住那个最大值有用得多。
推测解码的基本盘是:用一个小得多的草稿模型一次性猜出接下来 k 个 token,再让主模型一次性验证这 k 个猜测,对的部分直接留下,错的部分丢掉重来。主模型原本要跑 k 次才能吐出 k 个 token,现在一次就能确认好几个,省下的是访存往返。
DSpark 的草稿模型并不是独立重新理解输入,而是从主模型固定的若干层上取出隐藏状态(原文称为 tapped layers),以此为条件去起草一个 k 个 token 的块。关键在于 LFM2.5-VL 的结构里,图像 patch 和文本 token 在进入这些层之前就已经被投影到同一个表征空间,维度完全一致。这意味着草稿模型拿到的永远是同一种形状的隐藏状态向量,它根本不需要知道上游是一张图还是一段文字。
所以原文那句结论才成立:推理算法和纯文本版的 DSpark 相比没有任何改动。视觉能力是在主模型里解决的,草稿模型只负责在隐藏状态上做外推。这也解释了为什么这套东西能在三个框架上同时首日支持——它没有引入新的算子,只是多挂了一个小模型。

主模型(左)处理图像 patch 与文本 token 后,通过 KV 注入把状态传给草稿模型(右);草稿模型先并行出块、再经序列块与硬件感知的前缀调度器给出候选,最终由主模型逐个判定 keep 或 drop——图中四个候选里三个被保留、一个被丢弃。图片来源:Liquid AI / Hugging Face Blog
训练用的是视觉—语言 SFT 数据混合,配比向团队预期的实际负载倾斜。架构上做了 3 层、4 层、5 层的消融实验,最后选了 4 层的纯注意力(attention-only)草稿模型,块大小 9。在最终数据混合上跑了 10 个 epoch,每个 epoch 后都测一次接受率,接受率随训练 token 增加而提升,直到收益递减为止。
成品约 2.8 亿参数,使部署时的参数量增加 8.9%。推理阶段官方建议块大小取 8 或 9,具体看硬件。
这里有个容易被忽略的工程含义:8.9% 的参数增量在显存充裕的服务器上无所谓,但在端侧是实打实要占内存的。一个 3B 模型加一个 280M 草稿模型,意味着你的内存预算要按 3.28B 来算。对于卡在内存上限边缘的设备,这笔账要单独算。
评测遵循 MMSpec 基准,覆盖六类任务:通用 VQA、文字 VQA(TextVQA)、图像描述(COCO)、图表 VQA(CharXiv)、复杂推理(MMMU-Pro)和多轮对话。两种配置的块大小都固定为 8。
端侧部分:
| 硬件 / 框架 | 解码提速 | 端到端提速 |
|---|---|---|
| Apple M5 Max + MLX | 2.30x ~ 3.13x | 1.56x ~ 2.62x |
| Apple M3 Ultra + llama.cpp | 1.57x ~ 2.14x | 1.30x ~ 1.77x |
| NVIDIA H100 + SGLang | 约 2.04x ~ 2.66x | 1.64x ~ 2.27x |
(关于 H100 一行:原文正文写的是「20.4x to 2.66x」,这个区间下限明显是笔误——配图里 H100 各任务的解码倍数落在 2.04 到 2.66 之间,multi-turn 一行正是 2.04x。此处按配图取值。)
逐任务看更能说明问题。下面把配图里三套硬件的端到端倍数并排列出(括号内为解码倍数):
免费获取企业 AI 成熟度诊断报告,发现转型机会
| 任务 | M5 Max / MLX | M3 Ultra / llama.cpp | H100 / SGLang |
|---|
| MMMU-Pro(复杂推理) | 2.62x(2.93x) | 1.74x(2.03x) | 1.97x(2.43x) |
| COCO(图像描述) | 2.59x(3.13x) | 1.77x(2.14x) | 2.27x(2.66x) |
| multi-turn(多轮对话) | 1.91x(2.30x) | 1.37x(1.57x) | 1.83x(2.04x) |
| GQA(通用 VQA) | 1.93x(2.67x) | 1.30x(1.77x) | 1.77x(2.35x) |
| CharXiv(图表 VQA) | 1.71x(2.94x) | 1.56x(1.87x) | 1.97x(2.39x) |
| TextVQA(文字 VQA) | 1.56x(2.69x) | 1.33x(1.64x) | 1.64x(2.14x) |
跨三套硬件真正稳定的只有两头:MMMU-Pro 与 COCO 始终排在前两位(H100 上 CharXiv 以 1.97x 与 MMMU-Pro 并列),垫底的始终是短答案任务——M5 Max 与 H100 上是 TextVQA,M3 Ultra 上是 GQA 的 1.30x。中间四项的次序则随硬件变动:CharXiv 在 M5 Max 上排倒数第二,在 H100 上却挤进了并列第二。所以选型时能借用的只有这个粗粒度结论:长输出的复杂推理与图像描述最值得上,短答案任务最不值得;中间那几类的相对次序是硬件和框架的事,必须在自己的机器上实测,照搬别人的排名会踩空。

Apple M5 Max(MLX)与 M3 Ultra(llama.cpp)上六个任务的单请求耗时对比,浅灰为 prefill、深灰为基线解码、紫色为 DSpark 解码,右侧三列依次是端到端倍数、解码倍数与接受长度。图片来源:Liquid AI / Hugging Face Blog

同一套任务在 NVIDIA H100 80GB HBM3 + SGLang 上的结果,COCO 拿到最高的 2.27 倍端到端提速。图片来源:Liquid AI / Hugging Face Blog
这是整篇文章最该带走的一条,原文自己也用了一节来讲。
在纯文本大模型里,prefill(把提示词一次性喂进去、填满 KV 缓存的阶段)主要受算力约束,其开销随提示长度以次二次方增长。VLM 在这之上又多了一层:图像要先过视觉编码器,然后语言主干还要把几百个视觉 token 连同文本提示一起处理一遍。
而推测解码只加速 decode,不加速视觉编码,也不加速 prefill。当这两个阶段本来就吃掉了大半的墙钟时间,解码环节再快也顶不上去。这就是阿姆达尔定律(Amdahl's law):整体加速比被那个没被加速的部分卡住上限。
端侧设备的算力远低于数据中心 GPU,prefill 占端到端延迟的比重因此更高——这一点在上面那张端侧图里看得很直白:浅灰色的 prefill 段在 DSpark 那一行几乎没有缩短,紫色段缩短再多,总长度也只能压到那个程度。TextVQA 是最典型的例子:M5 Max 上它的解码提速有 2.69 倍,端到端却只有 1.56 倍,六个任务里垫底,原因就是它的 prefill 占比高。反过来 MMMU-Pro 输出长、prefill 占比相对小,端到端就能跑到 2.62 倍。
原文顺带提了一句值得记下的硬件趋势:M5 每个 GPU 核心内置的神经加速器缩小了这个差距。换句话说,端侧 prefill 的短板正在被硬件补,不是被算法补。
配图右侧有一列 accept(接受长度),正文没有展开,但它其实是理解这套机制上限的钥匙。
块大小是 8,而实测接受长度落在 3.24 到 4.57 之间——也就是说,草稿模型一次猜 8 个,平均只有四成到六成能被主模型认下来,剩下的算力是白花的。这就解释了为什么解码提速停在 2 到 3 倍,而不是跟块大小同量级的 8 倍。想把接受长度往上推,要么草稿模型更强,要么任务本身更好预测。
更有意思的是把两台端侧设备横着比。同样是 MMMU-Pro 任务,M5 Max 上接受长度 4.07、解码提速 2.93 倍;M3 Ultra 上接受长度 4.19,反而略高,解码提速却只有 2.03 倍。接受长度几乎一样,收益差了将近一半——差别不在模型猜得准不准,而在草稿模型自身的运行开销相对主模型占多大比例,这完全是硬件和框架实现的事。
这给出一条实用的判断方法:接受长度决定了理论上限,硬件决定你能拿到其中多少。看到别家宣传推测解码的加速比时,先问一句是哪台机器、哪个框架、prefill 占多少——换一台设备,同一个草稿模型的价值可以差一倍。
SGLang 需要带 DSpark for LFM2 支持的构建(PR #40651):
python -m sglang.launch_server \
--model-path LiquidAI/LFM2.5-VL-3B \
--speculative-algorithm DSPARK \
--speculative-draft-model-path LiquidAI/LFM2.5-VL-3B-DSpark \
--speculative-draft-attention-backend flashinfer \
--speculative-dspark-block-size 9 \
--disable-radix-cache
启动后在 http://localhost:30000/v1 走 OpenAI 兼容接口调用。块大小会从草稿模型的 config.json 里读取。做基线对照就是同一条命令去掉三个 --speculative-* 参数——这个对照方式值得照搬,它保证了除推测解码外其余配置完全一致。
llama.cpp 需要对应构建(PR #29339):
llama-server -m models/LFM2.5-VL-3B-F16.gguf \
--mmproj models/mmproj-LFM2.5-VL-3B-F16.gguf \
-md LFM2.5-2.6B-DSpark-F16.gguf \
--spec-type draft-dspark --spec-draft-n-max 8 --spec-draft-n-min 0 \
-fa on -ngl 99 -c 8192
MLX-VLM 需要对应构建(PR #2280),命令最短:
mlx_vlm.server --model LiquidAI/LFM2.5-VL-3B --draft-model LiquidAI/LFM2.5-VL-3B-DSpark
块大小从 sidecar 元数据里读,n-max 会被钳制到该值。
有两个细节对线上部署很关键。第一,推测解码是精确的:主模型会验证每一个被提议的 token,在贪心解码下输出与单独跑主模型完全一致。这不是近似加速,不需要重新评估输出质量。第二,每次响应的计时里会报告 draft_n / draft_n_accepted,也就是起草数与接受数——这就是上面那列接受长度的线上版本,上生产后应当把它接进监控,它是判断草稿模型在你的真实流量上是否还划算的直接指标——考虑到这还是个实验性发布,接口与块大小配置都可能变,这条监控不是可选项。
草稿模型在 Hugging Face 上提供 Safetensors 和 GGUF 两种格式。
把上面的账合起来,判断标准其实很清楚。
值得上:输出较长的任务(复杂推理、多轮对话、长图像描述),decode 在总耗时里占大头,2 到 3 倍的解码提速能实打实转化成 1.9 到 2.6 倍的体感提升;同时你的内存还能容下多出来的 8.9%。
收益有限:短答案、单图、prefill 重的任务。TextVQA 那 1.56 倍和 M3 Ultra 上 GQA 的 1.30 倍就是这类场景的真实水位。1.3 倍当然也是提速,但要不要为此多背一个模型、多一套框架版本依赖,得自己权衡。
优先该做的事:如果你的端到端延迟里 prefill 和视觉编码已经占了六成以上,那么先去压视觉 token 数量、降输入分辨率、上 prefix 缓存,收益比接推测解码大得多。阿姆达尔定律是双向的——它既限制了推测解码的上限,也指明了当下真正的瓶颈在哪一边。








关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断