一种基于Flink的大规模矩阵并行化的计算方法

文档序号:9844077阅读:1574来源:国知局
一种基于Flink的大规模矩阵并行化的计算方法
【技术领域】
[0001]本发明涉及分布式计算领域,尤其涉及一种基于Flink的大规模矩阵计算库的设计与实现方法。
【背景技术】
[0002]矩阵计算在众多工业界、学术界的领域起着重要的作用,例如大规模数值分析、数据挖掘、物理计算以及图像渲染等。一直以来,人们都在研究高效的矩阵相乘、求逆等诸多算法,以追求提升构建在矩阵计算之上的应用的性能。在如今“大数据”的时代背景下,随着数据量的飞速增长,矩阵的规模往往也会变得非常的庞大,以至于传统的单个计算机已经无法对之进行存储、计算。
[0003]矩阵运算包括矩阵的相加、相减、相乘、求逆等诸多操作。矩阵的相加、相减等计算较为简单,一般通过join(连接)两个矩阵即可完成。矩阵相乘运算相对于矩阵相加、相减等操作复杂度较高。一般分布式矩阵相乘采用矩阵的分块相乘算法。这种算法通过将矩阵划分成一个个相对较小的块矩阵,一方面保证了每次计算的矩阵变得较小,避免了过大的矩阵无法计算的问题,另一方面又因为各个块矩阵的计算是相互独立的,使得算法可并行化。矩阵求逆运算通常采用Gauss-Jordan消元算法。在求解方程AX = E的过程时,我们只需要对A进行初等列变换,将其转化为一个单位矩阵,同时E也跟着做相同的变换,则最终E将会变成A矩阵的逆矩阵,其中A为所需求逆的矩阵,E为单位矩阵。Gauss-Jordan消元求逆算法同样可以并行化,在对大规模的矩阵进行求逆时使用并行化的Gauss-Jordan求逆算法可以加快矩阵求逆的速度。
[0004]已有的一些分布式矩阵相乘算法,如SUMMA、HAMA等,是基于MPI或者HadoopMapReduce等分布式计算框架上实现的JPI编程十分繁琐,有太多与算法无关的细节需要开发者去考虑,并且其扩展性也不够理想,当计算机数量不断的增加时,MPI的性能甚至可能会下降很多。另外,MPI并不提供容错,这也需要开发者去实现容错或直接放弃系统的容错。利用Hadoop MapReduce来实现矩阵的分块相乘计算也不够理想。Hadoop MapReduce的每次计算都会将中间结果存储到磁盘中去,这就大大降低了程序的计算效率。另外MapReduce只提供map和reduce两种操作方式,这使开发复杂的矩阵相乘计算变得更加困难。对于大规模矩阵的求逆计算,也有在MPI上的实现,这类算法也同样存在那些MPI上的缺陷。还有人利用GPU的并行计算能力来实现矩阵的求逆计算,但由于高性能的GPU本身的价格过于昂贵,其实用程度也大大的降低了。
[0005]Flink是一个高效的基于内存计算的分布式数据处理平台,是Apache的顶级项目之一。它的核心是一个流式数据流引擎(Streaming dataflow engine),提供了数据流的分布式数据分布、通信和容错功能,具有高效、可靠、可扩展等特性,并且与Hadoop生态系统有着很好的兼容性。Flink使用DataSet来描述并行计算的数据集,并对相应的数据集提供了丰富的诸如map、reduce、join、group之类数据处理接口。然而,标准的Flink提供的并行化操作算子都比较底层,不易于高层的算法分析人员掌握,且使用方式不如矩阵等线性代数的接口清晰简洁。另一方面,目前还没有基于Fl ink设计实现的大规模分布式矩阵计算库。

【发明内容】

