基于鲲鹏和昇腾异构平台的单节点HPL-AI 设计与优化

2024-03-28 15:15吴昊天任长青陆璐徐鹏翔杨凯
关键词:基准运算精度

吴昊天 任长青 陆璐 徐鹏翔 杨凯

(1.华南理工大学 计算机科学与工程学院,广东 广州 510006;2.郑州信大先进技术研究院,河南 郑州 450001;3.鹏城国家实验室,广东 深圳 518000)

随着大数据时代的到来,数值运算变得无处不在,其规模也在逐渐扩大。例如,训练和优化大规模神经网络模型需要进行大量的数值计算,在物理学、化学、生物学等领域也需要进行大规模数值计算,用于模拟天体、气候、分子结构等科学问题。传统的数值运算模型已无法胜任一些高难度计算任务,因此高性能计算(HPC)应运而生。目前,HPL(High Performance LINPACK)基准是业界使用最广泛的高性能计算机浮点运算能力测试程序。其标准[1]已经成为TOP500 超级计算机[2]排序的国际基准。TOP500 的排名每半年更新一次,其中每台超级计算机的得分取决于其运行HPL 基准程序的快慢,并且HPL 基准测试结果最终得分的占比非常高。虽然HPL 基准测试的得分是TOP500 超级计算机性能排名的关键因素,但也有其他因素影响最终排名,例如系统架构、节点数、内存带宽和网络带宽等。因此,需要在超级计算机的设计和部署中平衡多种因素,以提高HPL基准测试的得分。

HPL 基准是基于双精度浮点运算的测试方案,其通过运行高性能计算应用程序(如仿真模型[3])来评估超级计算机的双精度浮点运算性能。尽管HPL已是衡量TOP500 超级计算机性能的可靠基准,但现代超级计算机不仅用于仿真模型等仿真应用,还用于AI 领域。由于AI 模型的训练涉及混合精度运算,因此HPL 基准无法完全胜任AI 领域浮点运算性能的评估。

近年来,为了解决AI 模型碎片化和多样化问题,AI大模型被提出并受到了广泛关注。在生成式预训练语言模型方面,OpenAI 在2023 年提出的GPT-4[4]包含数千亿个参数,在一系列语言处理任务上创下了极佳的表现。该模型可以在文本生成方面表现出惊人的创造力。此外,GPT-4还可以识别和分析图像,并结合用户的文本输入来回答问题。AI大模型通过“预训练大模型、微调下游任务”的方式为该问题提供了通用解决方案。其可以从大量有标签和无标签数据中有效地捕获知识,极大地扩展了模型的泛化能力。但由于AI 大模型的训练速度依赖于系统的运算能力,因此,用于AI 大模型的高性能计算系统的数值运算性能成为一个重要指标,并需要一个新的基准测试来评估。

HPL-AI[5]是一个适用于AI 超级计算机的基准测试程序,被用来测量高性能计算机使用混合精度技术求解大型线性方程组的速度。在AI 模型中,混合精度技术被广泛用于加速模型的训练,因此,HPL-AI 基准的测试结果已经成为评估用于执行AI大模型的高性能计算系统性能的重要指标。尽管HPL-AI 基准的规则是固定的,但其在不同硬件平台上的具体实现存在差异,且具有一定挑战性。目前,基于鲲鹏和昇腾异构平台的HPL-AI 基准测试还未被实现,其主要难点涵盖硬件异构、软件异构和架构异构3个方面。

近10 年来,高性能计算性能测试方面的课题被广泛研究。测试求解大型线性方程组的速度是评价高性能系统性能的常用方法。HPL采用传统的双精度模式来求解线性方程组,其浮点运算速度会受到双精度运算速度的影响。混合精度求解充分利用了低精度计算的高速特性,为加速高性能计算应用带来了更多可能。特别是随着专业的低精度集成计算单元出现,传统的高性能计算算法更需考虑使用混合精度进行计算来提高性能[6]。Moler等[7]证明了采用混合精度求解器求解线性方程组是一种有效的方法。Kurzak 等[8]基于Cell 处理器和混合精度方法设计并实现了一个线性代数例程,其性能比标准的双精度实现高出近一个数量级。这充分体现了混合精度求解器在专用处理器上有着巨大潜力。Lei等[9]将混合精度求解器应用于CPU+CPGPU异构集群的HPL 中,其浮点运算速度相比普通HPL 的平均加速比达到了2~3。Baboulin 等[10]通过使用32 位和64 位浮点运算的组合,大幅增强了许多密集和稀疏线性代数算法的性能,并能同时保证所得结果为64 位精度。Haidar 等[11-12]提出并验证了FP16 用于混合精度求解的可行性,并展现了其在良态矩阵上的优势。

低精度计算同样会带来一定程度的精度损失。精度损失对于某些对精度敏感的应用具有较大的负面影响。因此,混合精度求解器的迭代优化模块是必要的。然而,迭代优化会增加一定的计算时间,这便要求迭代优化方案能够在保证精度符合要求的同时性能足够好。Demmel 等[13]提出了一种求解线性方程组的超精确迭代优化算法新变体,其只需很少的额外工作就能返回任何范数的最大相对误差界及传统法向误差界。Oktay 等[14]使用多级混合精度迭代优化平衡了混合精度计算的性能与准确性,并提高了其可用性。Amestoy等[15]将混合精度LU分解与稀疏近似因式分解相结合,大大减少了时间和内存消耗,并利用迭代优化弥补了精度损失。

深度学习模型的部署往往受到平台的功率或计算资源的限制,其部署的可行性问题逐渐显现。为了解决这一问题,许多方案将混合精度框架应用于深度学习来突破性能的限制[16]。Micikevicius 等[17]提出了使用半精度训练神经网络而不会降低模型精度或必须修改超参数的方案,这使得内存需求减半,并且有助于提升模型在最新GPU 上的运算速度。Latotzke 等[18]提出了高效的混合精度CNN 加速器。Das 等[19]实现了基于整数运算的卷积神经网络混合精度训练。混合精度框架在AI 应用中得到广泛应用,使得专用处理器也受到广泛关注,用于评估混合精度计算性能的HPL-AI 基准应运而生。HPL-AI 基准的CPU 版本参考实现[20]于2019 年被提出。Kudo等[21-22]在超级计算机Fugaku[23]上成功部署了HPL-AI 基准测试,使其成为世界上第1 台在浮点算术性能上超过Exa-scale的超级计算机[24]。

不同于现有在NVIDIA 和AMD 等平台上部署HPL-AI 基准的研究,本研究基于鲲鹏和昇腾异构平台设计并实现单节点HPL-AI 基准测试,同时对其计算精度进行验证,以证明测试结果的准确性。通过采用循环任务分配和连续数据传输等优化策略保证各个AI 处理器之间的计算负载更为均匀,并缩短数据传输的时间。

1 HPL-AI基准规则

本节对HPL-AI 基准的规则进行简要介绍。HPL-AI与HPL类似,本质上都是利用LU分解[25]来求解大型线性方程组,即将一个方阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。HPL 中采用的是双精度模式,而HPL-AI 采用的是混合精度模式。因此HPL-AI 由两个重要部分组成:①方阵的混合精度LU分解;②使用①得到的LU因子进行迭代优化。

1.1 HPL-AI矩阵的特征

HPL-AI基准中要求解的线性方程组形如:

式中,N为矩阵A的阶。

HPL-AI 中的矩阵和HPL 中的矩阵一样,均是随机生成的。但不同的是HPL-AI 中的矩阵生成器需要保证初始矩阵是对角线占优的矩阵。本研究的矩阵随机生成器参考了HPL-AI 基准CPU 版本参考实现中的随机矩阵生成器。设ai,j为矩阵中的元素,其定义如下所示:

式中,drandlcg(·)为一个使用线性同余发生器(LCG)生成伪随机数的函数,而LCG是一种基于线性代数和模运算的算法,用于生成在给定范围内的伪随机整数序列,其递推公式如下所示:

