top of page

llama.cpp CUDA 融合合并,提示词处理速度最高提升 10.7%

2小时前
讀畢需時 12 分鐘

llama.cpp 于 10 月 25 日合并了一项 CUDA 优化;贡献者的基准测试显示,DGX Spark 上的提示词处理性能最高可提升 10.7%。这项 llama.cpp CUDA 融合改动将模型前馈网络内的操作合并执行;前馈网络负责在注意力阶段之间转换 token 表示。其收益体现在读取提示词,而非生成后续的每一个回答 token。

贡献者 anujj 的测试也显示,NVIDIA RTX 5090 上同样有所提升,但报告中的百分比增幅较小。这些是作者报告的对比结果,尚未经独立复现。底层改动可在已合并的代码中验证,但其实际价值仍取决于模型格式、硬件和工作负载。

核心对比在于融合执行与现有执行路径:前者将相关操作合并,后者则分别调度这些操作。此前的一项提案以不同方式探索了同样的机会。已合并的方法重新组织了数值传递至 GPU 线程的方式,在不改变已存储模型权重的前提下减少中间工作量。对于在本地处理长提示词的开发者而言,这是一项值得针对现有部署进行衡量的具体软件改进。

llama.cpp CUDA 融合合并改变了什么

这项已合并的改动将现有优化扩展至受支持 NVIDIA 硬件上的更大规模提示词处理工作负载。

CUDA 是 NVIDIA 的 GPU 计算平台,为该实现提供执行环境。MMQ 是 llama.cpp 的量化矩阵乘法路径,负责处理涉及压缩模型权重的计算。量化以较低数值精度表示这些权重,从而降低存储和内存需求。

这项已合并的融合改动针对受支持稠密前馈层内反复出现的一组操作序列。独立的 gate 投影和 up 投影会转换相同输入。随后,门控线性单元(GLU)通过激活和逐元素乘法结合其结果。

此前,这一路径上的较大工作负载会将投影及其组合拆分为独立操作处理。根据 anujj 的说法,新实现通过单个矩阵乘法 kernel 执行该序列。Kernel 是在 GPU 线程中启动执行的函数。

这种整合之所以重要,是因为其周边工作同样会消耗资源。准备输入、启动操作、写入中间结果并再次读取,都可能增加开销。合并操作创造了减少部分数据传输的机会,同时保留预期的数学变换。

这项改动并未同时将该思路引入所有执行路径。贡献者表示,小批量融合已通过其他矩阵-向量实现存在。矩阵-向量计算通常服务于比这里重点讨论的矩阵-矩阵计算更小的工作负载。

这一差异解释了为何公告聚焦于提示词处理。预填充(prefill)阶段会在生成回答前处理输入提示词,能够暴露出更大的工作批次。新近支持的执行路径正是针对推理的这一部分。

时间线同样值得注意。该拉取请求的初始描述日期为 10 月 4 日,项目则于 10 月 25 日将其合并。此次合并使实现进入项目的 master 分支,但并不意味着每个打包应用都已包含这一改动。

桌面应用、容器或下游项目都可能按各自的节奏整合 llama.cpp。因此,用户需要确认界面背后实际运行的版本。应用更新与上游源码合并是两件不同的事。

对于现有模型文件,兼容性情况相对简单。贡献者表示,存储的权重布局保持不变。用户不应将标题中对交错行的提及理解为必须下载经过特殊重排的模型文件。

因此,眼前的新闻范围明确而具体:一个受支持的执行序列如今在上游获得了额外优化。某项具体请求是否会使用它,取决于运行时的资格检查。

基准测试收益更偏向 Spark,RTX 5090 的提升较小

报告结果显示,列出的配置均呈现一致的提升方向,但提升幅度会随硬件和量化方式而变化。

作者使用配备 GB10 处理器的 DGX Spark 进行测试,并另外测试了 RTX 5090。两张基准表都将标记为 master 的基线与该拉取请求进行对比。列出的每一行都显示,改动后的实现拥有更高的提示词处理吞吐量。

在 DGX Spark 上,最高百分比提升来自使用 IQ4_XS(一种压缩权重格式)的 Llama-3.1-8B。吞吐量从每秒 2,933.9 个 token 提升至每秒 3,249.0 个 token。作者报告称,该配置提升了 10.7%。

Spark 上其他 Llama-3.1-8B 结果虽低于这一峰值,但仍显示出可观的提升。Q4_K_M 配置从每秒 2,749.3 个 token 增至每秒 3,000.6 个 token。Q5_K_M 配置则从每秒 2,699.4 个 token 提升至每秒 2,960.3 个 token。

