英语原文共 9 页
国际计算科学大会,ICCS2017,2017年6月12日至14日,瑞士苏黎世
并行Python应用程序的性能分析
Michael Wagner 1, Germacute;an Llort 1,2, Estanislao Mercadal 1,2, Judit Gimacute;enez 1,2,Llort 1,2,
Estanislao Me
1 巴塞罗那超级计算中心(BSC),巴塞罗那,西班牙
超级计算机中心(BSC),
michael.wagner@bsc.es
2 加泰罗尼亚理工大学(UPC),巴塞罗那,西班牙
摘要:
Python凭借其简单的语法、丰富的标准库和强大的第三方科学计算库,逐渐在HPC系统内进行整合,这对于领域科学家尤其具有吸引力。尽管Python降低了惊醒并行计算的门槛,但是有效利用HPC系统的能力仍然是一项具有挑战性的任务。然而,目前只存在少数支持工具,并且仅以概括简单数据文档的形式提供基本信息。在本文中,我们介绍了在性能监视器Extrae中开发基于事件的Python跟踪支持的工作,以提供详细信息并实现深入的性能分析。我们提出了用来记录完整的通信行为的概念,以及捕获Python中函数的调入和调出,以提供相应的应用程序上下文。我们已经通过分析完善的电子结构仿真软件包GPAW来评估我们在Extrae中的实现,并证明记录的跟踪提供了与传统C和Fortran应用程序相同的信息,因此,现在也要为Python提供相同的深度分析功能。
1.介绍
虽然在高速计算机上运行的编程语言的基本上被Fortran和C垄断,但在高速计算机系统之外流行的其他编程语言正在努力获得成功。Python是一种广泛使用的高级编程语言,其自我声明的目的是为了能使允许快速简便的程序开发。它的特点是语法简单,动态数据类型,强大的数据结构和大型标准库。结合第三方科学计算库,如NumPy和SciPy,这样就可以理解Python为什么会对对领域科学家特别有吸引力。
使用Python的并行计算,包括Python标准库中的包,如多处理模块和外部Python接口,以及用于并行运行时的消息传递(如MPI4Py)。MPI4Py提供了MPI与面向对象的接口的绑定,类似于C ,允许任意Python对象的通信。此外,MPI4Py支持NumPy阵列的优化通信,其速度接近于C或Fortran中的通信速度。
将Python的优势(例如快速开发和高级算法)与C中性能关键部分的实现相结合(例如,使用BLAS,LAPACK,NumPy的主数值内核;以及与MPI4Py的MPI通信)是计算机高速平台中最成功的计算方法,到目前为止。就像GPAW已经证明了大约25%的峰值性能和良好的扩展到数万个核心。
尽管Python在HPC世界中越来越多地自我整合,但合适的工具支持仍然很少。目前,出于性能分析的目的,还有一些基本的支撑需要分析。例如,通过Python模块概要和cProfile提供的概括功能级或行级定时信息。但是,仍然缺少更高级的工具支持,例如基于事件的跟踪。与汇总式分析不同,基于事件的跟踪单独记录运行时事件,例如调用功能或通信操作。因此,虽然配置文件可能缺少关键信息并隐藏动态发生的影响,但基于事件的跟踪允许捕获数千个并发处理元素之间的动态交互,并且能够从常规行为中识别异常值。因此,基于事件的跟踪允许更详细深刻的分析,并且不仅帮助开发人员识别其应用程序中的性能问题,而且还帮助他们理解他们在复杂且日益异构的HPC系统上的行为。
在本文中,我们会了解到在性能监视器Extrae中为Python开发基于事件的跟踪支持的努力。我们在这篇论文中要介绍的首先是捕获Python中函数的进入和退出的概念;第二,使用MPI4Py或自定义MPI绑定记录Python应用程序的完整通信行为的方法; 第三,我们用GPAW展示了我们的原型实现的功能,GPAW是一个完善的电子结构模拟软件包,需要用Python和C实现,并用MPI进行大规模并行化。
本文以下部分结构如下。在第2节中,我们介绍相关研究并区分我们的工作。在第3节中,我们重点介绍了记录函数进入/退出和通信事件的概念和实现。在第4节中,我们评估了当前的实际情况,并展示了其对并行Python应用程序性能分析的能力。最后,我们在第5节结束我们的工作。
2.相关工作
生成基本汇总信息的最常用方法是Python模块配置文件和cProfile与pstats的结合。Profile和cProfile提供程序各个部分的累计持续时间和调用次数的统计信息。两者都输出相同的信息,并且大部分是可互换的;主要区别在于cProfile是C扩展,开销较小但兼容性较差。可以通过在导入分析模块的任何Python脚本中调用cProfile.run(lt;functiongt;)而不是lt;functiongt;来分析函数。还可以通过将-m cProfile添加到Python命令来调用CProfile作为脚本来分析另一个脚本。生成的统计信息可以通过pstats模块格式化为简单的文本报告。在并行执行中,为每个进程生成输出,并且将输出合并,这需要一些额外的处理以提供有意义的结果。
TAU性能系统允许分析并行Python应用程序并产生与cProfile类似的结果,但是具有GUI表示。此外,作者还讨论了运行和分析并行Python应用程序时出现的一些其他问题,例如,每个模块都是为每个进程冗余导入的事实,在启动时创建了开销。不幸的是,作者只提到使用TAU而没有详细说明如何收集性能信息。
除此之外,商业工具Allinea MAP和Intel Vtune支持混合Python和C/Fortran应用程序。Allinea MAP拥有随时间提供基本系统信息的功能,例如CPU和内存利用率;可以在没有Python特定支持的情况下访问它。英特尔的VTune的摘要信息基于混合Python和C/Fortran应用程序的定期抽样,但他们提到了精度和Python数据收集方面的一些限制。然而,在撰写本文时,我们无法找到有关这些工具的可用Python支持的更多详细信息。
所有上述工具的共同之处在于它们提供了基本的概括分析信息。相比之下,我们提出了一种基于事件的跟踪方法,该方法允许进行详细而深刻的分析,尤其是对并行行为和进程间依赖性的分析。此外,我们还描述了获取性能数据的方法,这在以前的工作中所不具备的。此外,我们评估和讨论了众所周知的大规模并行应用程序的分析功能。据我们之前的叙述,这在以前没有被提到过。
3.实施方式
在本节中,我们将讨论为Extrae检测包开发的扩展,以支持基于事件的函数入口/出口跟踪和Python的通信事件。Extrae是一个开源跟踪框架,提供仪器和采样机制,以自动收集最常见的并行编程模型的性能测量(例如MPI,OpenMP,POSIX线程等)。 Extrae捕获的信息通常包括并行运行时的活动(例如MPI中的消息交换),以及性能计数器和调用栈信息,以将测量值与实际源代码相关联。 此外,可以手动或自动检测源代码功能。 同样,基于事件的Python应用程序监控的两个主要目标是,首先捕获对并行运行时的调用,其次,提供源代码上下文。
3.1MPI的仪器
传统(C或Fortran)MPI应用程序的基于事件的跟踪是大多数性能分析工具支持的众所周知的技术。最常见的方法是依赖于MPI标准分析界面(PMPI)。可以使用MPI或PMPI前缀调用每个MPI函数,这允许工具通过使用MPI前缀重写函数来拦截程序对MPI的调用。新功能可以捕获性能数据,然后通过调用关联的PMPI函数执行相应的消息传递操作。
一个方便的函数替换方法是将所有新的包装函数捆绑在一个共享库中,以便在运行时加载。这样就可以从动态链接的二进制文件中替换MPI调用,而无需访问源代码,也不必重新链接。这种方法的实现主要可以通过将LD PRELOAD环境变量设置为重新定义MPI符号的共享对象的路径来实现。该库将在任何其他库之前加载,从而替换MPI运行时的原始实现。大多数UNIX系统都支持通过LD PRELOAD环境变量使用用户自己的这些函数版本覆盖标准库的函数,这使得它成为透明地执行符号替换的首选方法。此外,它允许从Python程序开始直接跟踪MPI,因为MPI-for-Python包如MPI4Py里面包含了MPI标准的C绑定到可以动态插入的外部共享对象。
这使得能够以类似于纯C或Fortran代码的方式捕获Python脚本或混合Python C/Fortran场景中的MPI调用的进入和退出以及典型的性能特征对代码进行操作。但是,由于缺少应用程序上下文,纯MPI工具仅提供有限的信息。因此,第二个目标是用源代码检测来补充MPI信息。
3.2源代码上下文的仪表
提供应用程序上下文的工具的常用方法是存储本机调用堆栈(或其部分)以将性能归因于源代码。但是,此方法不能应用于解释执行中的上下文,因为本机调用堆栈的回溯不是指实际脚本的执行流程,而是指解释器的解析过程。为跟踪添加上下文的另一种用处是检测程序的(主要)功能。有许多方法可以解决这个问题,包括源到源编译器,带有finstrument-functions的自动编译器检测,二进制重写或动态注入监视探针。 同样,这些方法不能应用于解释的执行,因为目标程序不是实际的脚本而是Python解释器。
为了支持Python中函数入口/出口的跟踪,我们依赖于sys模块。该模块提供对解释器使用或维护的一些变量的访问,以及与解释进行交互的函数,包括分析功能。sys.setprofile方法允许在Python中实现Python源代码的析器,方法是设置一个在调用时调用的回调例程并返回脚本函数的事件。它接收三个参数:frame,event和arg,它们分别标识当前堆栈帧,是入口还是退出事件,以及其他参数。这样可以跟踪脚本中调用的函数,并将活动存储在跟踪中。
接下来,在混合的Python C/Fortran执行中,还可以通过已有的方法从C/Fortran部分记录源代码上下文,例如,通过堆栈展开方法存储MPI调用的调用上下文。
3.3 Python提取模型
为了支持用户函数和两者捕获MPI事件,我们开发了一个新的Python模块,可以直接导入到用户的Python脚本中。该模块简单地捆绑了三个主要要求便于跟踪记录。首先,它提供了基于ctypes的跟踪库的动态插入。 Ctypes是Python的外来函数库,它提供C兼容的数据类型,并允许在共享库中调用函数。Ctypes导出cdll对象以加载动态链接库,这允许通过cdll.LoadLibrary方法挂钩跟踪库,其效果类似于将库预先加载到二进制可执行文件中。有了这个,我们可以加载截取MPI库的Extrae库来捕获对这个运行时的调用。
其次,它激活Python分析器以跟踪被调用的用户函数,允许在执行Python脚本期间有选择地记录函数的子集。这样,Extrae Python模块只需在纯文本文件中提供函数名列表,即可在不修改任何源代码的情况下监视函数调用。
第三,它提供了一个接口,允许将信息从Python分析器传递到跟踪库。我们依靠Extrae的API在跟踪中发出准时的,用户定义的事件(即Extrae事件方法)。我们开发了一些绑定,这些绑定使Python中的API调用可用,这些绑定在探查器回调中被调用以存储函数入口和出口事件。这样,我们可以提供用户功能信息,以补充与应用程序上下文的MPI通信活动。此外,该界面允许手动检测其他用户事件,例如,迭代,阶段或执行等状态。
3.4其他使用场景
虽然MPI-for-Python软件包被广泛用于开发并行代码,但这不是唯一的方法。使用多处理包也很常见,它支持产生进程并提供本地和远程并发。通过上面解释的机制也支持基于多处理的Process模块跟踪Python程序。我们使用系统分析器来跟踪从多处理模块启动的进程的产生。每当我们检测到具有新进程ID(即PID)的子进程的调用时,我们通过cdll将跟踪库插入到新进程中。这样,我们可以通过Extrae API发出事件来记录进程的生命周期。目前,仍在开发对使用多处理池模块的程序的支持。最后,通过透明地加载跟踪库并记录函数调用和用户定义的准时事件,通过Extrae的python模块无缝支持串行执行。
4评估
在本节中,我们使用完善的电子结构模拟GPAW软件包评估新的Python支持。 GPAW在Python和C中实现,并与MPI并行化。 我们认为这是一个非常合适的例子,因为它已经证明了大约25%的峰值性能良好的扩展到数万个核心。
我们记录了使用尺寸为6.0times;6.0times;6.0°A的超级单元,即32times;32times;32网格点的单个H2分子的计算的手册的基本示例。我们在版本1.1.0中使用GPAW,在MareNostrum中运行Python 2.7,这是基于Intel SandyBridge处理器的巴塞罗那超级计算中心(BSC)的HPC系统。对于录制我们使用Extrae 3.4.3来增加Python支持。
在实际测量运行之前,我们在启用了配置文件模块的情况下执行脚本,以获得脚本中最常见的Python函数的概述。在这些中,我们选择具有最长累积持续时间的函数。具有函数名称的列表将传递给Extrae,后者拦截函数的进入/退出以将它们添加到跟踪中。
在录制过程中,我们还跟踪了跟踪录制引入的额外开销。对于这种测量,我们观察到总开销约为5%。显然,开销很
资料编号:[5915]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。