0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Arm Neoverse N2平台上提升llama.cpp扩展性能

Arm社区 来源:Arm社区 2026-02-11 10:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:安谋科技 (Arm China) 主任软件工程师 Bolt Liu

跨 NUMA 内存访问可能会限制 llama.cpp 在 Arm Neoverse 平台上的扩展能力。本文将为你详细分析这一问题,并通过引入原型验证补丁来加以解决。测试结果表明,在基于 Neoverse N2 平台的系统上运行 llama3_Q4_0 模型时,该补丁可使文本生成性能提升多达 55%。

跨 NUMA 内存访问问题

在 llama.cpp 中,当线程数超过 NUMA 节点中的核心数时,性能会下降。本示例基于每个 NUMA 节点包含 64 个核心的系统,并使用 llama3_Q4_0 模型进行测试。

be400090-0366-11f1-90a1-92fbcf53809c.png

根本原因分析

当线程跨越多个 NUMA 节点运行时,性能下降主要源于以下两个原因:

ggml_barrier() 函数调用中的跨 NUMA 节点原子操作非常耗时。

MulMat 算子的张量缓冲区存在大量的跨 NUMA 内存访问。

ggml_barrier 问题

在多线程环境下运行 llama.cpp 时,每个线程负责计算张量数据的一部分。在所有线程完成计算后,会使用 barrier 来确保数据同步。随着线程数的增加,性能会下降;当线程数超过 NUMA 节点(每个节点 64 个核心)时,性能下降现象愈发明显。

bebeb85e-0366-11f1-90a1-92fbcf53809c.png

MulMat 算子问题

llama.cpp 中的 MulMat 算子是主要的性能瓶颈。理论上,增加线程数应该可以提高性能,但实际情况并非如此。原因在于张量缓冲区是通过 malloc() 分配的,而 malloc() 不具有 NUMA 感知能力,会导致大量的跨 NUMA 内存访问。

bf29b9a6-0366-11f1-90a1-92fbcf53809c.png

优化方法

为缓解上述的跨 NUMA 问题,本文采用了两种优化方法:ggml_barrier 优化,以及 MulMat 算子优化。

ggml_barrier 优化

此优化方案采用“分而治之”的思想对 ggml_barrier 进行优化:

使用 NUMA 局部原子变量来实现 barrier,速度很快。

仅由特定的 NUMA 节点中的最后一个完成张量计算的线程与其他 NUMA 节点的最后一个线程进行跨 NUMA 同步。

通过这种方式,执行跨 NUMA 全局原子操作的线程数减少到与所涉及的 NUMA 节点数相当。

bf92ee76-0366-11f1-90a1-92fbcf53809c.png

ggml_barrier 经优化后,即使存在跨 NUMA 操作,性能也不会明显下降。

bff7fdac-0366-11f1-90a1-92fbcf53809c.png

MulMat 算子优化

MulMat 算子在计算过程中,会使用三个张量缓冲区:dst(例如 attn_out、ffn_gate、ffn_out、ffn_up、Kcur、Qcur、Vcur、FP32)、src0(权重)和 src1(例如 attn_norm、ffn_gate_par、ffn_norm、kqv_out FP32)。此优化方案将缓冲区分割成多个片段,以便计算线程尽可能从本地 NUMA 节点访问内存。

对于 dst 和 src0 缓冲区,每个线程根据线程 ID 访问缓冲区的一部分。通过将缓冲区分割成 N 个片段(其中 N 为 NUMA 节点数),在满足以下条件时,每个线程可以访问本地 NUMA 节点中的缓冲区部分:

线程 ID 与物理核心 ID 有良好的对应关系,可通过线程亲和性进行设置。

缓冲区片段被移动到所需的 NUMA 节点,这可通过 move_pages() 系统调用来实现。

c0635264-0366-11f1-90a1-92fbcf53809c.png

MulMat 算子在计算期间,src1 被量化并存储在另一个名为 wdata 的缓冲区中。MulMat 算子的计算公式如下:dst = src0 * wdata

当每个线程根据线程 ID 访问 src0 和 dst 时,wdata 缓冲区需要被这些线程全部访问。

鉴于量化过程并非 MulMat 算子的主要性能瓶颈,此优化方案为每个 NUMA 节点分别创建一个局部的 wdata 缓冲区,各 NUMA 节点中的所有线程将 src1 量化至其自有的 wdata,因而总共有 N 个 wdata 副本(N 为 NUMA 节点数)。

c0c93d40-0366-11f1-90a1-92fbcf53809c.png

优化 MulMat 算子计算的张量数据布局后,可以看到性能有了明显的提升。

c12f7eac-0366-11f1-90a1-92fbcf53809c.png

总体性能比较

llama.cpp 的批处理基准测试结果如下:

NUMA 经优化后,性能有了明显的提升。

在 S_TG t/s 指标上,基准版本的最佳值为 26.52,线程数为 32;启用 NUMA 优化后,最佳值为 41.15,线程数为 40,性能提升 55%。

在 S t/s 指标上,基准版本的最佳值为 48.73,线程数为 36;启用 NUMA 优化后,最佳值为 74.67,线程数为 54,性能提升 53.2%。

c1922020-0366-11f1-90a1-92fbcf53809c.png

本示例使用双 NUMA 节点系统,NUMA 优化前后的内存带宽数据(如下表所示)表明:优化后,各 NUMA 节点的带宽保持均衡;而优化前,瓶颈会出现在 NUMA 节点 0 中。

c1f88ad6-0366-11f1-90a1-92fbcf53809c.png

各位开发者,欢迎获取 GitHub 上的 NUMA 优化补丁:

https://github.com/ggml-org/llama.cpp/pull/14232

