APP下载

基于Microsoft HPC 的Magic 迭代计算软件的并行化

2020-08-31侯佳正张绍阳陈博远

应用科技 2020年3期
关键词:计算资源内核进程

侯佳正,张绍阳,陈博远

长安大学 信息工程学院,陕西 西安 710064

Magic 作为一款著名的电磁模拟商业软件,可以通过馈入参数[1]仿真计算输出功率。为了确定最优参数,开发了Magic 迭代计算软件进行参数的优化,但该软件是一个单机版本的软件系统,由于解决相关领域问题所需的计算量大,使用该软件完成每次迭代计算存在耗时长的问题。为了解决单机软件耗时长的问题,目前常用的方法大约有以下几种:张朝金等[2]对Bellhop 传播模型算法进行改进,利用多线程技术,建立了稳定可靠的并行模型算法,实现了声场的快速预报,提高了运行效率。刘俊见等[3]采用OpenMP[4]并行化技术,将可并行化的任务显式的使用多线程的方法进行并行计算,显著提高了侧向散射激光雷达数据处理的效率。但是由于该Magic 迭代计算软件的任务要开启多个Magic 进程使其进行计算,且Magic 软件作为成熟的商业软件无法对其自身进行改造,故无法采用上述方法在线程级别进行改造。

随着大数据的兴起和发展,分布式计算技术实现了跨越式发展并被广泛应用。可以使用MapReduce[5−7], Spark[8−9]、Storm[10]并行计算框架对特定领域的问题进行并行处理[11]。焦凯琳等[10]使用Hadoop 的HDFS 文件系统和分布式数据库HBase 对海量的物流数据进行分布式存储和管理,使用MapReduce 和Storm 并行计算框架实现批数据处理的分析研判业务以及一些与数据实时处理相关的查询跟踪业务。李业田[12]使用分布式文件系统HDFS 实现海量数据的存储,采用并行处理框架MapReduce 对海量的电信数据进行并行处理。但是采用这种方法需要大量的软硬件的支持,要针对具体业务搭建大数据平台,成本较高;同时这种方法主要是对大批量的数据进行处理,更多的适用于数据挖掘和机器学习,并不能很好地实现特定软件的并行化。

本文提出了一种基于Microsoft HPC 并行计算框架的解决方案,可以利用现有的硬件环境,基于Windows 操作系统搭建一个并行计算平台,实现多个Magic 程序在多台计算机上并行计算,解决耗时长的问题。

1 Magic 计算需求分析

Magic 软件是一款著名的电磁模拟软件,可以通过馈入参数仿真计算输出功率。为了确定最优的参数,实际工作中采用Magic 迭代计算软件迭代计算进行参数确定,具体流程如图1 所示。

图1 Magic 迭代计算软件流程

该程序为一个单机运行程序,该程序依据用户在用户界面上设置的一系列参数生成指定数量的参数文件,然后启动相同数量的Magic 进程进行计算。计算完成后,根据计算结果,通过遗传算法对参数进行优化,生成下一代的参数文件,再进行计算。通过迭代几十代或上百代,直至优化出最优的参数。

该Magic 迭代计算软件迭代一次大约需要花费50 min,迭代出最优的参数大约需要花费4~5 d的时间。

经研究发现制约运行速度的是多个Magic 进程在单台计算机上进行计算这一步骤,由于每代求解的是多个具有独立的几何边界条件的相似模型,是一个易并行问题,故提出将Magic 软件放在多台计算机上进行并行计算的构想。通过技术论证,最终提出了采用Microsoft HPC 将Magic 迭代计算软件进行并行化的技术架构。

2 总体设计

2.1 集群的架构图

集群的架构如图2 所示。采用Microsoft 的HPC 平 台,通 过 使 用Microsoft HPC Pack 把 处 于一个局域网内的多台计算机搭建成一个计算机集群:集群中头节点装有Windows server 操作系统,主要对计算节点进行监控和Magic 进程的分配和管理;计算节点利用Windows 操作系统(如Window 7)对头节点分配的计算任务进行计算,在每个计算节点上设置共享文件夹,可以将Magic运行结果存储到某一指定的共享文件夹中。

图2 集群的架构

2.2 系统工作流程

