NUMA 架构对 AI 服务器性能有什么影响,CPU、内存和 GPU 应该怎样合理连接
随着大语言模型、生成式AI和高性能计算应用不断扩大,AI服务器对内存带宽、GPU通信以及数据访问效率提出了更高要求。在多CPU、多GPU服务器中,单纯增加处理器和GPU数量并不意味着性能一定能够同步提升。CPU、内存、GPU以及高速网络设备之间如何连接,同样会直接影响实际运行效率。
NUMA,也就是非统一内存访问,是现代多路服务器中非常重要的一种硬件架构。理解NUMA的关键,不在于简单比较某一种内存的理论带宽,而在于理解CPU、内存和PCIe设备之间的物理拓扑,以及应用程序是否能够尽量让计算任务访问距离最近的资源。
NUMA首先解决的是什么问题
在传统的对称多处理器系统中,多个CPU可以共享系统内存。随着CPU核心数量不断增加,如果所有处理器都通过同一套内存资源进行访问,内存带宽和扩展能力就容易成为瓶颈。
NUMA架构则将系统划分为多个内存节点。一个CPU插槽通常拥有自己的内存控制器以及与之连接的本地内存。对于某个CPU核心,访问本地内存通常具有更低的延迟;如果访问另一个CPU插槽所连接的内存,则需要通过处理器之间的互联链路进行访问,因此会产生额外的延迟和带宽开销。
这意味着,在NUMA服务器中,“内存在哪里”与“哪个CPU在使用”变得同样重要。
如果一个计算任务长期运行在CPU插槽0,而它需要处理的数据主要位于CPU插槽1对应的内存节点,那么即使服务器拥有充足的总内存容量,也可能因为大量远端内存访问而损失性能。
因此,NUMA优化的核心并不是简单地让系统使用更多内存,而是尽可能建立计算资源与数据之间合理的拓扑关系。
GPU服务器中的NUMA问题更加复杂
AI服务器通常配备多块GPU,同时还需要高速网络接口、NVMe存储设备等外围设备。这些设备并不是完全独立存在的,而是通过PCIe等高速互联结构连接到CPU和系统内存。
例如,一台双路CPU服务器中,CPU Socket 0和CPU Socket 1可能分别连接不同的内存节点以及部分PCIe设备。某些GPU连接在CPU Socket 0对应的PCIe Root Complex上,而另外一些GPU则连接到CPU Socket 1。
这种拓扑关系会影响GPU访问主机内存时的数据路径。
如果GPU所需要的数据位于与其PCIe连接关系更接近的NUMA节点,通常能够减少跨CPU节点访问带来的额外开销。反过来,如果GPU频繁访问另一个CPU节点上的内存,就可能产生更多的数据传输开销。
因此,在多GPU服务器中,不能只看GPU数量和显存容量,还需要查看GPU与CPU、内存以及网络设备之间的实际拓扑关系。
Linux系统可以通过相关工具查看NUMA节点和设备拓扑,NVIDIA GPU服务器也可以通过GPU拓扑信息判断不同GPU之间、GPU与CPU之间以及GPU与网络设备之间的连接关系。
PCIe和NVLink承担的任务并不相同
讨论AI服务器的硬件连接时,一个常见错误是把PCIe和NVLink混为一谈。
PCIe是服务器中连接CPU与GPU、网卡、NVMe等设备的重要高速总线。GPU通常通过PCIe连接到服务器的CPU和I/O体系,因此PCIe拓扑会影响GPU访问主机资源以及与其他设备进行数据交换的效率。
NVLink则主要用于GPU之间的高速通信。在支持NVLink的GPU服务器中,多块GPU可以通过高速GPU互联交换数据,从而减少部分传统PCIe路径上的通信限制。
不同GPU架构使用的NVLink代际不同,因此不能把某一个型号的NVLink带宽数字套用到所有GPU上。例如,NVIDIA A100和H100所采用的NVLink代际不同,其通信能力也不同。讨论具体带宽时,应明确GPU型号和互联架构,而不能简单写成“NVLink就是多少GB/s”。
此外,一些较新的CPU-GPU融合架构采用NVLink-C2C等高速互联技术,其设计与传统PCIe连接的CPU和GPU服务器并不相同。因此,在介绍AI服务器时,必须明确具体硬件架构。
NUMA优化不仅是硬件问题
服务器完成物理安装以后,操作系统和应用软件如何使用这些资源同样重要。
Linux提供了NUMA相关的内存和CPU亲和性机制,可以让进程、线程以及内存分配尽量靠近指定的CPU节点。对于需要大量CPU参与数据预处理的AI任务,这种绑定尤其重要。
例如,数据预处理线程运行在CPU Socket 0,而程序却频繁从Socket 1对应的内存节点读取数据,就可能造成额外的远端访问。通过合理设置CPU affinity和memory affinity,可以减少这种情况。
在容器化环境中,NUMA拓扑同样需要考虑。Kubernetes提供Topology Manager等机制,可以帮助工作负载根据CPU、内存以及其他设备的拓扑关系进行资源分配。对于大型AI服务器,如果CPU核心、内存和GPU没有合理对齐,即使资源总量充足,也可能出现部分硬件利用率不高的问题。
AI训练中的重点是减少不必要的数据移动
对于大模型训练,NUMA优化不能孤立考虑。
训练过程中涉及CPU数据预处理、GPU计算、GPU之间的数据交换,以及GPU与存储和网络设备之间的数据传输。真正影响性能的往往不是某一个部件的理论最高带宽,而是整个数据流是否合理。
例如,在多GPU训练中,如果GPU之间需要频繁同步梯度和模型状态,那么GPU之间的通信效率就非常重要。NCCL等通信库会根据硬件拓扑选择合适的通信路径,服务器的GPU连接方式、PCIe结构以及GPU之间是否存在高速互联,都会影响通信效率。
如果训练数据主要存储在主机内存中,那么CPU与GPU之间的数据传输也需要合理安排。通过减少不必要的数据复制、合理设置数据预取以及保持CPU和GPU之间的拓扑亲和性,可以降低数据搬运带来的额外开销。
对于分布式训练,则还需要进一步考虑GPU与高速网络接口之间的拓扑关系。如果GPU距离网络接口较远,数据可能需要经过额外的PCIe或CPU路径。因此,在大型AI集群中,GPU、NIC和CPU之间的拓扑同样是服务器设计的重要因素。
如何进行NUMA优化
实际部署AI服务器时,第一步应该是了解服务器本身的拓扑,而不是直接修改系统参数。
首先需要确认每个CPU Socket对应哪些内存节点、PCIe Root Complex以及GPU。然后检查GPU之间是否存在NVLink或其他高速互联,同时确认高速网卡连接在哪个CPU和PCIe节点上。
其次,应尽量保持CPU核心、内存和GPU之间的亲和关系。例如,让负责某块GPU数据处理的CPU线程尽量运行在与该GPU关系较近的CPU节点上,同时让相关内存分配优先发生在对应NUMA节点。
对于Kubernetes等容器环境,则可以进一步利用NUMA-aware资源管理机制,让需要GPU和大量CPU资源的工作负载获得更加合理的资源组合。
最后必须通过实际基准测试验证优化结果。NUMA优化没有适用于所有服务器和所有AI任务的固定参数。同一种设置在一个模型上可能有效,在另一个模型上却未必能够带来明显改善。
因此,AI服务器的NUMA优化,本质上是一个从硬件拓扑一直延伸到操作系统、通信库和应用程序的数据路径优化问题。
对于多CPU、多GPU服务器,真正值得关注的不是某一个设备宣传的理论峰值,而是CPU、内存、GPU、网络和存储之间能否形成高效的数据流。只有硬件拓扑与软件调度相互配合,NUMA架构才能真正成为AI服务器性能扩展的基础,而不是新的性能瓶颈。
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
分享 Facebook | X | WhatsApp | LinkedIn
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP