AMPT-GA:用于GPU应用的自动混合精度浮点调整

418 阅读16分钟

简介

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

高性能计算(HPC)的科学应用在很大程度上依赖于浮点运算的高精度输出。
在这些程序中,某些变量的精度可能经常被降低,以加快执行速度或尽量减少计算能量。
最近的NVIDIA GPU在进行单精度浮点运算时,其吞吐量是双精度的两倍。当我们努力运行大规模的应用程序时,这种权衡变得更加重要,因为问题的规模不断增加。应用结果的准确性,必须满足用户定义的准确性或误差限制是至关重要的。混合精度计算是为各种浮点变量组合各种精度的做法。如果我们遵循确定精度的规则,混合精度训练可以大大加快任何深度学习任务。

迈向自动混合精度之路

GPU领域的最新发展为提升性能开辟了新的途径。除了FP32(单精度)之外,FP64(双精度)和FP16(半精度)算术单元已被添加到GPU中。其结果是,使用FP64/FP32/FP16指令可以同时达到不同的性能水平。

在这些处理器发布之前,混合使用FP64和FP32指令的性能效果有限,因为很少有混合精度的数学单元。在选择混合精度时,需要进行铸造(或转换)。

作为使用混合精度训练的一个例子,百度研究人员发现,在用于语音识别和机器翻译的LSTM领域,在GPU上采用FP32和FP16变量的组合,在精度上没有变化,取得了相当大的进步。

先前工作的背景

这里有一些相关的背景和之前关于混合精度优化的工作。

  • 第一步,过去的工作不支持GPU编程模型中存在的并行代码,因为它们依赖于串行仪器或剖析援助,不跨越GPU编程和执行范式,如CPU到GPU调用。
  • 第二个问题是,以精度为中心的技术没有一个性能模型,并假定以最少的精度实现最快的运行时间。一个数学运算只有在混合足够精确的情况下才能用最精确的操作数来满足投掷。另一方面,铸造是一个昂贵的操作,所以降低精度实际上可能会延长它完成的时间。在许多GPU上存在着FP64和FP32的并行资源池,结合精度提供了一个额外的并行机会,而早期的工作却忽略了这一点。为了达到总体精度标准,已经确定的精度水平通常不能提高应用程序的执行时间。
  • 最后,依赖实时信息的方法会遇到与搜索空间有关的问题。如果架构对可能被调整的n个浮点变量支持三个精度等级,那么搜索空间就是(3次方n)。在n可能达到数十万的大型生产级科学应用中使用这种策略是不可能的。

AMPT-GA:一个混合精度的优化系统

为了应对GPU应用的性能最大化挑战,我们开发了AMPT-GA。它是一个混合精度的优化系统。由程序的最终用户决定,AMPT-GA的目标是在应用层面为浮点变量挑选一组精度等级,以提高性能,同时将引入的误差保持在可接受的阈值以下。精度向量(PV)是AMPT-GA的最终输出,它将每个浮点变量分配到一个精度级别。

AMPT-GA的主要思想是,静态分析通过可行的精度向量的广阔空间来帮助动态搜索方法。在本文中,静态分析被用来确定变量的分组,这些变量的精度应该被集体修改,以减少任何一个变量的精度修改对性能的影响,通过铸造。广泛的搜索区域可以通过这种信息来加速。研究人员采用遗传算法进行搜索,这有助于避免早期技术容易滑入的局部最小值。

该论文的创新主张

  • 在遗传搜索方法中使用兼容GPU的静态分析,提高了识别可行的混合精度程序的效率。
    基于静态建立的性能模型的执行过滤器排除了不能盈利的精度向量,因此降低了AMPT-GA在搜索过程中所需要的执行次数。

  • AMPT-GA提供的是应用层面的精度指导,而不是在过去的工作中观察到的本地化内核、函数或指令。

  • 实验表明,我们的搜索技术可以比目前的最佳实践更有效地避免局部最小值,从而大大节省时间。

我们发现AMPT-GA能够超越最先进的方法Precimonious,在LULESH的混合精度计算中发现比其所有双变量的基线多出77.1%的速度,而使用的程序执行次数与Precimonious相似。我们的铸造感知静态性能
模型使得AMPT-GA能够找到Precimonious由于局部最小值问题而无法识别的精度组合。在三个有代表性的Rodinia基准测试中,LavaMD、Backprop和CFD,当可容忍的误差阈值较宽时,我们实现了相对于Precimonious的额外加速,即11.8%-32.9%,而当误差阈值最严格时,则为-5.9%-39.8%。我们选择这
三种方法是因为它们跨越了内核的数量和大小的范围,以及最新一代GPU机器上可用的精度范围。我们还评估了三种解决方法的效率,即搜索最佳PV所需的执行次数的性能增益,AMPT-GA在这个指标上表现出色。

值得注意的是,美国能源部(Department of Energy)使用 Lulesh作为一个代理应用程序,对大型集群进行基准测试,因为它代表了许多大型代码。
它建立了流体力学方程,解释了材料在受力时相互间的运动。研究人员使用了LULESH的CUDA版本,输入大小为-s 50,并在NVIDIA Tesla P100 GPU机器上运行所有实验。