改进的Magic 迭代计算软件首先连接到集群的头结点,然后指明任务(即Magic 程序)的绝对路径、输入文件的绝对路径、结果输出路径、程序要占用的CPU 内核数等信息,生成一代所需的任务数,组成一个作业。将作业提交到头结点,头结点按照分配策略在可用的计算节点启动一定数量的Magic 进程。计算节点在计算完成后,将计算结果存储到指定的共享文件夹中。头结点可以对计算节点上的每个Magic 进程进行监控,可以获得每个计算节点Magic 进程完成的进度、所花的时间等状态信息,也可以终止掉异常的Magic 进程。改进的Magic 迭代计算软件可以向集群的头结点发送信息,可以获得Magic 进程的状态信息和对Magic 进程进行控制和管理,流程如图3 所示。

图3 改进的Magic 迭代计算软件工作流程

3 改进的Magic 迭进计算软件设计方案

3.1 HPC 集群的搭建

3.1.1 头结点的部署与配置

在已安装服务器操作系统(如Windows server 2016)的计算机上添加域服务,并将该计算机添加到域中。使用Microsoft HPC Pack,创建头结点。

使用HPC Pack 群集管理器配置网络拓扑,图2 集群的架构图所展现的为其中的一种网络拓扑关系。

创建不同级别的节点组,即将可用的计算资源进行分组,使每组拥有不同数量的计算资源。如可以使某组拥有集群中所有的计算资源,保证计算时的性能最好。本文只设置了一个组,该组中包含所有的计算节点。

创建作业模板,在向集群提交作业时使用。在作业模板中可以设置作业放在哪个或哪几个节点组上进行计算,防止占用整个集群的计算资源,影响他人的使用。可以设置作业的最大运行时间,设置提交作业的优先级,也可以限定该作业模板的使用权限等。

3.1.2 计算结点的部署与配置

在Windows 计算节点上开启HPC pack 安装向导,可以选择创建工作站节点或选择计算节点将计算节点加入现有HPC 群集。输入头节点名称,完成安装。通过HPC Cluster Manager 软件在节点管理中为每个节点套入节点模板,并将刚加入到集群中的节点添加到某个计算组中,以增加该组中可用的计算资源的数目。因为作业模板会要求选择相应的节点组,在进行并行计算时会使用该组的计算资源。

注意事项:1)配置IP 和DNS,IP 地址确保和主节点在同一个局域网内,DNS 服务器的地址设置为头节点的IP 地址。2)设置计算机名及域名:设置易于和其他计算机区分的计算名便于在通过程序生成的日志文件查看每个计算节点上被分配了多少Magic 进程;设置域名:域名为配置头节点时设置的根域名。

3.2 数据的存储

要求每个计算节点的Magic 进程在启动计算时能读取到参数文件,且当各个计算节点计算完成后,能把计算结果汇总到一起,方便用户查看。

由于Windows 提供了在局域网中文件共享机制,故在每台计算机上设置了一个共享文件夹,在提交作业之前,用户可以通过Magic 迭代算法软件的前台界面设置共享文件夹的绝对路径。这样,在局域网中的每台计算节点在计算时,就可以从共享文件夹中读取所需的参数文件;计算完成后,就会将结果输出到该共享文件夹下。

3.3 改进的Magic 迭代计算软件的设计

用户只需在用户界面上配置好所需的参数,程序会自动进行迭代并将作业提交到集群上进行计算,实现集群对用户的透明化,简化用户的操作,提升用户体验。改进的Magic 迭代计算软件既可以放到计算节点上运行,又可以放在头节点上运行。

Magic 迭代计算软件的改进主要包含以下3 点:

1)用户名密码的设计

在Magic 迭代计算软件的前端设置登录界面,将用户名密码和之前创建的作业模板绑定在一起,存放在数据库中。不同的用户登录后,在提交作业时从数据库中读出相对应的作业模板,进而实现不同的用户在提交作业进行计算时使用不同的计算资源,达到资源合理利用的目的。在提交作业时,在作业名称上加上用户名,这样管理员可以知道哪些用户正在使用集群资源。

2)计算任务的提交

Microsoft HPC pack SDK 提 供 了 可 供 二 次 开发的API 接口[13],通过编程调用相应的接口实现集群的连接和将每一代的Magic 程序放到集群上进行计算的操作,从而实现将耗时耗资源的计算采用并行方式完成。

通过调用API 相应的函数可以设置作业使用的作业模板,Magic 进程要使用的内核数,以到达合理利用集群中计算资源的目的。

