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