研究是通过改变LULESH在FP32或FP64空间的变量级别的精度来进行的。FOM(Figure of Merit)被定义为模拟中的组件被处理的速度。

通常的做法是在每段LULESH代码结束时输出FOM指标来衡量整体性能。由于缩放的原因,FOM比单纯的执行时间更受欢迎,尽管壁时钟和FOM的收益是成正比的。被评估的真实统计数字是FOM占FOM的百分比,其精度水平最低。

我们发现,与以前的评估相比,LULESH是一个相当复杂的代码,在GPU方面包含7000行C++代码,在CPU方面包含600LOC。测试中共使用了76个浮点变量。另一个与比较有关的重要事实。Precimonious是可以获得混合精度解决方案的最广泛的程序,包含32个变量。

在这项研究中,共进行了五次实验。

  • 优化的精度。 这个实验中,研究人员试图评估AMPT-GA相对于最先进的Precimonious和天真的GA的相对执行优势。我们可以在图a、图b、图c和图d中看到相关结果。
  • 误差阈值的依从性。 这个实验证实了在前面的实验中挑选的PV符合用户定义的误差约束(见图e)。
  • 组件测试。 这个实验的目的是研究各种组件对FOM指标的影响(见图f)。
  • 本地与全局模型。 这个实验的目的是量化应用程序级调整与内核或函数级调整的优势(见下表)。
  • 精确向量泛化。 这个实验中,测试了对用户提供的输入值的狭窄范围内的输入进行泛化的能力(见图g)。

研究人员使用FOM(Figure of Merit)来比较应用程序在精确调谐后的性能,FOM与吞吐量同义,并以所有浮点的FOM为标准。AMPT-GA在三个阈值中的两个超过了Precimonious,在最高的阈值上超过了天真的解决方案。见下图。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图a

每个协议的执行次数见下图。正如预期的那样,天真方案的执行次数最多,紧接着是没有执行过滤器的AMPT-GA。AMPT-GA的执行次数少于或与Precimonious的执行次数相当。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图b

对于所有三个误差阈值,AMPT-GA是最有效的方法,如下图所示。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图c

下图描述了每种算法在单个程序运行期间的效率增益。结果表明,与其他两种技术相比,AMPT-GA可以迅速收敛到更高的FOM解。这是因为GA的能力比delta调试有更大的飞跃(delta调试更注重于局部搜索)。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图d

每种技术的性能和利用现有错误的能力都显示在下图中。这些结果表明,所有的技术,无论是严格的还是灵活的,都能满足错误的约束。另一方面,Precimonious无法利用2.5阈值的可用误差空间。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图e

T=2.5情况下的FOM是在激活AMPT-GA的各种模块后显示的。最左边的方案用实际的程序执行来代替性能模型,在那里它表现得最好,但代价是额外的10倍执行。分组和超维空间突变的影响最大,而执行过滤器和预填充对这个特定的错误阈值的影响可以忽略不计。见下图。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图f

下表展示了LULESH中的三个内核K1、K2和K3对一个特定的局部优化精度向量的性能增益和误差。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

表格

  • 由于影响K1的PV项都是浮点,而影响K2和K3的项都是二进制,所以FOM和误差有一个应用层面的转变。K2和K3的处理方法是类似的。
  • 如果内核级的调整是充分的,整体应用的FOM应该等于各种内核级收益的总和,但是应用级的措施要低15.1%。
  • 与所有单独的内核误差相比,总的系统误差要低得多(52.6 %)。

误差CDF是针对PV提出的,其目标误差为2.5,用于接近测试输入的输入。这些发现表明,大多数邻居位于误差极限之下,因此,结果可以以80%的置信度进行概括。见下图。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

图g

使用Rodinia基准程序进行评估

如上所述,这种方法是使用Rodinia GPU基准程序套件中的三个程序进行评估的。LavaMD,Backprop,和CFD。LavaMD是一个分子动力学程序,有一个单核和15个浮点变量。Backprop是一个有21个浮点变量的双核基准程序,实现了模式识别的一个算法。CFD是一个有26个浮点变量的四核程序,作为计算流体力学的一个标准基准。获得的结果如下。

来自LavaMD的结果: 下图显示, Naïve GA在所有情况下都能产生最大的FOM值,尽管它比其他方法需要更多的程序执行比例。AMPT-GA实现了比Precimonious更高的FOM值。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

来自Backprop的结果:AMPT-GA实现了与Naïve GA相同的FOM值,而消耗的执行次数却不到三分之一。AMPT-GA是所有三个错误级别中最有效的方法;你可以看到下图。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

CFD的结果:下图显示,Naïve GA和AMPT-GA在所有情况下都有最大的FOM值;但是,Naïve使用的程序执行次数远远高于AMPT-GA。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

AMPT-GA的广泛概述