这些标签代表不同的量化模型配置,而不是同一个二进制文件可互换的测量结果。它们说明,评估优化时应匹配确切的文件格式。仅有模型系列名称会遗漏一个相关变量。

Spark 表格还列出了标记为 Qwen3.8-27B 和 Qwen3.6-27B 的模型。这些名称在此按贡献者报告中的基准标签原样复现。性能表本身并不能独立证实它们的训练细节、能力或更广泛的可用性。

对于标记为 Qwen3.8-27B 的条目,Spark 上的提升幅度介于 4.6% 至 7.4%。Q4_K_M 行从每秒 840.1 个 token 提升至每秒 899.9 个 token。IQ4_XS 行则从每秒 882.4 个 token 增至每秒 948.0 个 token。

RTX 5090 的结果呈现出不同量级的提升。在其列出的配置中,作者报告的增幅范围为 1.9% 至 4.7%。这一较小的百分比区间使得基于具体硬件的解读至关重要。

对于 IQ4_XS 格式的 Llama-3.1-8B,RTX 5090 的结果从每秒 12,997.6 个 token 提升至每秒 13,603.3 个 token,报告的增幅为 4.7%。对于 Qwen3.8-27B Q6_K 条目,吞吐量从每秒 3,220.5 个 token 提升至每秒 3,281.0 个 token,即 1.9%。

因此,llama.cpp 融合基准测试支持一个有限的结论:在作者选定的长提示词测试中,该优化提升了报告矩阵内各项配置的输入吞吐量。它们并未证明每一种受支持 GPU 都会获得相同的提升。

百分比对比同样未揭示 Spark 为何收益更大。不同的内存行为、执行特征及既有瓶颈都会影响优化结果。要确定它们各自的相对贡献,需要进行额外性能剖析;仅凭这些标题级测量结果无法提供这一答案。

对于购买者而言,有用的启示在于评估纪律。这些结果不足以仅凭百分比增幅来选择硬件。绝对吞吐量、模型适配性、内存容量和实际应用延迟仍是独立考量。

交错行减少了计算之间的工作量

该实现的核心做法是在应用门控操作前,将相关结果排列在一起。

Anujj 描述称,gate 行和 up 行以交替的八行块方式加载。这样的排列会将对应数值放入同一线程的工作结果中。该线程随后可在写入最终输出时组合这些数值。

寄存器是分配给执行线程的 GPU 小型存储位置,用于保存这些中间结果。在其中执行组合操作,避免了这部分计算经由中间输出缓冲区进行单独往返。预期节省来自执行组织方式。

该实现保留一种累加器排列,而不是为 gate 投影引入第二个累加器 tile。累加器在乘法过程中保存部分和。Tile 是一组共同处理的矩阵元素块。

这一设计选择使该实现区别于较早的融合提案。根据贡献者的描述,较新的方法采纳了 am17an 的建议。两项提案都针对相关操作,但它们以不同方式组织计算。

这种差别关乎实际效果,而非表面形式。保存更多中间状态可能增加 GPU 有限执行资源的压力。只有当节省的收益超过额外调度或存储成本时,合并操作才有帮助。

这正是“更少的 kernel”并不自动等于“更快的推理”的原因。在某些条件下,更大的组合操作可能会降低硬件利用效率。一项优化必须保留足够的并行工作,同时避免引入抵消其收益的新约束。

已合并代码通过资格检查体现了这一考量。它会评估工作负载是否适合该融合路径。仅支持相关数学操作,并不能保证融合就应当运行。

该实现还要与 stream-k 竞争,后者是一种沿矩阵乘法归约维度划分工作的调度方法。融合路径无法使用这种分解方式。因此,它需要另一种方式来判断其 tile 排列是否能提供足够的效率。

Johannes Gaessler 在审查期间提出了这一问题,要求预先比较预期的分块效率与 stream-k。已合并代码在选择融合路径前加入了效率决策。这使条件执行成为设计的一部分。

融合调度审查提供了审视该优化时最有价值的怀疑视角。它关注看似有吸引力的简化在哪些情况下可能损失性能。这是一项技术限制,而非对基准测试是否存在的异议。

因此,这里的主要竞争仍发生在运行时内部。对于符合条件的操作形状,融合执行必须胜过现有调度方式。这些结果没有表明其在另一推理框架面前取得了更广泛的胜利。

