利用MIG与NUMA节点本地化加速GPU数据处理 使用NVIDIA多实例GPU与NUMA节点本地化加速数据处理NVIDIA Ampere、NVIDIA Hopper和NVIDIA Blackwell系列旗舰级数据中心GPU都具有非一致性内存访问特性但对外呈现单一内存空间。因此大多数程序并不会受到内存非一致性问题的影响。然而随着新一代GPU带宽的增加考虑计算和数据的局部性可以带来显著的性能和功耗收益。本文首先分析了NVIDIA GPU的内存层级结构探讨了通过芯片间链路进行数据传输对功耗和性能的影响。接着介绍了如何使用NVIDIA多实例GPU模式实现数据本地化。最后以Wilson-Dslash模板算子为例展示了运行MIG模式与未进行本地化处理的结果对比。NVIDIA GPU中的内存层级结构考虑图1所示包含两个NUMA节点的抽象内存层级结构视图。当节点0上的流多处理器需要访问节点1的DRAM中的内存位置时必须通过L2结构传输数据。以NVIDIA Blackwell GPU为例每个NUMA节点都是一个独立的物理芯片这会增加延迟并提高数据传输所需的功耗。尽管增加了复杂性但对NUMA无感知的代码仍然可以达到峰值DRAM带宽。图1. 跨两个NUMA节点的GPU内存层级结构抽象视图为了解决这些缺点最小化NUMA节点间的数据传输是有益的。当向用户呈现单一内存空间时NVIDIA架构在L2中采用一致性缓存来减少NUMA节点间的数据传输。这种机制有助于防止重复访问同一内存地址时需要从L2结构接口重新获取数据。理想情况下一旦地址被获取到本地L2缓存中后续对该地址的所有访问都将命中缓存。在引入一致性缓存之前统一的L2缓存允许所有SM达到峰值带宽如NVIDIA Volta尽管延迟会根据SM与不同L2分段的距离而变化。从NVIDIA Ampere代开始更大的芯片引入了NUMA节点层级每个节点都有自己的L2缓存并与其他节点通过一致性连接。自NVIDIA Ampere架构以来大型数据中心GPU都采用了这种设计与小型游戏GPU不同正如NVIDIA Blackwell Ultra架构中所述L2结构连接维持了峰值带宽。随着GPU的持续发展出现了两个挑战增加的延迟和功耗限制。增加的延迟访问L2缓存的远端部分导致延迟增加这会显著影响性能尤其是对于同步操作。功耗限制在最大的GPU上当张量核心处于活动状态时功耗成为一个限制因素。通过本地化L2访问来降低功耗可以实现降低L2结构时钟并通过与GPU Boost相关的动态电压频率调整机制提高计算时钟。这样可以显著提高张量核心的性能。MIG减少NUMA节点间的数据传输MIG功能随NVIDIA Ampere架构一同推出支持将单个GPU划分为多个实例。通过使用MIG开发人员可以为每个NUMA节点创建一个GPU实例从而消除了通过L2结构接口的访问。这种方法也带来了一些开销包括使用PCIe在不同GPU实例之间进行通信的开销。下一节将展示运行MIG模式和未本地化内存的工作负载结果以证明这种方法的有效性。使用MIG实现数据本地化MIG支持将兼容的NVIDIA GPU划分为多个隔离的实例每个实例拥有专用的高带宽内存、缓存和计算核心。这可以实现跨多个用户或工作负载的高效、高性能的GPU利用。MIG可以在单个GPU上实现高达7倍的GPU资源利用率。它允许多个虚拟GPU以及虚拟机在单个GPU上并行运行同时提供虚拟GPU所具备的隔离保证。可以利用MIG提供的功能来实现NUMA节点本地化。通过为每个NUMA节点创建一个MIG实例可以确保不同GPU实例之间的隔离。这种方法有助于消除NUMA节点间的通信流量。MIG允许将实际GPU分割成GPU实例在每个GPU实例中可以定义一个或多个计算实例。一个计算实例包含属于某个GPU实例的全部当每个GPU实例只有一个计算实例时或部分SM。为了实现GPU实例内的本地化思路是创建两个映射到每个NUMA节点上的GPU实例。在Blackwell GPU上可以启用MIG模式并列出可用的GPU实例配置文件如图2中的代码所示。由于Blackwell有两个NUMA节点每个芯片一个需要查找具有最多SM且存在两个实例的配置文件。如图2所示这是ID为9的配置文件可以有两个实例。每个实例将拥有89 GB内存和70个SM。使用两个这样的实例将总共只提供70×2140个SM而不是设备上全部的148个SM。此时需要在每个GPU实例中创建一个计算实例。可以使用图3中所示的命令完成。主GPU和GPU实例现在都有自己的标识符哈希码。为两个NUMA节点使用这些标识符MIG 3g.90gb 设备 0: (UUID: MIG-ee2ec0e5-0dda-5591-9ee7-4ae51028b6fa)MIG 3g.90gb 设备 1: (UUID: MIG-2bbb368b-7cb0-53da-b1a4-7ace0652a197)要使用这些设备请将它们添加到CUDA_VISIBLE_DEVICES环境变量中。例如要运行一个双进程MPI作业可以创建一个包装脚本wrapper.sh#!/bin/bashcase$SLURM_PROCIDin0)CUDA_VISIBLE_DEVICESMIG-ee2ec0e5-0dda-5591-9ee7-4ae51028b6fa;;1)CUDA_VISIBLE_DEVICESMIG-2bbb368b-7cb0-53da-b1a4-7ace0652a197;;esac$*然后启动MPI作业$ mpirun-n2./wrapper.sh my_executable最后当所有工作完成后可以关闭MIG模式。图2. 启用MIG模式并列出可用的GPU实例配置文件图3. 为MIG创建计算实例图4. 关闭MIG实例的命令使用MIG进行本地化的优势是什么为了演示使用MIG进行本地化的优势以Wilson-Dslash模板算子为例这是格点量子色动力学的一个关键内核来自QUDA库。该库用于加速多个大型LQCD代码如Chroma和MILC。Dslash内核是对四维环形晶格进行有限差分运算其中每个晶格点的数据根据其八个正交相邻点的值进行更新。此处的四个维度是通常的空间维度X, Y, Z和时间维度T。该内核受限于内存带宽。如果将晶格沿时间轴均匀分解到两个NUMA节点上那么每个域将需要访问另一域在时间维度边界上的晶格点。如图5所示子域边界上的绿色晶格点需要红色晶格点来完成其模板运算。理论上晶格被布置在两个NUMA节点上。绿色点需要红色点来完成模板运算。可能的数据路径是未本地化时的常规内存访问黑色箭头或者在MIG本地化模式下通过主机进行MPI消息传递黑色箭头。图5. MIG模式下Dslash内核的内存访问访问相邻点最便捷的方式是通过共享的L2缓存和互连。然而在MIG模式下运行时此路径需要通过MPI使用PCIe或NVLink在MIG实例之间进行通信。因此与访问连接到MIG实例的主内存相比此路径将更慢。对两个MIG实例之间几乎没有通信需求的工作负载使用MIG模式往往获益更多。相反需要将边界上的黑色点打包并通过MPI发送。此步骤会引入额外的延迟缓冲区打包、发送和解包。虽然通过不使用共享的L2缓存到缓存的互连来节省GPU功耗但通过主机例如PCIe进行传输时仍会消耗功耗。需要在两个进程之间传输的数据量与消息中需要传输的表面点数量有关具体来说与分割方向正交的表面三维体积有关。在此示例中分割始终沿时间方向因此每个NUMA节点理论上最终获得(Ns * Nt)/2个点其中Ns是空间体积中的点数Nt是时间维度的长度。表面积与体积比为Ns / (Ns * Nt / 2) 2/Nt。在问题中考虑Nt64表面体积比保持恒定在1/32 ≈ 3.13%。图6展示了未本地化的情况。全局内存由两个通过内存控制器连接到NUMA节点的内存组成。晶格上的彩色高亮表示数据可能来自本地DRAM也可能通过共享的L2来自远程DRAM。图6. 未本地化情况下的内存访问这可以与未使用MIG的基线情况进行比较。在这种情况下数据和计算都没有本地化其场景更接近图6所示。每个NUMA节点都从其本地内存控制器以及另一个NUMA节点接收数据。事实上只有一个全局晶格图中为两个NUMA节点分开成两部分是人为的。在这种情况下处理一组点集的线程块完全由调度器随意分配给各个NUMA节点。由于数据均匀分布在两个NUMA内存上通过共享L2传输的数据量远多于MIG本地化情况后者仅传输最少需要的表面点。这可能会导致显著的功耗成本。另一方面整个操作可以通过单个内核执行。可以避免为消息传递打包缓冲区和最后累积接收到的面所产生的延迟。对于实验结果我们关注在不同GPU功耗限制瓦特下工作负载执行的速度提升。速度提升是未本地化方法与MIG方法在相同功耗限制下例如均为700 W运行所花费的实际时间的比值。如图7所示在400 W的GPU功耗限制下MIG的性能优于未本地化数据根据工作负载规模不同速度提升最高可达2.25倍。其原因是当GPU在低功耗限制下运行时L2结构接口消耗的功率成为一个限制因素。在MIG模式下由于没有消耗L2结构功率来在NUMA节点间传输数据工作负载可以运行得更快。然而当GPU功耗限制提高时在图7中由灰色、深绿色和黑色线条表示的实验中以及部分绿色线条表示的情况中MIG模式的表现略差。这是因为在更高的功耗限制下消息传递所带来的额外延迟可能超过本地化的优势。图7. 在不同工作负载规模下运行基于MIG的NUMA本地化结果表明较小规模的情况尤其是图7中黑色和深绿色线条表示的情况即使在未本地化的情况下在更高的功耗限制下也从未耗尽可用功率。因此它们从本地化节省的GPU功耗中获益甚微而且在如此小的规模下内核启动带来的延迟更加明显。较大规模的工作负载例如绿色线条需要更多功耗因此即使在更高的功耗限制下也能比未本地化的设置获得优势。开始使用基于MIG的NUMA节点本地化NVIDIA数据中心GPU中的本地L2缓存会影响对NUMA无感知的工作负载的性能。我们在MIG模式下使用Wilson-Dslash算子进行的实验表明当GPU在较低的功耗限制下运行并且通过MPIPCIe/NVLink进行的数据传输相对于本地内存访问较少时与相同功耗限制下的未本地化情况相比基于MIG的NUMA节点本地化可以实现高达2.25倍的加速。虽然系统在1000 W的更高功耗预算下可能比400 W配置实现更高的绝对性能但在功耗受限条件下基于MIG的本地化具有明显优势。在低功耗场景下它能显著提高性能使其成为在严格功耗限制内运行时特别有效的优化方法。然而总的来说MIG并不能提供持续实现有效数据本地化所需的灵活性尤其是在进程间通信开销在更高功耗限制下变得更加显著时。MIG仅支持那些规模太小而无法完全放入单个GPU的使用场景。因此不建议将MIG用于本文中展示的案例。为了解决这些限制目前正在研究其他替代方法。要了解更多信息请参阅《使用NVIDIA CUDA MPS无需更改代码即可提升GPU内存性能》。FINISHED更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享