3)日志文件的编写

当进行集群计算时,编写相应的日志文件,用来统计一个作业提交到集群上的时间点:每个Magic 进程被分配到哪个计算节点上,计算每个Magic 所花的时间;每个计算节点被分配的任务数,用于集群计算所花的时间;每个作业完成的时间点、所耗时长和检查每个任务是否计算出了结果,一些错误提示等一系列的信息。通过统计以上信息,可以和单机运行所花费的时间进行比较,判断是否可以提升计算效率。可以清楚地判断每个计算节点计算快慢,可以弃用计算较慢的计算节点。

4 并行计算中的问题及解决方法

在并行化过程中遇到了一些问题,下面对出现的问题进行探讨并给出相应的解决办法。

1) Magic 进程没有进行计算。

本文使用工作站作为计算节点,每个工作站有32 个CPU 内核,在实验时使用2 台相同的工作站充当计算节点,设置每个Magic 进程使用的CPU 内核数为1,当给每台工作站分配超过24 个Magic 进程时,会出现部分Magic 进程没有进行计算,却显示计算完成的情况。针对这种情况,本文采取了下面的措施:作业提交后,在获取作业的完成进度过程中,每当进度发生变化时,代表有Magic 进程计算完成,此时获取任务的列表,通过检测已完成的任务是否生成完整的计算结果文件,来判断Magic 进程是否计算完成,如果没有完整的结果文件,将该任务再次提交到集群上进行计算。

2)算例在计算完成后无法停止。

在搭建的测试集群平台上经测试发现,在计算节点上,部分Magic 进程在计算完成后,所有的结果文件已经生成,但是却无法自己停止,在集群中显示该Magic 进程正在运行,这样导致某一次迭代无法完成,无法生成下一次迭代所需的参数文件,无法进入下一次迭代,大大降低了运算的效率。

针对这种情况,因为在作业模板中可以设置一个作业最大运行时间,所以规定了一个作业最大运行时间的值,到规定的时间,终止掉这一代。但是发现参数文件不同,每个Magic 进程计算所需的时间不同,无法准确得知每一代最大的运行时间。如果最大运行时间设置得过大,计算完成,Magic 进程迟迟无法停掉,同样也会增加每一代运行的时间,降低计算效率;如果每代计算时间设置的过小,部分Magic 进程还没有计算出结果,就被强行终止掉了,会使下一代无法生成较好的参数,甚至会导致最终无法生成最优的参数。

依据Magic 无法自动终止,就利用集群的头结点强行停止掉的思想,在作业正在运行时每过一段时间(如20 s),获取Magic 进程列表,检测正在运行的Magic 进程,看所有的结果文件是否已经存在,如果已存在,可将该Magic 进程终止。这样可以做到及时终止计算已完成但未自动结束的Magic 进程。

应当注意的是,由于在程序中反复通过调用API 函数获取作业的任务列表,如果任务列表比较大,会占用较大的内存,在使用完成后,没有及时的释放掉,会造成内存泄漏的问题。所以在使用完任务列表后要及时的释放掉,可以通过调用ISchedulerCollection::Clear 函数进行释放,以免造成程序出错。

3)为每个计算节点分配的最大任务数。

经实验发现,在搭建的集群平台上,在把多个Magic 进程分配到集群上时,当一次迭代的Magic 进程过多,超过了一台计算节点可用的CPU内核数时,集群头节点会把任务循环分配到可以使用的计算节点上。如可用的计算节点有3 个,第1 个任务会分配到第1 台计算节点上,第2 个任务会被分配到第2 个计算节点上,第3 个任务会被分配到第3 个计算节点上,第4 个任务又会被分配到第1 个计算节点上,依次循环,有1 个计算节点上的内核被分配完就不再给该计算节点再分配;当一代中包括的Magic 较少时,集群会将所有的Magic 进程分配到一个计算节点上。

为每个计算节点分配的Magic 进程数应根据CPU 的利用率、每个计算节点上所有Magic 计算完成的时间和集群用户数量这3 个指标来确定。