式中,xn为生成的第n个伪随机数,a、c和m为在初始化时设定的常数,mod表示取模运算,将取模的结果作为下一个伪随机数。

Levy-Desplanques 定理指出:如果一个矩阵是严格对角占优的(SDD),那么其一定是非奇异矩阵,并且在没有旋转操作的LU 分解中的增长因子也很小[26]。然而,式(2)表明矩阵A是一个弱对角占优(WDD)矩阵,因此矩阵A有可能是奇异矩阵。但由于非对角线元素的随机性,在HPL-AI 基准测试中生成的矩阵基本都是非奇异的,并且其增长因子的变化类似于SDD 矩阵。因此,HPL-AI 基准不需要像HPL 基准那样在LU 分解过程中执行旋转操作[27]。

作为一个简单的示例,图1 给出了一个8×8 大小的矩阵A,并将其以2×2 的块大小进行分块,其中不同灰度表示不同的分块。矩阵的对角线元素是同行其他元素的和,以确保矩阵具有对角占优的特性。

图1 矩阵A的示例Fig.1 An example of matrix A

1.2 混合精度的LU分解

图2 HPL-AI中的LU分块分解Fig.2 LU block decomposition in HPL-AI

由于矩阵乘法中使用的是半精度算子,使得最终分解出来的因子也是半精度的,这会造成一定的精度损失,从而导致结果无法通过准确性检验,因此混合精度LU分解的结果还需要进一步的处理。

1.3 迭代优化

迭代优化的整个过程都是双精度的,其目的是得到符合精度要求的结果。结果是否符合要求主要通过后向误差E来定义:

式中,x为LU 分块分解求出的解,ϵ= 1.1 × 10-16,为64位浮点数的机器精度。在迭代优化结束时,若后向误差的值小于16,则认为结果符合精度要求。迭代优化的结束条件为达到最大迭代次数或后向误差满足要求。算法1给出了迭代优化的伪代码,其中L和U为由矩阵A通过LU分解得到的下三角矩阵和上三角矩阵,xcount为每轮迭代的解向量,rcount为每轮迭代解的误差向量。

算法1 迭代优化1:count←0 2:xcount←U-1L-1b 3:while count

HPL-AI基准测试的结果由LU 分块分解和迭代优化所需的时间决定,记为T,单位为s。HPL-AI基准测试的最终结果H定义如下:

2 单节点HPL-AI的实现

本节提出了基于鲲鹏和昇腾异构平台的单节点HPL-AI 基准测试的实现,并对异构平台和优化策略进行了详细介绍。

2.1 鲲鹏和昇腾异构平台

CANN(Compute Architecture for Neural Networks)是华为公司针对AI 场景推出的异构计算架构。CANN 通过提供多层次的编程接口,支持用户快速构建AI应用和服务。异构平台架构如图3所示,从图中可以看出,CANN 是以鲲鹏和昇腾为基础的。昇腾AI 芯片只支持单精度和半精度浮点运算,而鲲鹏CPU能够支持所有精度的浮点运算。

图3 鲲鹏和昇腾异构平台架构Fig.3 Heterogeneous platform architecture of Kunpeng and Ascend

CANN 主要分为两个部分:Host 和Device。Host对应CPU处理器,负责管理应用的运行逻辑以及控制Device 的运行流程。Device 对应AI 处理器,主要负责数值运算工作。在单节点中,硬件环境由1 个Host 和8 个Device 构成。Host 主要负责控制HPL-AI 的整体运行过程和部分数据运算;Device负责大部分耗时的数据运算。HPL-AI 中的数据运算主要为LU分解、Strsm、面元更新、Hgemm 和迭代优化。其中,Hgemm 是半精度运算,且是最为耗时的部分,由Device 负责;LU 分解、Strsm、面元更新为单精度运算,由Host负责。由于Device只能支持单精度和半精度的运算,所以双精度的迭代优化只能由Host负责。

2.2 多个Device的任务分配

