llama.cpp发布b12170:MoE缓存改为LRFU/MQ混合策略并采用ClassLRU
该版本由合并PR #31233 带入,为MoE专家缓存引入受LRFU/MQ启发的混合缓存与ClassLRU,缓存中超过一半的条目按令牌数计量,并随版本提供macOS、Linux、Windows、Android等多平台预编译包。
AI解读:llama.cpp发布b12170,核心变更是moe-cache引入受LRFU/MQ启发的混合缓存,并使用ClassLRU(PR #31233)。
提交记录显示,缓存时钟改为按真实令牌数推进,依赖reshape节点src[0] 的ne[1] 取值作为计数,而非固定为 1。
实现中缓存以类索引c和最近使用时间last_use组织条目,key只计算一次并直接复用,同时从条目年龄(age)计算得分。
提交说明提到类数提高到 8,文档化了衰减公式(extract decayed_crf),并以令牌价值计数显示缓存大小,还加入断言校验计算出的类数与半衰期一致。
该版本随发布提供macOS(arm64/x64)、iOS XCFramework、Linux(x64/arm64/s390x,含CUDA、Vulkan、ROCm、OpenVINO、SYCL等后端)、Android、Windows等预编译包;另注明macOS arm64 KleidiAI与openEuler包为DISABLED状态。
llama.cpp发布b12170版本,主要变更为MoE缓存改用受LRFU/MQ启发的混合缓存并采用ClassLRU,对应PR #31233。
提交记录显示,缓存时钟改为按真实令牌数推进:sel是RESHAPE节点,原始输入位于src[0],因此以sel->src[0]->ne[1] 作为计数。
moe-cache的实现要点
提交说明称,这套缓存使用类索引c与最近使用时间last_use记录条目,key只计算一次并直接复用,不再重复读取;得分由条目年龄(age)计算。
提交记录还提到移除分支并澄清exp2与log2的关系,重写了头部注释并对未使用槽位与排序作出说明。中途曾尝试使用std::array,随后以Revert回退。
- 类数提高到 8,并文档化计算公式
- 抽出decayed_crf,用于计算衰减后的值
- 缓存大小以令牌价值计数显示
- 加入断言,校验计算出的类数与半衰期一致
随版本提供的构建产物
发布页列出了b12170的多平台预编译包,覆盖macOS Apple Silicon(arm64)与Intel(x64)、iOS XCFramework、Linux x64/arm64/s390x(含CUDA 12/13、Vulkan、ROCm 10.0、OpenVINO 2026.4.1、SYCL FP32/FP16等变体)、Android arm64、Windows x64/arm64(含CUDA、Vulkan、OpenVINO、SYCL、ROCm)以及UI包。
发布页标注macOS Apple Silicon的KleidiAI启用包与openEuler相关包为DISABLED。
- Linux侧提供Snapdragon的CPU、Adreno GPU、Hexagon NPU组合包,并附setup guide
- Android侧同样提供Snapdragon组合包与README
- Windows侧含OpenCL Adreno arm64包