* 本文为 Arm 原创文章,转载请留言联系获得授权并注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3235

    浏览量

    76520
  • 模型
    +关注

    关注

    1

    文章

    3826

    浏览量

    52276
  • Neoverse
    +关注

    关注

    0

    文章

    17

    浏览量

    5003

原文标题:破解跨 NUMA 性能问题,在 Arm Neoverse N2 上提升 llama.cpp 扩展性能

文章出处:【微信号:Arm社区,微信公众号:Arm社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    llama.cpp代码结构&调用流程分析

    llama.cpp 的代码结构比较直观,如下所示,为整体代码结构中的比较核心的部分的代码结构
    的头像 发表于 11-07 09:23 5231次阅读
    <b class='flag-5'>llama.cpp</b>代码结构&amp;调用流程分析

    利用Arm i8mm指令优化llama.cpp

    本文将为你介绍如何利用 Arm i8mm 指令,具体来说,是通过带符号 8 位整数矩阵乘加指令 smmla,来优化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。
    的头像 发表于 07-24 09:51 2202次阅读
    利用<b class='flag-5'>Arm</b> i8mm指令优化<b class='flag-5'>llama.cpp</b>

    Arm Neoverse家族新增V1和N2两大平台,突破高性能计算瓶颈

    带来 50%和 40%的性能提升。此外,Arm也同时发布了CMN-700,作为构建基于Neoverse V1和 N2
    的头像 发表于 04-30 16:20 1.1w次阅读

    【飞腾派4G版免费试用】仙女姐姐的嵌入式实验室之五~LLaMA.cpp及3B“小模型”OpenBuddy-StableLM-3B

    目使用了C++重写了LLaMA模型,使其能够在硬件较弱的设备使用CPU运行LLaMA模型,不需要较高的显卡性能 获取LLaMA.cpp
    发表于 12-22 10:18

    ARM Neoverse IP的AWS实例etcd分布式键对值存储性能提升

    1、基于ARM Neoverse IP的AWS实例etcd性能提升etcd是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供给
    发表于 07-06 17:37

    ARM Neoverse N2 PMU指南

    参考ENEPERN2号更详尽的描述。 关于NEPERVERT N2号技术参考手册, 请参考Armé EVERTM N2 技术参考手册。本文件不讨论使用软件开发工具或
    发表于 08-09 06:07

    Arm NeoverseN2核心加密扩展技术参考手册

    NeoverseN2核心支持可选的ARM®v8.0-A和ARM®v8.2-A加密扩展ARM
    发表于 08-17 07:08

    ARM NeoverseN2核心技术参考手册

    NeoverseN2内核是一款高性能、低功耗的产品,采用ARM®v9.0-A架构。 此实施支持所有以前的ARMv8-A架构实施,包括ARM
    发表于 08-29 08:12

    互联网巨头纷纷启用Arm CPU架构,Arm最新Neoverse V1和N2平台加速云服务器芯片自研

    电子发烧友网报道(文/黄晶晶)Arm在2018年10月宣布了Neoverse的路线图,继2019年Neoverse N1平台发布后,今年9月
    发表于 09-30 14:46 1753次阅读

    新思科技携手Arm提升高性能计算、数据中心和AI SoC性能加快上市时间

    Arm与新思科技扩展在EDA平台、IP和参考流程方面的战略协议,旨在为Arm下一代Neoverse V1和
    发表于 05-07 10:06 1661次阅读

    Arm 更新 Neoverse 产品路线图,实现基于 Arm 平台的人工智能基础设施

    Neoverse CSS 产品;与 CSS N2 相比,其单芯片性能可提高 50% Arm Neoverse CSS
    发表于 02-22 11:41 996次阅读

    Arm发布新一代Neoverse数据中心计算平台,AI负载性能显著提升

    据公开信息显示,Arm去年推出的Neoverse CSS运算子系统提供了包含处理器设计的预验证平台,加快了定制SoC上市进程,首发型号为Neoverse CSS
    的头像 发表于 02-22 14:48 1599次阅读

    ArmArm Neoverse计算子系统(CSS):Arm Neoverse CSS V3和Arm Neoverse CSS N3

    Neoverse CSS N3代表了Arm计算子系统产品组合的最新进展。 Neoverse CSS V3是高性能V系列产品组合的首款产品,
    的头像 发表于 04-24 17:53 3142次阅读
    <b class='flag-5'>Arm</b>新<b class='flag-5'>Arm</b> <b class='flag-5'>Neoverse</b>计算子系统(CSS):<b class='flag-5'>Arm</b> <b class='flag-5'>Neoverse</b> CSS V3和<b class='flag-5'>Arm</b> <b class='flag-5'>Neoverse</b> CSS <b class='flag-5'>N</b>3

    何在基于Arm Neoverse平台的CPU构建分布式Kubernetes集群

    在本文中,我们将以 X(原 Twitter)为例,演示如何在基于 Arm Neoverse 平台的 CPU 构建分布式 Kubernete
    的头像 发表于 03-25 15:58 919次阅读
    如<b class='flag-5'>何在</b>基于<b class='flag-5'>Arm</b> <b class='flag-5'>Neoverse</b><b class='flag-5'>平台</b>的CPU<b class='flag-5'>上</b>构建分布式Kubernetes集群

    Arm Neoverse N2平台实现DeepSeek-R1满血版部署

    颇具优势。Arm 携手合作伙伴,在 Arm Neoverse N2 平台上使用开源推理框架 llama.
    的头像 发表于 07-03 14:37 1434次阅读
    <b class='flag-5'>Arm</b> <b class='flag-5'>Neoverse</b> <b class='flag-5'>N2</b><b class='flag-5'>平台</b>实现DeepSeek-R1满血版部署