Device负责运算量最大的半精度矩阵乘法,而单节点中Device 数量为8个,每轮所涉及的矩阵乘法是一个整体,要平衡Device之间的运算负载就需要对矩阵乘法进行分割。HPL-AI 基准采用的是分块LU 分解策略,因此,其初始矩阵A是分块的。矩阵的块状特性可以被用来对其进行合理分割。

如图4所示,矩阵A被分割成5个小块。这5个小块分别与矩阵B相乘来完成大矩阵乘法的分割,此时可以将5个小矩阵乘法均匀地分配给Device 来达到平衡运算负载的目的。此时,各个Device都需要保存完整的矩阵B,这会占据额外存储空间。

图4 矩阵乘法的分割Fig.4 Partition of matrix multiplication

在HPL-AI基准测试中,随着迭代的持续进行,每轮执行的矩阵乘法规模会越来越小,所涉及到的数据也会发生变化;同时,每轮迭代的矩阵乘法都有一个累加过程,而累加完的数据需要存储下来作为后续轮次的累加数据。如果其中一个任务在前k次迭代中都由Device0 负责,而在第k+1 次迭代时,让Device1负责该任务,那么此时Device1需要存储在Device0 上的前k轮次的累加数据来进行累加,这便需要一个数据传输操作来避免数据缺失。少量的数据传输不会带来很大的性能损失,但是频繁的数据传输会耗费大量的时间。因此,为了避免数据的频繁移动,每个Device所负责的任务必须在整个HPL-AI测试过程中保持不变。

在明确了任务在测试过程中不会发生归属性变动的情况下,也要保证任务能被均匀分配。如图2所示,随着测试迭代的深入,部分数据会变成已分解状态。已完成分解的数据相当于已完成的任务,这表明任务会随着迭代的进行而减少。因此,需要保证任务在各个Device之间均匀地减少以达到任务被均匀分配的目的。

初始矩阵A可以按行进行划分,每行的全部块组成一个任务。如图5 所示,一共有8 个任务,这8 个任务通过循环分配的方式被分配给了Device。图中假设一共有4 个Device,颜色的匹配情况对应了任务的分配情况。前4 轮迭代会完成任务1-4,这样保证了任务在4个Device中均匀地减少(4轮迭代4 个Device 各减少了一个任务)。因此,循环的任务分配方式能够使任务被均匀地分配。

图5 任务的循环分配Fig.5 Cyclic assignment of tasks

2.3 数据的连续搬运

图5所示的循环分配策略能让任务被均匀地分配,且在整个HPL-AI 流程中,不同Device 之间的任务数量之差的最大值为1,这被称为间隔值为1的循环分配。虽然间隔值为1的循环分配能够极大地保证任务数量在各个Device之间的均衡,但也要考虑数据传输的连续性。在每轮迭代的矩阵乘法执行之前,相应的左矩阵和右矩阵需要从Host端传输到各个Device 端中去。图4的矩阵乘法分割策略表明右矩阵在各个Device中是相同的,而左矩阵会被分成块,然后实施循环分配策略。如果采取间隔值为1的循环分配策略,那么每个Device 的各个任务所涉及的数据块是不连续的。从Host向Device发送数据是极其耗时的,在传送数据时应当尽量减少传送次数,即尽量保证数据是连续的。因此,应当考虑间隔值更大的循环分配策略。间隔值越大,任务分配越不均匀,而数据传输的效率越高。在循环任务分配的实现中,需要选取合适的间隔值以平衡任务分配的均匀性和数据传输的效率。

2.4 数据缩放的取舍

混合精度计算必定会涉及到精度之间的转换。在HPL-AI 整体流程中有两个步骤涉及到了精度转换:一是单精度的Strsm 和面元更新的结果需要转换为半精度后作为本轮半精度矩阵乘法的输入;二是半精度矩阵乘法的部分结果需要进行单精度转换后作为下一轮迭代中LU分解、Strsm 和面元更新的输入。高精度数据向低精度数据转换时会导致一定程度的精度损失,而数据缩放是减少精度损失的常见做法。数据的缩放能够保留浮点数的部分精度,主要通过在高精度数据转向低精度数据的过程中执行一个乘法而对浮点数进行放大,在低精度数据转向高精度数据时执行一次除法对浮点数进行缩小,其中乘法中的因数和除法中的分子是同一个值。