每台工作站都是多核CPU,如果每个Magic进程占用CPU 的1 个内核,1 个计算节点被分配的Magic 进程数为CPU 的内核数,计算节点的CPU 利用率会很高,甚至会达到100%。有的计算节点不仅要满足集群运算的需求,还要满足用户正常的使用,如果CPU 的利用率过高,则无法满足用户对计算机的正常使用;CPU 的利用率过高,也会导致1 个计算节点上多个Magic 进程之间相互影响,1 个计算节点上任务完成的时间增加。如果在多核工作站上分配的Magic 进程过多,会存在许多显示计算完成却没有进行计算的Magic 进程,虽然重复提交可以解决该问题,但是还是会略微增加迭代一次所需的时间。

如果1 个计算节点被分配的Magic 进程数少于CPU 的内核数,CPU 的利用率就会下降,1 个计算节点上分配的Magic 进程相互之间影响较小,完成时间缩短,但是整个集群能并行运算的算例总数量就会下降。假如集群中的计算节点的数量一定,不再增加,多个用户同时使用集群,就可能会出现部分用户提交的任务会处于排队状态。所以,要把这3 个因素综合考虑,取得一个最优值。

综合以上所有因素,本文经实验发现当1 台计算机拥有的CPU 内核数较多时,设置每台计算节点最大可用于计算的内核数为每台计算节点拥有CPU 内核数的 [ 2/3]为宜,规定每个Magic 进程计算使用的内核数为1 即可。

值得注意的是,只有先在HPC Cluster Manage软件中把每台计算节点进行脱机后,才能使用该软件设置每个计算节点可以使用的最大内核数,且可用的最大内核数只能设置为偶数。

5 集群安全性论证

由于在进行Magic 进行并行化时,要求集群具有容错能力,即1 个计算节点宕机的情况。经过实验论证发现,当某个计算节点在运行Magic 进程时出现了宕机的情况,该机上计算任务不会失败,任务会被重新收回,状态变成排队状态,当有可用的计算资源时,任务会被重新分配出去,完成计算;当1 个计算节点发生故障时,集群将不会分配Magic 进程给该计算节点。1 个计算节点出现故障,不会影响整个集群的正常使用。

6 实验结果

本文在Magic 迭代算法软件的前端界面上设置好Magic 程序所需的参数信息,使用搭建好的2 台相同的工作站集群充当计算节点,用于Magic 程序的运行,每台工作站拥有32 个CPU内核,同时准备1 台相同的工作站进行单机迭代优化参数。

经过测算在工作站上单独运行一个Magic 进程,计算完成平均花费15 min。程序每次迭代会生成44 个Magic 进程。由于我们设定的每台计算节点可用的最大内核为22 个,每个Magic 进程占用1 个CPU 内核,故每次迭代44 个Magic 进程可以同时进行计算,没有排队现象。对于单机的magic 进程一般习惯设定同时开启的Magic 进程数为工作站的最大内核数,故一次开启32 个进程。集群和用于单机迭代优化参数的工作站都没有运行其他程序。

放在集群上进行迭代,44 个Magic 进程计算完成平均所花的时间为22 min。而在单机上完成44 个Magic 进程计算平均花费40 min。说明使用较单机多一倍的计算资源,计算速度大约提升了一倍,加速比约为2。通过实验数据比对发现该方法能提高计算效率,所以该方法是行之有效的。

7 结论

本文以单机Magic 迭代计算软件为研究对象,针对每代开启多个Magic 程序、运行效率低下的问题,提出了一种基于Microsoft HPC 的并行化方法,提高了计算速度。

1)本文采用了共享存储的方法,使用共享文件夹实现多台计算机计算开始前读取所需参数,计算完成后存储计算结果的功能。

2)本文提出基于Microsoft HPC 的方法实现Magic 迭代计算软件的并行化,将每代的Magic 程序分配到多台计算机的不同计算单元上进行计算,既利用了闲置的计算资源,又提高了计算效率,且成本低。为解决同类问题提供了一种可行的思路和方法。

在未来的工作中,可以深入的研究一下在并行计算过程中出现的个别Magic 进程没有进行计算以及部分算例在计算完成后无法自行停止问题的真正原因。

猜你喜欢

计算资源内核进程
万物皆可IP的时代,我们当夯实的IP内核是什么?
强化『高新』内核 打造农业『硅谷』
基于模糊规划理论的云计算资源调度研究
债券市场对外开放的进程与展望
改进快速稀疏算法的云计算资源负载均衡
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
基于Wi-Fi与Web的云计算资源调度算法研究
耦合分布式系统多任务动态调度算法
社会进程中的新闻学探寻