llama.cpp b10751发布:CUDA端融合MoE加权专家归约,减少显存中间流量
llama.cpp发布b10751版本,核心改动是在CUDA后端将MoE组合尾部的加权专家输出写入全局内存再归约的过程,融合为单个加权归约内核,以降低显存带宽开销。
AI解读:在混合专家(MoE)模型推理中,多个专家子网络的结果需要按路由权重合并。llama.cpp之前的实现是先把每个专家的加权输出写回显存,再读取进行归约求和,这中间的全局内存读写是主要性能瓶颈。b10751在CUDA后端识别出完整的“加权 + 有序归约”计算子图,把它替换为一个融合内核,一次完成乘法和累加,省掉了中间那次显存写入与读取。对使用CUDA且叠加了多个专家(k在 2 到 15 之间)的MoE模型推理,这能直接降低内存带宽压力,可能减少延迟。需要留意的是,融合后的浮点运算顺序与原来略有不同,结果不一定逐位一致;官方也没有给出具体的加速百分比。普通用户如果运行的是未修改的llama.cpp且模型在CUDA上,升级到b10751后大多数场景自动受益,无需手动配置;若想保留旧行为,可设环境变量GGML_CUDA_MOE_WEIGHTED_REDUCTION=0 关闭融合。对于自己编译并有特殊数值要求的开发者,建议先跑一遍测试集确认输出差异可接受。
llama.cpp发布b10751版本,核心改动是在CUDA后端将MoE(混合专家)组合尾部的加权专家输出归约过程融合为单个内核,以减少中间显存流量。
该版本对应合并请求 #25952,改动说明指出:此前MoE组合尾部会将加权后的专家输出先写入全局内存,再从内存读取进行归约,这部分中间显存流量是主要开销。原有基线通常运行两个物理融合内核,新的路径只运行一个。
新实现会在计算图中匹配“专家加权 + 有序归约”的完整子图,替换为一个加权归约内核。支持两种形态:无缩放(experts * router_weights)和有缩放((experts * expert_scale) * router_weights)。
k(激活的专家数)在 2 到 15 之间时由单个运行时可变k的内核处理。匹配是结构性的:依据操作顺序、形状、步长、专家视图以及从左到右的ADD链来识别;融合内核保持原有的归约顺序。
改动说明未声称结果逐位一致:CUDA FP32的收缩运算可能引起微小的舍入差异。分配器通过图优化API的add_alloc_dep集成,保证experts、router weights及可选的expert scale在融合目标写入前保持存活,并在内核运行前重新检查内存范围。
对于未能识别或存在安全风险的图,会保留原有的逐算子路径。可通过设置环境变量GGML_CUDA_MOE_WEIGHTED_REDUCTION=0 禁用该融合。测试覆盖了缩放/无缩放、对齐/非对齐以及k=2..15 的代表性取值,并包含一个k=16 用例(该用例必须走逐算子路径)。