¶摘要
功率输送和成本所带来的限制将成为下一代高性能计算(HPC)系统开发的关键设计障碍。为了弥补这些障碍,已经提出了对过度供应的计算系统施加功率限制(或上限)以保持在物理(和财务)功率限制内的解决方案。不知情的功率封顶(power capping)可以显着影响性能,功率封顶的成功在很大程度上取决于在计算节点的各个子系统上分配给定功率预算的智能程度。由于不同的计算对各种系统组件提出了截然不同的要求,因此在进行功率分配决策以减少性能下降时必须考虑这些需求的变化。给定目标功率限制,本文中提出的基于模型的方法考虑了计算特定属性,指导CPU和DRAM域的功率分配以最大化性能。我们的方法是准确的,可以预测功率上限分配方案对来自实际应用的不同类型计算的性能影响,绝对平均误差小于6%。
¶研究背景
电力成本和供电限制限制了大规模高性能计算(HPC)系统的扩展。未来的HPC系统很可能会过度配置并且功率受限,无法在严格的功率限制内运行[9],[18],[23];即,并非系统的所有组件都能以最大功率消耗运行。对于这些类别的系统,传统上最小化时间的性能优化目标将变为更复杂的目标 - 在功率预算下最大化性能,其中给定系统的功率预算将取决于物理(在电力输送和冷却基础设施方面)和成本考虑因素。
为了有效地运行功率受限系统,必须做出决定,将可用功率预算分配给计算节点内的不同子组件(CPU,uncore和memory)。这些分配决策中的一些可能导致操作系统组件处于降低的功率水平,从而降低其性能。为了减少对应用程序执行时间的影响,功率分配决策必须是应用程序感知的;即,功率应限制在对给定应用程序的执行时间影响最小的组件上。例如,在访存密集型的计算阶段的功率封顶DRAM子系统队程序性能的影响要小于功率封顶CPU子系统。
因此,确定不同类型的计算对CPU和DRAM子系统上降低的功率上限敏感的程度是开发最佳功率上限策略的先决条件。为此,本文提出了一种系统计算感知方法,用于理解和预测给定计算对CPU和DRAM子系统的不同功率上限的敏感程度,以确定给定功率下组件的最佳功率分配预算。除了对CPU和DRAM施加的不同功率限额之外,我们的预测机器学习模型还利用应用程序的计算属性作为预测器 - 例如,算术强度,内存访问模式,缓存命中率和数据依赖性。当在CPU和DRAM域上同时施加不同的功率上限时,这些模型可用于探索不同计算的性能灵敏度。在给定规定的功率预算的情况下,模型还可用于从一组使用不同代码优化的源代码变体中选择最佳的计算实现。
我们的工作与众不同之处在于,我们的机器学习模型使用一组基准测试中的计算特性进行训练,以预测CPU和DRAM功率上限对细粒度的任何给定应用的影响。
本文做出了以下贡献:
- 我们提出了高度准确的模型,用于预测CPU和DRAM域上不同功率上限队各种HPC计算的性能灵敏度。
- 我们说明了计算特征在开发由功率限制引入的性能退化的精确预测模型中的应用,并讨论了不同应用特性在驱动观察到的退化中的相对重要性。
- 我们证明了我们的模型在预测实际应用的功率上限敏感度以及为给定功率限制选择性能最佳实现变体(在自动调整工作流程内)的有效性。
¶动机和方法
本节介绍了本文的研究动机,以及我们预测DRAM和CPU功率封顶设置的方法,这些设置可在给定功率预算下最大限度地提高性能。
¶研究动机
我们的方法所基于的关键洞察力是,相同计算的不同实现在功率有限环境中将具有不同的性能行为。我们通过图1和图2中提供的简单示例来说明这种见解。我们采用了一系列不同的HPC计算(有关这些计算的更多详细信息包含在第IV节中的内容),并在我们的实验室测试平台上运行它们,这是一个基于SandyBridge的双插槽系统(也在第IV节中描述),没有功率限制(原始状态)。对于每个计算,我们运行两组实验 - 一组通过对DRAM域施加功率限制而另一组通过在CPU域中施加限制。每个域的限制是根据给定计算在没有对系统施加功率限制时绘制的功耗来选择的。图1显示了DRAM域的结果,图2显示了CPU域的结果。x轴表示功率上限水平,以基本情况下的功率比例表示;例如,0.62的电平表示在原始状态功率的62%的功率限制(即,功率减少38%)。因此,点越靠近y轴,功率减小越大。y轴表示相对于原始状态的性能下降,其范围从大约1.17X-5X。
降低DRAM领域功率上限对性能的影响是相当广泛的。如果我们考虑DRAM域的功率水平为0.62(见图1),性能下降可能在2.5X到5X的范围内。虽然CPU功率降低的范围并不广泛,但范围仍然非常显着。在性能下降范围内,计算的下降实际上取决于其特性,并确定哪些特征是这种退化的关键指标,这些都是针对在给定功率预算下最大化性能的任何方法需要达到的要求。下一节将介绍我们用于提取HPC应用程序中计算的关键性能指标的工具。
¶计算特征
为了开发能够捕获计算对CPU和DRAM域上不同功率限制的敏感度的模型,我们需要首先捕获应用程序如何与底层硬件子组件交互并执行底层硬件子组件的低级细节。为此,我们利用在PEBIL [15]之上开发的一套应用程序分析工具,这是一个用于x86 / Linux的二进制工具包。PEBIL将应用程序二进制文件作为输入;它反汇编二进制,分析它,并可以进行插桩。在PEBIL之上编写的工具可以对应用程序二进制文件执行静态和动态分析。
在PEBIL之上编写的静态分析工具产生关于程序的近似结构(例如,函数和循环)以及在这些结构内发生的操作的信息。该工具还记录那些控制结构内的操作类(例如,存储器和浮动操作)的类型和大小。静态分析工具记录每个块中存储器操作数的平均大小,并测量寄存器或存储器定义与其使用之间的指令数(即数据依赖性)。
为了收集有关应用程序内数据移动的详细信息,内存特征描述工具,一个在PEBIL之上编写的动态分析工具,应用程序中的每个内存访问,并管理要即时处理的地址流以进行估计各种数据运动相关度量(例如,重用距离,不同循环的工作集大小和高速缓存命中率)。另一个动态分析工具保存应用程序控制单元的访问计数信息(例如,基本块访问计数)。当与静态指令混合信息结合时,访问计数信息提供有关应用程序指令构成的详细信息。
静态和动态工具收集的信息可以组合在一起,以识别大型应用程序中的计算阶段[27],并构建我们称之为每个已识别阶段的计算签名。计算签名包括应用程序以指令混合和计数形式所需的操作,数据位置属性,捕获应用程序与内存子系统交互的指标,如缓存命中率,加载和存储操作等。
¶建模:问题的形式化和技术
如公式1所示,我们的目标是开发一个函数 $f$ ,其输入是一组硬件参数(功率上限)和应用程序特征度量 $x_1,\cdots,x_n$ ,其输出 $y$ 是对计算性能影响的一些度量。
$$
y=f(x_1,\cdots,x_n)\tag{1}
$$
在这项工作中,我们使用Cubist [22],这是一种基于规则的机器学习技术,来估计方程1中的 $y$。Cubist模型由一系列线性回归模型组成; 预测基于在树的终端/叶节点处找到的线性模型。叶子的路径或终端节点的选择基于中间节点处的规则,这些规则也基于线性模型[19]。与其他形式的基于树的方法(如梯度增强)不同,Cubist模型易于解释。Cubist模型还能够封装预测变量(或输入)变量之间复杂的非线性关系。例如,中间规则可以识别和分离跨越缓存层次结构边界的工作集大小的功率上限带来的性能差异。
为避免过度拟合,我们采用了两种技术。首先,我们将经验样本划分为非重叠的训练和测试集。该模型在训练子集上训练并在测试集上验证。其次,我们使用10倍交叉验证来生成模型。在k倍交叉验证中(在我们的例子中,k = 10),训练数据集被随机分成大小相等的k个子集。然后构造k个不同的模型,每个模型使用k个分区的(k-1)作为训练输入,使得k个集合中的1个可以用于模型验证。然后根据验证集验证每个k模型,并选择产生最小误差的模型。
¶实验结果
本节首先描述我们用于收集训练数据的实验系统。然后,我们描述了一组用于收集训练和测试数据的基准测试,然后讨论了我们的模型在测试数据集和迷你应用程序上的准确性。
¶实验测试平台
我们的测试系统包括一个双插槽服务器,配备两个8核2.9GHz Intel Xeon E5-2690(SandyBridge)处理器和64GB DDR3内存。在系统上禁用同时多线程(SMT)和Turbo-boost。
最近的Intel处理器上提供的RAPL(运行平均功率限制)[8]可以为CPU和DRAM子系统收集(建模)功率测量(RAPL文档将这些子系统称为“域”)。RAPL还允许用户在这些域上设置功率限制,并且底层硬件基础架构强制执行这些功率限制。在我们基于Sandybridge的测试系统中,RAPL公开了四个功率层 - Package(PKG),Power Plane 0(PP0),Power Plane 1(PP1)和DRAM。我们使用英特尔的Governor工具[1]来强制执行PKG和DRAM域的功率上限。我们还依靠Power Governor工具进行DRAM和CPU功率测量。我们每秒测量5个功率样本,根据我们的经验,这只会产生微不足道的开销。
虽然我们的重点是使用英特尔处理器,但其他芯片制造商也在其处理器中启用了功率封顶(例如 AMD [3]和IBM [6],[5])。本文提出的方法也应适用于这些架构。
¶模型训练计算
为了训练捕获各种类型的计算性能如何在CPU和DRAM域上受到不同功率上限级别变化的模型,我们使用了一组在HPC应用程序中非常普遍的各种计算内核。部分源自PolyBench [20]和SPAPT [4]套件的基准测试由来自不同计算域的内核组成 - 密集线性代数(例如,矩阵 - 矩阵乘法和矩阵 - 向量乘法),模板计算,线性代数求解器(例如,LU分解)等。此外,为了扩展和丰富训练空间,对于某些内核,我们使用两个源到源的编译器转换工具–Orio [17]和CHLLL [7]生成实现变体(代码变体)。我们用于生成这些变体的优化包括循环展开,缓存/寄存器平铺和标量替换。这些内核和内核变体中的每一个都配置为以多个工作集大小运行,并且每个计算配置为运行至少2秒。通过将计算内核和内核变体配置为在多个工作集大小上运行,我们总共有538个计算形成了我们的经验数据集。
上述数据集中的每个计算在不同的DRAM和CPU功率上限下在测试系统上定时。我们首先运行没有功率限制的基准计算(基本情况),并将来自RAPL的CPU和DRAM域的平均功率测量值表示为 $P_{bCPU}$ 和 $P_{bDRAM}$ 。对于每次计算,我们然后随机生成[ $0.7\times P_{bDRAM}$,$P_{bDRAM}$ ]区间的DRAM功率上限(即,我们选择随机配置,其中我们将DRAM功率上限降低多达30%)。生成CPU功率上限水平也是如此。对于大部分计算,将上限降低30%以上是不适用的,因为我们接近RAPL的适用DRAM和CPU功率上限的下限。简单的笛卡尔积将DRAM和CPU候选功率上限组合在一起,形成一组同时的DRAM和CPU功率上限配置。在完成评估所需的时间方面,对所有适用的功率限制配置运行计算是不切实际的。因此,在所有适用的配置中,我们选择18个随机配置并对这18个配置运行计算。选择18种随机配置的决定完全取决于我们在数据收集时间方面的经验以及我们希望缩短时间,同时为模型培训生成足够的培训点。我们执行六次配置,以获得六次功率和性能测量。为了降低功率和性能测量中的噪声,我们丢弃最小和最大测量值并平均剩余的四个。此外,对于每次计算,我们使用第III-B节中描述的工具生成表征特征。在后处理之后,我们在经验收集的数据集中总共有9550个数据点。
¶模型形式化、结果和诊断
公式2显示了公式1的更具体的公式。 $P_d$ 是功率上限引起的性能下降。CPU和DRAM功率限制指标是当没有功率上限时相对于各个域汲取的功率减少百分比。$pi_v[0,1,2]$ 是每条指令的L1,L2和L3命中,而 $pi_v3m$ 测量每条指令在L3(因此转到主存储器)中丢失的访问。$fprat$ 是浮点比(每个内存操作的浮点运算),$bytespermemop$ 是每个内存访问传输的字节数。$ins_mix$ 由指令混合参数组成 - 分支操作、加载操作、存储操作等,表示为总动态指令的百分比。$idu$ 和 $fdu$ 是整数浮点数据依赖度量。
$$
P_d=f(dram_reduction, cpu_reduction, pi_v0m,pi_v1m,pi_v3m,fprat,ins_mix,bytespermemop,idu,fdu) \tag{2}
$$
为了生成和评估 $P_d$ 模型(参见公式2),我们首先对我们的整体经验数据进60%-40%的分割。第一个60%部分用于使用10倍交叉验证训练模型。剩余的40%数据用于测试模型的准确性。模型评估结果如图3所示。该图显示了训练和测试数据的建模与测量的运行时间减速(相对于无功率上限)。对于性能良好且准确的模型,图中的点应该大致聚集在对角线45度线周围,如图3所示。预测测试数据集的绝对平均误差小于2%。
我们计算方程2中每个输入预测变量的相对变量重要性,以确定主导预测变量(或输入变量)以及那些对性能退化影响最小且可能从模型中删除的预测变量。图4显示了变量的重要性。具有最高重要性的预测变量被缩放到值100(在这种情况下,$dram_reduction$)。正如预期的那样,CPU和DRAM功率上限水平影响最大,其次是量化计算与内存层次结构相互作用的指标。最后,指令组合参数完善了最高预测指标。从计算签名中的元素中,每个指令( $pi_v3m$ )的主存储器访问是最重要的,这是预期的,因为更多的主存储器访问意味着更多的CPU停顿,因此对CPU功率上限减少的敏感性降低(对于DRAM功率上限减少产生相反现象)。
¶基于模型的自动调优
我们在这项工作中开发的模型的一个用例是它在基于搜索的自动调整工作流程中的易用性,其中生成并评估使用不同基于编译器的优化的给定代码的多个变体以查找表现最好的那个[24]。在具有响应操作环境变化能力的动态自动调整环境中,我们的模型可用于快速识别在功率预算内表现最佳的变体。我们合理地假设是我们可以在没有功率上限的基本设置中访问自动调整过程中评估的CPU和DRAM功耗数以及所有变量的性能。使用该数据和规定的功率预算,我们的模型可以通知所有可能配置的同类DRAM和CPU功率上限的变体执行时间,从而可以选择性能最佳的变体。
为了说明,我们使用ATAX(矩阵转置和向量乘法)内核。我们使用Orio [17]工具生成200个ATAX内核变体。基于无功率上限的基本设置的性能,我们选择了前10种变体。然后通过施加100个随机选择的DRAM和CPU功率范围来评估这些所选变体中的每一个。我们想要通过这组实验回答的关键问题如下:**如何降低整体DRAM和CPU功率限制会影响最佳变体的选择?也就是说,性能最佳的变体在降低功率上限时是否会继续保持最佳状态?**如果我们假设需要将总功率上限降低10%的情况,那么运行不同的变体是否有意义。请注意,10%的减少将基于在基本设置下性能最佳变体所消耗的DRAM + CPU功率。
在图5中,我们显示了这项调查的结果。X轴是总功率减少量,是最佳变体(变体v87)在无功率上限时所消耗的功率的百分比; Y轴显示所选前10个变体的执行时间范围(以秒为单位)。功耗降低5%时,应选择v192,如图所示。当变量旁边放置一颗星时,我们指示我们的模型不一致(即,使用我们模型预测的执行时间选择的变体与使用实际执行时间选择的变体不匹配,并且在六个案例中仅有一个)。我们提出的研究问题的答案是,变体在执行时间方面的排名确实在不同的功率上限下发生变化。本实验的目的是表明,给定一组DRAM和CPU的功率分配方案,我们的模型能够预测任何可用变体的性能下降。
¶小型应用程序上的模型评估
最后,我们不仅在内核中说明模型的能力,而且利用模型来预测功率上限操作环境中两个迷你应用程序的行为 - miniGhost [2]和CoMD [11]。miniGhost是一个有限差分的迷你应用程序,它在同质3D域上实现差异模板。我们考虑使用 $128^3$ 和 $256^3$ 大小的网格进行评估。CoMD是一类广泛的分子动力学模拟的代理应用程序,并提供计算简单Lennard-Jones(LJ)和嵌入原子方法(EAM)潜力的实现。我们在实验中都考虑了这两点。
使用我们的应用程序表征工具套件,我们隔离了这些应用程序中的关键热点,并将特性提供给我们的模型,以请求针对一组随机生成的CPU和DRAM功率上限配置的性能降级预测。为了评估模型的准确性,我们通过在给定的CPU和DRAM功率限制下运行应用程序来测量这些配置的实际性能下降。
然后比较预测的降级和实际降级以验证模型的预测精度。总体预测结果(直方图)如图6所示。此处报告的误差度量是针对“样本外”测试,即在模型训练过程中未看到应用热点的特征描述,从而证明了我们的HPC应用计算模型预测的准确性。总体而言,模型可以很好地预测结果 - 平均绝对平均误差为6%。对于超过86%的应用程序热点,预测误差小于10%。
¶结论
功率上限的性能影响在很大程度上取决于应用程序的计算特性,即,当在功率上限环境中运行时,不同的计算将具有不同的性能行为。本文介绍了一种高度精确的基于模型的方法,该方法利用应用程序特性为CPU和DRAM域的性能最大化功能上限配置选择提供信息。