Kudo 等[22]在实现HPL-AI 基准测试时,提出并采用了数据缩放技术来减少精度损失从而缩短迭代优化所需的时间,但测试主要集中在多节点模型上。多节点所涉及的矩阵规模非常庞大,因此很有必要采用数据缩放策略。而在单节点中采取该策略则是值得商榷的,因为数据缩放会增加一定的数据运算时间,需要进行相应的实验来确定该策略在单节点中的必要性。

2.5 单节点HPL-AI测试的流程图

单节点HPL-AI 测试的整体流程如图6 所示。在单节点HPL-AI的具体实现中,需要充分利用可并行执行的环节来提高效率。例如,数据传输和数值运算可以并行执行,具体来说,是本轮矩阵乘法的计算和下轮矩阵乘法所需要的数据传输可以并行执行。Host 和Device 各自的任务也可以并行执行。HPL-AI基准测试要充分利用执行流程的并行性。

图6 单节点HPL-AI测试的整体流程Fig.6 Flowchart of our single-node HPL-AI implementation

3 实验评估

为了评估和验证单节点HPL-AI 在多核和多AI处理器的异构系统上的可靠性,本文在鲲鹏和昇腾异构系统中进行了一系列实验。在异构系统中执行HPL-AI测试程序,首先设置测试程序所需的参数,并测试不同参数下系统的浮点运算性能。

本节的所有实验均基于相同的软硬件环境。在单节点中,CPU 为4 个鲲鹏920 处理器;主机内存为1.5 TB;AI 处理器为8 个昇腾910AI 处理器;操作系统为Ubuntu 18.04.1 LTS;CANN 的版本为CANN 5.0.3. alpha005; BLAS 库为OpenBLAS 0.3.15. dev;C++编译器为kunpeng-gcc-10.3.0;OpenMP的版本为OpenMP 4.5。

3.1 数据缩放的案例分析

本节针对数据缩放对单节点HPL-AI 测试的影响进行了相关实验。数据缩放的缩放因子是根据矩阵的阶数N来确定的。由于初始矩阵A是块状的,通常是根据其块数bn和块大小bs来计算A的阶数;则缩放因子s的定义为

其中bs= 256,bn的值是变化的,且被用于控制矩阵的规模。

为了充分展现数据缩放对HPL-AI测试的影响,本研究拟在各种矩阵规模下进行实验。最后,通过对比采取和不采取数据缩放策略两种情况下迭代优化所花费的时间以及迭代次数,来判断数据缩放在单节点HPL-AI测试中的必要性。

如图7(a)、7(b)所示,采取和不采取数据缩放两种情况在迭代优化中所花费的时间非常接近,且这两种情况通过迭代优化得到正确结果所需要的迭代次数是完全一致的。图7(c)显示了这两种情况在不同bn取值下的浮点运算性能的测试结果。由于性能测试结果具有一定的波动性,故选取5次测试的平均值代表真正测试值。采取数据缩放会带来更多的计算开销,但可以看出采取数据缩放并没有对HPL-AI 测试的整体性能产生较大影响。这是因为HPL-AI 测试的整体流程是并行的,这部分多余的开销被与之并行且更为耗时的操作所覆盖掉了。但就迭代优化并没有受到数据缩放的积极影响这一方面而言,数据缩放操作在单节点HPL-AI 测试中可以省去。

图7 数据缩放对HPL-AI测试的影响Fig.7 Effect of data scaling on HPL-AI testing

3.2 循环任务分配间隔的案例分析

前文中提到了循环任务分配测量是保证任务在整个HPL-AI 测试流程中被平均分配的前提,而循环任务分配的间隔值会影响到数据传输的速率以及任务分配的均匀性。本节将通过实验选取最为合适的间隔值来在两者之间达到平衡。

