英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料
使用Python高效开发高性能数据分析
J. Aacute;lvarez Cid-Fuentes, P. Aacute;lvarez, R. Amela et al
Barcelona Supercomputing Center (BSC), Spain
Fujitsu, Ltd., Japan
Artificial Intelligence Research Institute (IIIA), Spanish National Research Council (CSIC),Spain
摘 要
我们的社会正在以前所未有的规模,多样性和速度生成越来越多的数据。这也适用于许多研究领域,例如基因组学,高能物理和天文学,对于这些领域,大规模数据处理已变得至关重要。但是,传统的科学计算生态系统与大数据分析工具和框架之间仍然存在差距。一方面,高性能计算(HPC)编程模型缺乏生产力,并且没有提供以简单方式处理大量数据的手段。另一方面,现有的大数据处理工具在HPC环境中存在性能问题,并且不是通用的。在本文中,我们提出并评估了PyCOMPSs(一种基于任务的Python编程模型),作为HPC基础架构中分布式大数据处理的出色解决方案。除其他有用功能外,PyCOMPS还提供了高效的通用编程模型,与基础架构无关,并通过支持分布式存储系统来提供透明的数据管理。我们展示了如何使用PyCOMPS开发两种机器学习算法(级联SVM和K-means),并基于这些算法评估PyCOMPS的生产率。此外,我们使用多达1,536个内核和3.2亿个输入向量来评估HPC群集上的PyCOMPS性能。我们的结果表明,PyCOMPS在HPC基础架构中实现了与MPI相似的性能和可伸缩性,同时提供了更高效的接口,可轻松开发数据分析算法。
简介
整个社会生成的数据量正在以极快的速度增长。预计到2020年,有用数据量将超过16 ZB(即16 1012GB).从这些大数据中提取有用的信息可能会对许多社会活动产生巨大影响,例如医疗保健,制造或城市规划.除此之外,在众多研究领域,例如生物学,天文学或高能物理等许多其他方面.
从大量数据中提取有用信息的过程也称为大数据分析(BDA).BDA涉及使用各种操作对数据进行转换,例如排序,聚合或过滤;以及使用机器学习算法来获取新信息并发现数据模式.BDA中的主要挑战包括有效地表示异构数据,消除数据冗余,以可伸缩和容错的方式存储大量数据,构建可伸缩算法,有效传输大量数据以及可视化高维数据.这些挑战促使了一些BDA专用工具的出现,例如面向数据的编程模型,例如MapReduce和Apache Spark ;NoSQL数据库,如Apache Cassandra 、分布式文件系统以及Hadoop文件系统.
尽管BDA已在许多科学领域中变得至关重要,但是传统的科学计算工具并未提供有效的BDA手段。除此之外,现有的BDA工具并非为传统的科学计算设施而设计,例如高性能计算(HPC)集群.BDA和HPC之间的这种差距在编程模型中特别严重.一方面,科学计算编程模型,例如OpenMP 和消息传递接口(MPI)的实现并非针对数据管理,且缺乏快速开发BDA算法所需的生产力。另一方面,现有的BDA框架与某些HPC组件(例如批处理队列系统)不兼容,因此需要在HPC群集中部署更多的集成工作.这就需要通用编程模型,以最小的开发人员精力在HPC基础架构中编写和执行BDA算法。
在本文中,我们提出并评估了PyCOMPS 作为弥合BDA和HPC编程模型之间差距的一种方法。PyCOMPSs是基于任务的编程模型,可用于轻松构建和执行并行Python应用程序。一方面,与传统的科学计算编程模型(如MPI和OpenMP)相比,PyCOMPS提供了更高的API。另一方面,与现有的BDA工具(如Spark)不同,PyCOMPS与HPC基础架构完全兼容。此外,PyCOMPSs允许开发人员从头开始编写新的分布式机器学习或BDA算法,以及并行化其现有的Python代码。这意味着PyCOMPS不受特定算法的束缚,并且与现有的分布式机器学习库相比,过时的风险要低得多。最后,PyCOMPS具有基于Python的优势,它提供了很高的生产率,并且是数据科学家中最流行的编程语言之一.
在第二节中,我们总结了相关工作,重点介绍了HPC基础架构中BDA现有方法的局限性,并解释了PyCOMPS如何克服这些局限性。在第三节中,我们将介绍PyCOMPSs编程模型,并讨论使PyCOMPSs成为HPC基础架构中BDA理想选择的功能。在第四节中,我们介绍了两种著名的机器学习算法的PyCOMPSs实现:Cascade SVM和K-means。在第五节中,我们将这些实现的代码复杂度与MPI中的相同算法进行比较。在第六节中,我们比较了PyCOMPS和MPI的性能,在第七节中我们提出我们的结论。
2. 相关工作
消息传递接口(MPI)是用于HPC群集的一种广泛使用的分布式编程范例.尽管MPI可用于构建机器学习和数据分析算法,它要求开发人员手动处理通信,数据传输和负载平衡。相反,PyCOMPSs以透明的方式自动管理所有这些方面,并提供了更为简单的编程模型,该模型使开发人员从并行化细节中抽象出来。
BDA最杰出的框架是Apache Spark。Spark基于弹性分布式数据集(RDD)的思想,该数据集是可以并行操作的分布式数据结构。Spark提供了一种高效的编程模型,该模型可用于在RDD上使用相对较小的一组操作(例如映射,缩小和过滤)来编写许多BDA算法。此外,Spark会尽可能将数据保留在内存中,以加快访问速度。Spark的缺点是很难在HPC群集上部署,在某些情况下表现不佳,并在开发人员上实施特定的程序抽象。
PiCo是与Spark相关的最新框架。PiCo统一批处理和流数据访问模型,并将程序定义为对数据的并行操作序列。像在Spark中一样,这些操作是在PiCo的API中预定义的。与Spark相比,PiCo通过提供一组类似的操作来提供类似的生产力,同时在HPC基础架构中在执行时间和内存占用方面均实现了性能改进。
与Spark和PiCo相反,PyCOMPS不对开发人员强制执行特定的程序抽象或API。借助PyCOMPS,开发人员可以仅使用一小部分注释来构建具有任意结构的并行程序。PyCOMPS具有比Spark和PiCo更高的表达能力,并且不需要用户重新考虑其问题以将其调整为特定的结构。
高性能分析工具包(HPAT)是专门为HPC基础架构设计的BDA框架。HPAT基于向量运算的并行化,这在许多机器学习算法中很常见。HPAT提供了用于数据访问的API,然后能够自动并行化对加载的数据执行的矩阵向量和矩阵矩阵操作。更准确地说,HPAT根据Julia和Python中的高级算法定义生成MPI / C 代码。这样,HPAT可以在HPC群集上提供高生产率和MPI / C 相当的性能,而无需在Spark和PiCo等开发人员上强制使用特定的API。
HPAT在通过代码注释自动检测应用程序的并行性方面更类似于PyCOMPS。但是,HPAT仅检测矢量运算中的并行性,而PyCOMPS可以用于并行化可以表示为任务集合的任何算法。
Swift / T 是一种编程语言和分布式运行时,它允许在分布式平台(包括HPC群集)上执行并行工作流。Swift / T的分布式设计在并行任务数量和计算资源方面都提供了出色的可伸缩性。Swift / T应用程序是用Swift语言编写的,而分布式执行则由MPI驱动。PyCOMPS与Swift / T的不同之处在于,它不需要开发人员学习新的编程语言。相反,用户只需要在其常规Python应用程序上插入简单的代码注释即可。其他现有的BDA框架,例如JS4Cloud 是专为云基础架构而设计的,尚不清楚它们与HPC群集的集成。
与现有方法相比,PyCOMPS在灵活性,生产率和性能之间提供了最佳折衷。PyCOMPS提供了一种高效的编程模型,该模型不会强迫开发人员将其问题适应特定的API或学习新的编程语言。此外,PyCOMPS支持分布式存储系统,并且可以在多个平台和体系结构中执行。
3. PyCOMPSs概述
PyCOMPS 是基于任务的编程模型,可简化并行和分布式Python应用程序的开发。PyCOMPS由两个主要部分组成:编程模型和运行时。编程模型提供了一系列简单的注释,开发人员可以使用它们来定义其应用程序中潜在的并行性。运行时在执行时分析这些注释,并在可用资源之间自动分配计算。PyCOMPSs编程模型的主要组成部分是任务注释,它定义了可以远程执行的计算单位。由于PyCOMPSs的运行时是用Java编写的,因此Python语法是通过绑定提供的。
3.1. 程式设计模型
PyCOMPSs应用程序是带有某些批注的常规Python应用程序,可帮助运行时利用并行性。PyCOMPSs应用程序由两部分组成:主要顺序代码和任务定义。主要的顺序代码是应用程序的入口点,而任务定义只是带注释的功能。要将函数标记为Python中的任务,我们采用了@task装饰器,如图所示图。
图1
@task装饰器可以应用于任何类型的函数,包括类方法,并且带注释的函数可以用作应用程序主代码中的常规函数。
@task批注可以采用各种参数。唯一的强制参数是任务参数的方向和返回值的类型。任务参数可以是原始类型,例如整数和浮点数,文件和可序列化的对象。其中包括来自广泛使用的库,如NumPy和scikit-learn 。direction参数定义参数是只读,只写还是两者兼有,因此可以为常规Python对象采用三个值:IN,OUT和INOUT;以及三个文件值:FILE,FILE_OUT或FILE_INOUT。如果未指定,则假定参数为IN。PyCOMPS还支持使用* args和** kwargs作为任务的输入参数。
PyCOMPSs的编程模型还提供了@ openmp,@ mpi和@binary装饰器。这些可用于创建运行不同类型的二进制文件的任务。除此之外,硬件可以使用@constraint装饰器定义任务的软件要求。通过这种方式,可以强制在特定类型的资源(例如GPU)中调度任务。最后,PyCOMPS还提供了用于插入同步点的最小API。这可以通过名为compss_wait_on的函数来完成。PyCOMPSs编程模型的简单性允许以一种高生产率的语言快速开发数据分析算法,这种语言在科学界广泛使用,并且被大型数学库生态系统所包围。而且,只要在其中包含一些注释,就可以轻松地并行化任何现有的Python应用程序。
3.2. 运行
PyCOMPSs的运行时遵循主从方法。主进程执行应用程序的主代码,并将计算工作分配给一系列远程工作者。图2 展示了PyCOMPSs应用程序的执行示意图。
图2
主进程截取对带注释的函数的调用,并将任务插入数据依赖图中,而不执行函数代码。主服务器从任务参数的方向推断数据依赖关系,其中使用重命名避免了写后写依赖和读后写依赖。将任务插入到依赖关系图中是一个异步过程,也就是说,任务返回的对象在应用程序的主代码中被视为将来的对象。主进程可以通过调用compss_wait_on(object)来检索任务结果的实际值。此呼叫等待任务完成图形。默认情况下,PyCOMPS使用先进先出的调度策略来最大化数据的局部性。计划任务后,主服务器确保将必要的数据传输到工作节点。主人和工人之间以及不同工人之间可能发生转移。对象被序列化并写入磁盘以在不同的存储空间之间传输它们。除此之外,PyCOMPS可以配置为使用分布式文件系统或分布式存储系统,例如Redis 和dataClay 。对于分布式文件系统,主服务器假定工作人员有权访问所有文件,并且不会传输它们。对于分布式存储系统,PyCOMPS支持将对象存储在内存中以减少磁盘访问的开销。这可以加快将转换序列并行应用于多个数据的数据分析应用程序的速度。
PyCOMPS的运行时通过任务的重新提交和重新安排提供容错功能。除此之外,PyCOMPS还提供实时监控,并支持生成验尸执行程序Paraver痕迹。
最后,PyCOMPSs与基础架构无关,也就是说,PyCOMPSs应用程序可以在不修改源代码的情况下在不同的基础架构中运行。这包括云,群集,网格和容器化平台。为了实现这一目标,PyCOMPS支持与Slurm到Apache Mesos 。除此之外,PyCOMPS还支持异构架构,包括GPU和FPGA .
PyCOMPSs的设计使其成为HPC群集中BDA的出色解决方案。一方面,在存在负载不平衡的情况下,PyCOMPS的动态任务调度可最大程度地利用资源。这与处理时间取决于数据性质的数据并行应用程序有关。在这些情况下,其他静态分配工作的执行框架(如MPI)可减少资源使用。另一方面,除非使用分布式存储系统,否则PyCOMPS会将数据序列化到磁盘。这可能比将数据保存在内存中效率低,但与其他面向内存的框架(如
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[254497],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。