这一机制也阐明了用户对 llama.cpp CUDA 融合应有的预期。它重新组织了现有计算的工作方式。它不会提升模型的推理能力、扩展其训练知识,也不会消除无关的内存限制。

同一模型仍执行相同的一般任务。工程上的机会在于,以更少时间得到特定序列的输出。

更快的提示词处理只改变等待时间的一部分

该基准测试测量的是输入处理,因此其实际价值取决于输入处理在真实请求中所占的比例。

报告中的命令处理一个包含 16,384 个 token 的提示词,并请求生成零个 token。Token 是模型消耗和生成的文本单位。这一设置隔离了提示词吞吐量,而非测量完整的对话回答。

该命令使用 2,048 的批处理和微批处理大小。微批处理是从较大批次中划分出的较小执行单元。它还启用了 Flash Attention,这是一种旨在减少注意力计算期间内存流量的注意力实现。

作者为键值缓存指定了半精度存储;该缓存保存此前已处理 token 的注意力信息。命令中出现了五次重复执行。这些设置界定了测试条件,引用任何结果时都应一并说明。

该项目的基准测试方法将提示处理与 token 生成区分开来。要解读这些数字,这一区分至关重要。每秒输入 token 数和每秒输出 token 数回答的是不同的性能问题。

设想一名开发者要求本地模型检查一个大型源文件。处理这部分输入可能会显著增加答案开始前的延迟。更快的适用预填充路径能够改善交互中的这一环节。

简短的对话则代表另一类工作负载。与生成较长回答所花费的时间相比,其提示所需处理量可能相对较少。因此,同样的输入吞吐提升对总等待时间的影响会更小。

缓存提示又带来了另一层区别。提示缓存会复用系统此前已经处理过的输入计算结果。当应用成功复用这些计算时,留给这项优化加速的新输入就会减少。

文档分析还包含推理之外的工作。应用可能需要检索文件、提取文本、对段落排序,或在向模型发送内容前准备指令。更快的模型输入处理并不意味着这些周边阶段也会更快完成。

对于维护可搜索知识库的团队而言,这一区分有助于作出更好的性能决策。检索质量和上下文选择决定哪些内容会送达模型。运行时吞吐量决定符合条件的计算能以多快速度处理这些内容。

这种区别也对应用维护者提出了要求。他们需要了解产品所采用的运行时,以及其常见工作负载是否会进入优化路径。一条泛泛而谈的本地 AI 加速发布说明无法回答这些问题。

有用的应对方式是在应用边界进行测量。首个 token 时间衡量输出开始前的延迟。总响应时间衡量整个交互过程,而生成吞吐量衡量输出开始后的生成速度。

运行时更新后,各项指标可能以不同方式变化。预填充优化可以缩短初始等待时间,却不改变后续文本的生成速率。将这些结果分别报告,能让用户更准确地了解升级带来的影响。

对于 llama.cpp 的提示处理,最适合的场景仍是在符合条件的配置上处理新鲜且规模可观的输入。作者的基准测试有意强调这一工作负载。将其结果扩展到每一次聊天会话,便超出了现有证据的范围。

支持格式和正确性检查界定了边界

合并后的代码包含重要限制,作者的正确性报告也应在其声明的测试覆盖范围内解读。

该拉取请求描述了对 NVIDIA Turing 或更新架构上的 Q4_K、Q5_K、Q6_K、Q8_0 和 IQ4_XS 权重类型的支持。这些是受支持的权重系列。模型文件可以混合使用不同类型,因此文件的整体标签无法描述其中每个内部张量。

该实现还会检查相关 gate 和 up 权重是否满足融合所需条件。形状、类型和布局都很重要,因为组合操作要求相应的计算彼此匹配。不受支持的排列应保留其他执行路径。

合并后的代码排除了需要其行边界回退机制的情况。回退机制用于处理无法整齐填满常规处理块的形状。这一限制很重要,因为原始说明提到开发期间的测试覆盖了边界情况。

因此,读者应区分开篇的测试摘要与最终代码的选择规则。对更广泛的开发中实现进行测试,并不能证明每一种已测试形状在合并版本中仍符合条件。最终的保护条件决定实际执行情况。

操作参数同样存在限制。代码会在选择融合前检查特定的激活设置。这些检查避免运行时将表面相似的操作视为可以互换,而它们所需行为实际上并不相同。

该范围还聚焦于稠密前馈操作。混合专家模型会将 token 路由至选定子网络,因此引入了不同的执行要求。审查明确指出仍需要额外支持工作,而非证明这些模型已获得普遍覆盖。