要使用AMPT-GA,你需要一个测试线束,一个来自目标应用程序或内核的输入,一个可能被调整的变量列表,以及一个指定的误差指标及其目标误差阈值(T)。如果没有提供变量列表,我们将使用应用程序的浮点变量或目标GPU设备的内核来进行分析。本文假设该架构只处理具有相同精度输入的指令。

  • 构建性能模型时,必须预测减少所考虑的浮点变量的精度的效果。

  • 使用LLVM通道的静态分析被用来建立模型,它在程序的变量之间建立一个依赖图。图中的节点是指令和变量的定义,而边则将定义与指令中的应用联系起来。

  • 这个图,当给定每个变量的精度等级时,衡量每个精度的操作数量和发生的铸造数量。这一信息被转化为一个性能分数,代表了潜在的PV中由于较快的低精度指令而产生的相对性能。

  • 动态的执行参数,如一个循环的运行次数,并没有被这个静态通道所捕获,因为它们没有变化。
    虽然不能保证获得相同分数的函数的执行时间会相同,但分数确实提供了各种PV之间加速潜力的相对排名。

  • 为了找到具有最高性能的PV,同时将错误水平保持在一定的阈值以下,我们使用了一种经过调整的遗传算法(GA)。这是因为PV空间是二进制限制的,PV之间的梯度不平滑,而且目标在误差和性能方面是非线性的。

  • 搜索空间中的一个点只有在预测的性能优于获得的最佳性能时才会被执行。GA在考虑到PV的情况下运行程序,找到某个点,然后评估性能和误差。如果这个搜索点的性能比迄今为止的最佳性能差(这将会由于我们的性能模型中的错误而发生),或者如果误差大于阈值,那么这个搜索点将被拒绝。否则,它将被考虑在未来的GA生成中进行选择。

  • 为了避免与从属参数(相关变量组)相关的铸造惩罚,突变函数已被修改为改变超维组空间中的某些变量。使用GA,我们可以评估可能使用的最佳PV。下图说明了这些不同阶段是如何交织在一起的。

终端用户的工作流程。对于AMPT-GA的部署,终端用户必须提供应用源,定义测试输入,并设置一个目标误差阈值。AMPT-GA将确定所有浮点变量的精度向量,以优化效率,同时达到阈值。可以让终端用户选择哪些浮点变量应该被修改。

所有这些都可以从与Paperspace Core GPU驱动的机器上运行,以便自己直接测试。

今天就为你的机器学习工作流程增加速度和简单性吧

关于AMPT-GA的操作的概念

  1. AMPT-GA的操作:AMPT-GA是一种优化技术,用于挑选最佳精度矢量(PV),以最大限度地提高性能,同时将误差控制在用户指定的限度内。我们将约束条件作为一个目标函数的惩罚来实现,这样错误的解决方案就会被拒绝,但关于错误程度的信息仍然保留在分数中,以帮助指导搜索。

AMPT-GA: Automatic Mixed Precision Floating Point Tuning for GPU Applications

  • perf (PV)是性能得分,数值越低表示性能越好

  • error (PV)是指由指定的PV引起的错误指标值,而T是这个错误指标的阈值

  • K是一个乘法系数,定义如下
    :1,如果误差(PV)≤T,P,大值大于最大perf值
    ,如果误差(PV)>T

2 .用户定义的误差度量。我们使用(默认情况下)一个应用程序生成的误差度量,即与最精确的结果相比,精度的位数。

3 .感兴趣的变量。 用户可以在应用程序中加入任何浮点变量,包括数组、结构和单个变量。AMPT-GA选择了那些在GPU内核中使用的、由普通剖析工具确定的高运行时间的变量。我们从运行时间最长的内核开始,将其包括在内,然后根据运行时间的长短,沿着列表往下走。当我们包含了足够多的内核来捕捉整个程序执行时间的一定比例时,我们就会终止。在整个程序运行时间的一定比例被捕获后,我们就终止测试。

4 .黑匣子搜索。 一个 "黑箱 "优化程序被用作我们搜索的起点,它采用了遗传算法(GA),没有任何程序分析来指导搜索。

5 .依赖图和静态性能模型 可以使用静态性能模型和中间的依赖图来估计特定PV的性能增益。当提供一个PV和应用源代码时,该方法估计代码中静态出现的浮点和双倍操作以及转换的数量。当估计混合精度版本的程序中的转换量和操作类型时,依赖图是基于全双精度情况下的程序结构。

6 .精度向量优化。 MPT-GA使用一种优化方法来确定指定误差阈值的最佳PV。

7 .执行过滤。 MPT-GA使用实际的程序执行来测量和验证误差指标是否低于阈值。这意味着必须首先执行程序,以评估尚未看到的PV的目标函数。

8 .程序转换。 AMPT-GA中,我们最终必须将PV应用到应用程序中,使程序的实际操作发生在修改后的精度上。

结论

AMPT-GA是一个改善使用计算密集型GPU内核的应用程序中的变量精度的解决方案。 作为结果,我们有两个创新。

  • 一种静态分析,以确定需要同时改变的变量。
  • 一种搜索技术,可以根据适用的惩罚措施(如类型铸造)快速删除无利可图的PV。