[0006]发明目的:针对上述现有技术的不足与缺陷,本发明的目的是提供一种基于Flink的大规模矩阵并行化的计算方法,能够高效地对大规模矩阵进行相加、相乘、求逆等计算。
[0007]技术方案:为实现上述发明目的,本发明采用技术的方案为一种基于Flink的大规模矩阵并行化的计算方法。包括以下步骤:
[0008](I)首先,利用FlinkDataSet(数据集数据结构)对大规模矩阵数据进行存储。在单个计算机上对矩阵进行计算时采用BLAS(基础线性代数子程序库)对矩阵计算进行加速;
[0009](2)然后,利用FlinkDataSet的join操作,对两个矩阵对应位置的元素进行运算,从而实现了大规模矩阵的相加、相减、标量运算等一些较为简单的矩阵计算;
[0010](3)接着,对于大规模矩阵相乘,采用分布式矩阵分块相乘算法实现。针对三种不同规模的矩阵采用了相应的优化算法来优化矩阵的运算:对于两个维度规模近似方形矩阵的矩阵,采用基于方块划分方式的矩阵分块相乘;对于维度规模相差较大(一般指相差一个数量级,即10倍或10倍以上)的两个矩阵,采用基于标准的CARMA划分方式的矩阵分块相乘;对于两个矩阵中有一个规模较小的矩阵(一般矩阵元素总数在10000个之内),则采用基于广播方式的矩阵分块相乘;
[0011 ] (4)最后,对于大规模矩阵求逆算法,通过改进Gauss-Jordan消元求逆算法每次迭代只使用一列向量来更新矩阵的缺点,使得矩阵求逆过程中一次迭代可以用多列向量来更新整个矩阵,从而减少了矩阵求逆算法的迭代次数。
[0012]进一步地,所述步骤(I)中,使用了矩阵行向量存储方式和块矩阵存储方式,分别用于矩阵的描述和矩阵的乘法与求逆计算。
[0013]进一步地,所述步骤(I)中,使用Net-1ib的JNI(JavaNative Interface)调用底层CPU来实现java对BLAS的调用以加速矩阵的计算效率。
[0014]进一步地,所述步骤(2)中,对行向量矩阵和块矩阵分别实现相应相加、相减等操作。
[0015]进一步地,所述步骤(3)中,使用一个判别算法来对矩阵选择不同优化算法进行相乘计算:当两个矩阵为方形矩阵或者是近似方形的矩阵时,选择基于方块划分的方式对矩阵进行分块;当矩阵的两维相差较大时,选择基于CARMA(Communicat1n-AvoidingRecursive Matrix Multiply,通信避免的递归矩阵乘法)的划分方式来对矩阵进行分块;
当相乘的两个矩阵中有一块较小时,广播较小的矩阵到大矩阵所在的计算机进行相乘计笪并ο
[0016]进一步地,所述步骤(4)中,不再像Gauss-Jordan消元求逆算法那样每次迭代只用一列列向量去更新整个矩阵,而是每次用多个列向量去更新整个矩阵,从而降低了算法的迭代次数,减少了迭代所带来的开销,提高了算法的效率。
[0017]有益效果:本发明能够有效地实现大规模矩阵的计算:第一,利用Flink的DataSet来实现大规模矩阵的存储并在每个计算机上都使用BLAS来加速矩阵的计算速度。在大规模矩阵的计算过程中,矩阵以及矩阵计算的中间结果可能无法存储到单个计算机的内存中。利用FlinkDataSet能够使数据尽可能地存储在集群上的计算机的内存中,从而有效地提高了计算效率。在每个计算机上,使用底层线性代数计算库来加速矩阵的计算。第二,提供了诸多分布式环境下的大规模矩阵计算接口。本发明实现了包括矩阵的相加、相减、相乘、求逆等运算,使用户在面对大规模矩阵时能够轻松地使用矩阵的各类计算实现所需的应用。第三,在处理大规模矩阵相乘时,本发明采用了三种不同的优化算法来针对不同规模矩阵相乘的情况,从而提高了不同规模矩阵相乘的效率。同时,本发明还提供了一种自动选择方案来针对各类矩阵相乘的情况选择相应的相乘算法,保证了算法对用户的透明性和易用性。第四,在处理大规模矩阵求逆时,本发明提出了一种基于Gauss-Jordan消元求逆算法的优化算法。通过降低原有算法的迭代次数,减少了迭代所带来的额外开销,从而提高了大规模矩阵的求逆效率。
【附图说明】
[0018]图1为本发明的系统框架图。
[0019]图2为本发明中基于方阵划分方式的矩阵分块相乘算法示意图。
[0020]图3为本发明中优化后的矩阵求逆算法示意图。
[0021 ]图4为本发明中三种矩阵分块相乘优化算法的效果图。
[0022]图5为本发明中优化后的矩阵求逆算法与未优化的矩阵求逆算法效果图。
【具体实施方式】
[0023]本发明是一种基于Flink的大规模矩阵并行化的计算方法,提供了包括了矩阵的加、减、点乘、点除、矩阵相乘、矩阵求逆等一系列矩阵运算接口并在系统底层使用BLAS来加速矩阵运算的效率。本发明的系统框架如图1所示。
[0024]本发明使用了两种数据结构来描述矩阵:行向量矩阵和块矩阵。行向量矩阵描述的是矩阵最普遍、直观的表示形式,它是一个由矩阵行号和该行号所对应的行向量构成的元组的集合所组成,我们从文件读入或写出到文件中时都是这种形式的矩阵。块矩阵则是一组已经分好块的矩阵块和对应的块编号的集合,因为在矩阵的一些运算中,经常可以看到并行化的算法都需要对矩阵进行分块,在矩阵相乘和矩阵求逆时就利用块矩阵来对矩阵进行并行化计算。另外这两种矩阵之间可以相互转换。
[0025]对于矩阵的加法、减法、点乘、点除等操作,
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1