llama.cpp 是在本地运行大语言模型的工具。此次优化在 NVIDIA GPU 上融合 NVFP4(权重 4 位量化)模型的输入上下文处理运算,提高生成回答前的提示词处理速度。

测量方法

DGX Spark 的提示词处理速度提高了 28.1%。这是 2026 年 11 月 5 日发布的 b12122 中的优化。

激活值(模型计算中产生的中间值)为 4 位的 W4A4 仅限 Blackwell,Turing~Hopper 使用 8 位激活值的 W4A8。表中的 master 和 PR 分别表示应用 #31296 前后。命令见文末示例,-ub 是物理最大批大小。

各 GPU 的代表性测量值

条件:16k,Llama-3.1-8B NVFP4,计算路径按行标示。

单位:tok/s

表:各 GPU 的提示词处理速度

各 GPU 的代表性测量值
GPU路径masterPR提升幅度
DGX Spark (GB10)W4A43618.64635.9+28.1%
RTX 5090W4A417007.119668.2+15.6%
RTX 4090W4A88045.08956.5+11.3%
RTX 3090 TiW4A83979.24264.8+7.2%

8 个 W4A4 组合的提升幅度为 +9.6~28.1%,6 个 W4A8 组合为 +2~11.3%。完整列表见来源中的 PR 原文。

与 vLLM 的提示词处理对比

共同条件为 DGX Spark(GB10)、nvidia/Qwen3.8-27B-NVFP4(revision 482ca0f3)、1 个序列。

条件:vllm bench latency,输出 1 个 token,FP16 激活值与 KV 缓存(存储先前 token 的键和值),预填充分块为 2048 个 token,关闭前缀缓存,FlashInfer 注意力,预热 2 次、测量 5 次。

单位:tok/s

表:vLLM 的提示词处理速度

与 vLLM 的提示词处理对比
构建版本8k16k
vLLM 0.33.03254.53012.4

条件:下方命令,输出 0 个 token,测量 3 次,F16 KV 缓存,NVFP4 W4A4。注意力实现按行标示。

单位:tok/s

表:llama.cpp 的提示词处理速度

DGX Spark 的提示词处理速度 (tok/s)master (Q8_0): 8k 1156.9, 16k 1118.2; 本 PR (Q8_0): 8k 1414.5, 16k 1352.7; #28413 + 本 PR (FP8): 8k 1604.7, 16k 1537.58k16kmaster (Q8_0)1156.91118.2本 PR (Q8_0)1414.51352.7#28413 + 本 PR (FP8)1604.71537.5
DGX Spark 的提示词处理速度 (tok/s)
与 vLLM 的提示词处理对比
构建版本8k16k
master (Q8_0)1156.91118.2
本 PR (Q8_0)1414.51352.7
#28413 + 本 PR (FP8)1604.71537.5

在这些条件下,本 PR 单独达到 vLLM 吞吐量的约 43.5%(8k) 和 44.9%(16k)。与 FP8 cuBLAS PR #28413 结合后,可从 master 的约三分之一提升至约一半。#28413 尚未合并,该组合未包含在 b12122 中。

为何存在这些差异

门控与上投影将输入分为两路计算,用门控结果调节上投影结果。在 MMQ(量化矩阵乘法专用 CUDA 内核路径)中,两次矩阵乘法与 GLU(合并两路结果的运算)一次完成。以每组 8 行交替排列,使各线程同时持有同一输出元素的上投影值和门控值。写入内存时,通过寄存器应用 GLU 和 NVFP4 权重缩放。

前期工作包括普通前馈神经网络的 #29948(2026-10-25 合并),以及混合专家 MoE 的 #31188(2026-10-28 合并)。另一次 DGX Spark 测量中,Llama-3.1-8B Q4_K_M 从 2749.3 → 3000.6 tok/s(+9.1%),Qwen3-30B-A3B Q4_K_M 提升 +17.2%。此次将其扩展至 NVFP4。

通过 nsys(性能分析器)跟踪分析了与 vLLM 的剩余差距。在 DGX Spark、Qwen3.8-27B-NVFP4 上跟踪同时应用本 PR 和 FP8 PR #28413 的组合时,单次 8K 提示词的 GPU 时间为 llama.cpp 5.02 秒、vLLM 2.47 秒。双方 GPU 利用率均为 98~99%,因此差异全部来自内核时间。

差异从大到小依次为 FP4 矩阵乘法(1.59 秒对 0.87 秒)、小型辅助运算(0.96 秒对 0.26 秒)、矩阵乘法前的激活值量化(0.82 秒对 0.27 秒)。量化方面尤其是因为 llama.cpp 两次读取 F32,即 32 位浮点格式,每个 8K 提示词耗时 456ms。vLLM 则将 FP4 量化融合进执行激活与归一化的 SwiGLU/RMSNorm 神经网络运算,消除了 amax(计算块内最大绝对值)遍历。

选择时的依据

Blackwell GPU(DGX Spark、RTX 5090)的 W4A4 路径在表中获益最大。在 DGX Spark、Llama-3.1-8B NVFP4 上使用 4096 个 token 的提示词,即使将 ubatch 降至 16,也没有性能损失,反而提升 3.0%。b12122 是持续发布的 b 编号构建版本。上一正式版 v0.9.0(2026-11-04)支持 OCP FP8 E4M3 量化和 flash_attn_ext_rows 运算。数据均为各 PR 作者自行测量,作者表示对比基准测试与跟踪分析得到了 Claude 的协助。

支持 CUDA MMQ 的显卡可使用相同模型和设置,对比之前的构建版本与 b12122。复现示例中的 <gguf> 需替换为模型文件。

llama-bench -m <gguf> -ngl 99 -fa on -p 8192,16384 -n 0 -b 2048 -ub 2048 -r 3

运算融合加快了输入处理,但矩阵乘法和激活值量化的内核时间仍在造成差距。