llama.cpp 发布了新版本,提高了将计算分配给多个专家的人工智能模型的 GPU 处理效率。运行这类模型的开发者可以获得任务布局改进,以及半精度运算性能下降问题的修复。

1. 按分块重新安排各专家的任务

此次变更让辅助运算在 CUDA 执行混合专家模型的矩阵乘法,即对按行列排列的数进行相乘的运算时,预先分配称为分块的小型计算任务。相比仅传递各专家计算范围的方式,这减少了主运算负责的分块数量和额外工作,也使专家间的任务分配更灵活。

2. 中型混合专家模型的实测吞吐量

据变更提案(PR)作者介绍,数据布局调整本身带来的性能提升为 2~4%,其余收益来自使用更小的分块减少无效计算。此前仅用于部分图形处理器的小分块偏好优化,也扩展到了更多 GPU。

以下是 PR 作者公布的部分中型模型测量值。模型为 gemma4 26B.A4B,量化方式为 Q4_0;量化即降低模型数值精度的过程。

在处理 8192 个提示词元的测试中,微批次大小设为 64,即每次分批处理的规模为 64。表格对比了原有 master 与修改版 bea596f39,展示各 GPU 相对自身基准值的变化。

表:各 GPU 的中型混合专家模型吞吐量

条件:gemma4 26B.A4B Q4_0,pp8192,微批次 64,master 与 bea596f39 对比(PR 基准测试表)

单位:吞吐量为每秒词元数(t/s),加速比为倍

各 GPU 的中型混合专家模型吞吐量变化MI60 / MI50: 加速比 1.43; MI100: 加速比 1.26; P40: 加速比 1.40; RTX 3090: 加速比 1.21; RTX 4090: 加速比 1.03; RTX 5090: 加速比 1.04; RX 6800: 加速比 1.47; RX 9060 XT: 加速比 1.02; Strix Halo: 加速比 1.03; V100-PCIE-32GB: 加速比 1.00MI60 / MI501.43MI1001.26P401.40RTX 30901.21RTX 40901.03RTX 50901.04RX 68001.47RX 9060 XT1.02Strix Halo1.03V100-PCIE-32GB1.00
各 GPU 的中型混合专家模型吞吐量变化
中型混合专家模型的实测吞吐量
GPUmasterbea596f39加速比
MI60 / MI50453.58649.181.43
MI100765.78962.421.26
P40428.34600.661.40
RTX 30901611.881950.451.21
RTX 40903785.173906.791.03
RTX 50904690.154870.641.04
RX 6800408.49601.581.47
RX 9060 XT920.30936.631.02
Strix Halo631.28647.921.03
V100-PCIE-32GB625.76625.111.00

在相同模型和设置下,RX 6800 达到原有吞吐量的 1.47倍,MI60 / MI50 为 1.43倍。表中其他设备也有变化较小的情况,表明该优化的效果因硬件而异。

3. 通过跳过空任务修复 F16 性能下降

PR 评审中有人报告半精度(F16)运算性能下降,提出的修复方案是立即结束未分配到列的专家的计算任务。变更代码如下。

    const int expert_end   = ts.col_high;
    const int ncols_expert = expert_end - expert_start;

    if (ncols_expert == 0) {
        return;
    }

    GGML_UNUSED(channel_ratio);

以下是小型混合专家模型出现性能下降时的测量值,相对原有版本的倍率低于 1。

表:F16 修复前的吞吐量下降案例

条件:granitemoe 3B.A800M F16,pp8192,微批次 32,master 与 bea596f39 对比(PR 基准测试表)

单位:吞吐量为每秒词元数(t/s),加速比为倍

F16 修复前相对基准的吞吐量倍率RTX 3090: 加速比 0.80; RTX 4090: 加速比 0.84RTX 30900.80RTX 40900.84
F16 修复前相对基准的吞吐量倍率
通过跳过空任务修复 F16 性能下降
GPUmasterbea596f39加速比
RTX 30902655.922111.880.80
RTX 40903686.063096.570.84

跳过空任务的修复是在对比版本 bea596f39 之后加入的,因此该表展示的是修复前的结果。PR 作者解释,Granite 3.0 是否执行后续校正运算(fixup kernel)对总耗时影响很大,导致测量值波动较大。

4. 需要同时考虑收益与成本

小分块能根据计算范围更细致地分配任务,减少浪费。相应地,预先计算并存储新布局信息的工作转移到了辅助运算中。变更后的代码也从存储各专家计算范围,改为分配临时内存来存储各分块的信息。

在不将计算分配给专家、无需专家分支的稠密模型验证测试中,变化较小。PR 中 llama 8B Q4_0 模型的 pp1024 测试,相对原有版本的倍率为 0.99~1.03。

此次改进侧重于减少混合专家模型的无效计算,而非普遍提高稠密模型的速度。b12144 发布说明在 CUDA 变更之外,也列入了半精度性能下降问题的修复。

b12144 改进了混合专家模型的 CUDA 处理,并修复了 F16 性能回退,实际性能表现应结合 GPU 和模型条件判断。