其他硬件后端不会仅因支持 llama.cpp 就获得这项优化。贡献者明确将此次改动与其他后端区分开来。因此,NVIDIA 硬件上的结果无法证明 Apple GPU 或 AMD 配置也能获得等效收益。

正确性证据令人鼓舞,但仍属作者自行报告。Anujj 表示,完整的后端操作测试套件在 GB10 上通过。报告还称,矩阵乘法测试套件在 RTX 5090 上通过。

贡献者还报告称,在指定测试中启用和禁用融合时,困惑度结果完全一致。困惑度衡量模型预测评估文本的能力。它提供了有用的数值检查,但并不代表所有可能的应用行为。

这一结果支持的结论比“输出在任何情况下完全一致”更有限。在既定评估中获得相同分数,并不能证明所有提示、设置或平台下生成的回答都完全相同。更广泛的验证需要更广泛的证据。

在本报告审阅的来源中,llama.cpp 融合基准测试也缺乏独立复现。上游审查和合并表明项目接受了这段代码,但不会将贡献者的测量结果变成外部性能审计。

这些边界都不会抹去报告中的收益。它们界定了这一主张在哪些场景下才真正有用。拥有匹配硬件和模型类型的读者有具体理由进行测试,而其他配置则需要单独的证据。

最有力的解读应兼顾两方面。这项改动具有清晰的机制和已发布的测量结果,同时也明确规定了其运行条件。

三个信号将显示这项改进能传播得多广

接下来的证据应将上游代码、可复现测量结果以及用户实际感受到的延迟联系起来。

第一个信号是下游采用情况。未来几个月中,应用发布和打包构建应能表明哪些产品纳入了合并后的实现。这很重要,因为用户往往通过其他应用与 llama.cpp 交互。

该项目的CUDA 构建说明描述了上游编译路径。打包发行版可能遵循不同的发布节奏。与所含源代码关联的版本标识,比泛称使用最新后端更具信息价值。

如果被广泛使用的应用纳入这一改动,短期内的采用前景将更强。如果它们仍停留在较旧修订版本,合并带来的实际覆盖范围仍然有限。这一结果关乎分发时机,并不否定底层优化本身。

第二个信号是在明确设置下进行独立复现。有价值的报告应说明硬件、模型文件、运行时修订版本和基准测试参数。它们还应区分新鲜提示处理、缓存输入和生成输出。

跨不同提示长度的复现将有助于澄清收益对工作负载规模的敏感程度。跨受支持 GPU 世代的报告将检验这种趋势是否能延续到所列设备之外。显示性能回退的结果则有助于识别选择逻辑的局限性。

关键问题并不是每次运行是否都能达到标题所称的最高值。而是可比工作负载是否能在可接受的波动范围内表现出可重复的改进。较小但稳定的收益仍可能具有实际运营价值。

第三个信号是应用延迟。团队应测量在代表性请求上,更新后的运行时是否缩短了答案开始前的等待时间。他们应继续将生成吞吐量和总响应时间作为独立指标保留。

这些证据将把内核改动与用户体验联系起来。在长且未缓存的提示上,较低的初始延迟将支持该实现的实际价值。总响应时间若保持不变,则表明其他阶段主导了所测工作流程。

更广泛的格式或架构支持应视为额外开发工作,而非此次合并已经确立的内容。未来的主张应说明其自身实现和测量结果。目前结果提供的是比较基线,而不是对这些扩展的预先确认。

目前,llama.cpp CUDA 融合为重新评估本地推理性能提供了明确理由。它针对符合条件的前馈计算中的重复工作,并在公开的提示处理条件下报告了可测量的收益。这足以证明评估的合理性,但并不承诺全面的速度提升。

在更新正在运行的部署前,请保存其当前运行时标识符和一组具有代表性的请求。更新后,比较相同的模型文件、提示长度、缓存条件和输出设置。将初始等待时间与答案生成分开记录,并将基准测试参数与每项结果一并保留。对于长文档工作流程,应纳入贴近日常使用的新鲜输入,而不要完全依赖合成吞吐量。对于对话工作负载,应检查较小的输入处理延迟是否足以对体验产生实质影响。然后根据自己的测量结果,决定何时应将上游改进纳入发布计划。更新后的运行时是否缩短了用户实际等待的那部分请求时间?

 
 

免费开始使用

一款本地优先的AI助手

为了获得更好的人工智能体验,

remio 目前仅支持Windows 10+ (x64)和M-Chip Mac 。

你的 AI 工作伙伴

和 remio 一起高效工作

规划、创作、交付

一站式完成

bottom of page