从图7(c)中的结果可以看出,矩阵规模越大,越能发挥单节点的浮点运算性能。因此,在HPLAI测试实验中,选取单节点能够承受的最大矩阵规模,即bn= 1400。在选取最大矩阵规模的情况下,通过对比不同间隔下的浮点运算性能,进一步选取合适的间隔值大小。

HPL-AI在不同间隔值下的性能如图8所示,间隔值为1时的浮点运算速度是最低的。虽然最小间隔最大限度地保障了任务分配的公平性,但此时的数据传输开销导致运算性能大大降低。然而这并不意味着间隔值越大,浮点运算性能就越好。当间隔值大于8时,浮点运算性能开始下降,这主要是任务分配不均匀导致的结果。如果涉及的间隔范围更大,在后续一定会出现性能急剧下降的情况。因为间隔越大,分给某个Device的任务数量就越可能远多于其他Device,从而导致其占有过多的任务或者内存空间不足。因此,后续的实验将选取间隔值为8以达到最好的浮点运算性能。

图8 不同间隔值下的浮点运算性能Fig.8 Floating-point arithmetic performances at different intervals

3.3 优化策略的性能对比

本节将通过对比采取优化策略(优化实现)和未采取优化策略(非优化实现)的HPL-AI 基准测试之间的混合精度浮点运算性能来验证优化策略的有效性。为了充分发挥单节点的性能,本节实验也同样选取其所能承受的最大矩阵规模。

图9对比了优化实现和非优化实现10次的测试结果,表1则列出了测试结果的具体数值。实验结果表明:优化后的HPL-AI测试结果有较大的提升,其平均浮点运算性能相比原来提升了29%左右。在迭代优化方面,优化实现只需两轮迭代即可符合要求,这证明优化实现的结果具有更高的精度。在矩阵规模相同的情况下,迭代优化中每轮迭代的计算量是相同的,迭代优化的次数越少,所花费的时间也越少。

表1 优化和非优化实现之间混合精度浮点运算的性能测试结果Table 1 Performance results of mixed-precision floating-point arithmetic of optimized and non-optimized implementations

图9 优化和非优化实现之间混合精度浮点运算的性能对比Fig.9 Performance comparison of mixed-precision floatingpoint operations between optimized and non-optimized implementations

表2 展示了单节点HPL-AI 中各个环节所花费时间。由于HPL-AI 测试的高度并行性,各个环节的时间并不完全准确(耗时少的环节被耗时多的掩盖掉了)。在所有环节中,矩阵乘法和迭代优化是最为耗时的。优化后的基准测试实现在这两个环节上所耗费的时间更少,因此优化后的HPL-AI 基准测试具有更好的性能。

表2 单节点HPL-AI基准测试中各环节所花费时间对比Table 2 Comparison of time spent on each part of single-node HPL-AI implementations

4 结语

近年来,混合精度求解器已被广泛应用于多种高性能应用中,用于评估混合精度运算性能的HPL-AI 基准测试也应运而生。虽然HPL-AI 基准的规则是统一的,但在不同平台上的实现和部署仍具有一定的挑战性。本文采用循环任务分配和数据连续传输等优化策略提出了基于鲲鹏和昇腾异构平台的单节点HPL-AI 基准测试方案。实验结果表明这些优化策略能有效地提高混合精度浮点运算的性能。与非优化的情况相比,计算性能提高了29%左右。

通过采用本文所提出的优化策略,HPL-AI 测试的性能已经有了较为明显的提升,但其实现和部署还存在一定的优化空间。例如,在HPL-AI测试的实现中Strsm 和面元更新的计算过程由Host 负责,导致Device的计算能力未被充分利用。在未来的工作中,可以将Strsm和面元更新等环节转移到Device上,以进一步提升单节点HPL-AI测试的性能。

猜你喜欢
基准运算精度
重视运算与推理,解决数列求和题
有趣的运算
基于DSPIC33F微处理器的采集精度的提高
“整式的乘法与因式分解”知识归纳
拨云去“误”学乘除运算
明基准讲方法保看齐
GPS/GLONASS/BDS组合PPP精度分析
滑落还是攀爬
改进的Goldschmidt双精度浮点除法器
巧用基准变换实现装配检测