llama.cpp 项目发布了版本 b10321,其中包含对 Metal 上 GGML_OP_NORM 和 GGML_OP_RMS_NORM 操作的关键修复。此次更新解决了由于丢弃的部分求和导致线程组大小留下部分 SIMD 组时,均值和方差计算不正确的问题。

  • 当行长度不是 SIMD 组大小的倍数时发生此错误,导致在跨 SIMD 组归约期间忽略了最后一个通道的贡献。
  • 该修复将线程组大小向上舍入到最接近的完整 SIMD 组数量,确保所有部分求和都能正确聚合,而不会产生过多的空闲通道。
  • M3 Pro 上的测试结果显示,NORM 和 RMS_NORM 测试分别通过 50/50 和 51/51,而之前的失败结果为 25/50 和 26/51。
  • 该版本提供了适用于 macOS(Apple Silicon 和 Intel)、iOS、Linux(CPU、Vulkan、ROCm、OpenVINO、SYCL)、Android、Windows(CPU、CUDA、Vulkan、OpenCL、ROCm、OpenVINO、SYCL、HIP)和 openEuler 的二进制文件。

此更新确保了在非标准向量长度上规范操作的数值正确性,这对于使用不能被向量化因子整除的通道维度的模型至关重要。