从桌面缩放到群集
这个例子展示了如何在本地机器上开发并行的MATLAB®代码,并将其扩展到集群。集群提供更多的计算资源来加速和分发计算。您可以在本地机器上以并行方式交互地运行代码,然后在集群上运行,而无需更改代码。在本地机器上完成代码原型设计后,可以使用批处理作业将计算卸载到集群中。所以,你可以关闭MATLAB,然后检索结果。
开发你的算法
首先在本地机器上创建算法原型。这个例子使用整数分解作为一个样本问题。这是一个计算密集型问题,因式分解的复杂性随着数字的大小而增加。您可以使用一个简单的算法来分解一个整数序列。
创建64位精度的素数向量,并随机将对素数相乘,得到较大的合数。创建一个数组来存储每次分解的结果。本例中下列各节中的代码可能需要20分钟以上。为了使其更快,可以通过使用更少的质数来减少工作负载,例如2 ^ 19.
.运行2 ^ 21.
看到最佳的最终情节。
primeNumbers =质数(uint64 (2 ^ 21));compositeNumbers = primeNumbers。* primeNumbers (randperm(元素个数(primeNumbers)));因素= 0(元素个数(primeNumbers), 2);
使用循环对每个合数进行因式分解,并测量计算所需的时间。
抽搐;为idx = 1:numel(compositeNumbers)因子(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间是684.464556秒。
在本地并行池中运行代码
并行计算工具箱™使您能够通过在一个并行池中运行多个工作器来扩展您的工作流。前面的迭代为
循环是独立的,因此可以使用parfor
循环将迭代分发给多个工人。简单地改变你的为
循环到一个parfor
循环。然后,运行代码并测量总体计算时间。代码在一个并行池中运行,不再做任何修改,工作人员将计算结果发送回本地工作区。由于工作负载分布在多个工作者上,计算时间较短。
抽搐;parforidx = 1:numel(compositeNumbers)因子(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间是144.550358秒。
当你使用parfor
并且您有并行计算工具箱,Matlab会自动启动一个并行工人池。并行池需要一些时间才能开始。此示例显示已启动池的第二个运行。
默认的集群配置文件是“本地”
.你可以检查这个概要文件在MATLAB中被设置为默认值首页标签,在平行线>选择默认集群.启用此配置文件,MATLAB为并行池创建机器上的工作人员。当你使用的时候“本地”
默认情况下,Matlab,Matlab从机器中的物理核心开始,最多为您的首选工作人员。您可以使用并行首选项控制并行行为。在MATLAB首页选项卡上,选择平行线>并行偏好.
要用工人的数量来衡量速度,可以多次运行相同的代码,限制工人的最大数量。首先,为每次运行定义工人的数量,最多可以达到池中的工人数量,并创建一个数组来存储每次测试的结果。
numworkers = [1 2 4 6];Tlocal =零(尺寸(numworkers));
使用循环遍历最大工作数,并运行以前的代码。要限制工人的数量,请使用第二个输入参数parfor
.
为w = 1: nummel (numWorkers) tic;parfor(idx = 1:numel(compositeNumbers), numWorkers(w))因子(idx,:) = factor(compositeNumbers(idx));结束Tlocal(w)= toc;结束
通过计算单个工人的计算时间与每个最大数量工人的计算时间的比率来计算加速。为了可视化计算是如何随着工人数量的增加而增加的,请将加速速度与工人数量进行对比。观察速度随工人数量的增加而增加。然而,由于并行化带来的开销,这种扩展并不完美。
f =图;speedup = tlocal(1)./ tlocal;情节(numWorkers加速);标题(“随着工人数量的增加加快速度”);包含(工人的数量);xticks (numWorkers);ylabel ('加速');
使用计算完成后,删除当前并行池,以便为群集创建一个新的。您可以使用当前并行池获取gcp
函数。
删除(gcp);
设置群集
如果计算任务对于本地计算机来说太大或太慢,您可以将计算卸载到现场的集群或云中。在运行下一节之前,必须访问集群。在MATLAB首页标签,去平行线>发现群集查看您是否已经使用MATLAB Parallel Server™访问集群。有关详细信息,请参见发现群集.
如果您无权访问群集,则必须先配置对一个的访问权限,然后才能运行下一节。在MATLAB中,您可以直接从MATLAB桌面创建云服务中的群集,例如Amazon AWS。在这方面首页标签,在平行线菜单中,选择创建和管理集群.在集群配置文件管理器中,单击创建云计算集群.要了解有关向云扩展的更多信息,请参见开始与云中心.要了解有关您在网络中的群集中进行缩放的更多信息,请参阅开始MATLAB并行服务器(MATLAB并行服务器).
设置群集配置文件后,您可以修改其属性平行线>创建和管理集群.有关详细信息,请参见发现群集并使用群集配置文件.以下图像显示了群集配置文件集群配置文件管理器:
在集群并行池中运行代码
如果默认情况下希望在集群中运行并行函数,请将集群配置文件设置为平行线>选择默认集群:
您还可以使用编程方法来指定集群。方法中指定集群配置文件的名称,启动集群中的并行池parpool
命令。在下面的代码中,替换mycluster.
使用群集配置文件的名称。还指定具有第二个输入参数的工人数。
parpool (“MyCluster”, 64);
使用“MyCluster”配置文件启动并行池(parpool)…与64名工人相连。
与前面一样,通过多次运行相同的代码,并限制工人的最大数量,用工人的数量来衡量速度。因为本例中的集群比本地设置允许更多的工作人员,numworkers.
可以容纳更多的值。如果运行此代码,则parfor
循环现在在群集中运行。
numworkers = [1 2 4 6 16 32 64];tcluster =零(大小(numworkers));为w = 1: nummel (numWorkers) tic;parfor(idx = 1:numel(compositeNumbers), numWorkers(w))因子(idx,:) = factor(compositeNumbers(idx));结束tCluster (w) = toc;结束
计算速度,并将其与工作人员的数量作对比,以可视化计算如何随工作人员的数量而增加。将结果与本地设置的结果进行比较。观察速度随工人数量的增加而增加。然而,由于并行化带来的开销,这种扩展并不完美。
图(f);持有在加速= tCluster(1)。/ tCluster;情节(numWorkers加速);标题(“随着工人数量的增加加快速度”);包含(工人的数量);xticks (numWorkers(2:结束));ylabel ('加速');
当您完成计算后,删除当前的并行池。
删除(gcp);
卸载和缩放您的计算批处理
在完成原型化和交互式运行之后,可以使用批处理作业在后台卸载长时间运行的计算的执行。计算发生在集群中,您可以关闭MATLAB并稍后检索结果。
使用批处理
函数将批处理作业提交到群集。可以将算法的内容放置在脚本中,并使用批处理
函数来提交它。例如,脚本myParallelAlgorithm基于此示例中显示的整数分解问题执行一个简单的基准。该脚本测量具有不同数量的工人的几个问题复杂性的计算时间。
请注意,如果发送脚本文件使用批处理
, MATLAB传输所有的工作空间变量到集群,即使你的脚本不使用它们。如果您有一个大的工作空间,它会对数据传输时间产生负面影响。作为一种最佳实践,将您的脚本转换为一个函数文件,以避免这种通信开销。只需在脚本的开头添加一个函数行就可以做到这一点。学习如何转换myParallelAlgorithm到一个函数,看myParallelAlgorithmFcn.
以下代码提交myParallelAlgorithmFcn
作为批处理工作。myParallelAlgorithmFcn
返回两个输出参数,numworkers.
和时间
,你必须指定2
作为输入参数的输出数。因为代码需要一个并行池parfor
循环,使用“池”
名称值对批处理
指定工人的数量。集群使用一个额外的worker来运行函数本身。默认情况下,批处理
将群集中的工人的当前文件夹更改为MATLAB客户端的当前文件夹。控制当前文件夹很有用。例如,如果您的群集使用不同的文件系统,因此路径不同,例如从Windows客户端计算机提交到Linux群集时。设置名称值对“CurrentFolder”
到您选择的文件夹,或者“。”
以避免更改工作人员的文件夹。
totalNumberOfWorkers = 65;集群= parcluster (“MyCluster”);工作=批(集群,“myParallelAlgorithmFcn”2,“池”totalNumberOfWorkers-1,“CurrentFolder”,“。”);
要在提交作业后监视作业的状态,请在平行线>监控工作.当计算在群集中开始时,作业的状态更改为跑步
:
你可以关闭MATLAB后,工作已提交。当你再次打开MATLAB时,作业监视器会为你跟踪作业,如果你右键单击它,你可以与它进行交互。例如,要检索作业对象,请选择显示详细资料,并将批处理作业的输出转移到工作区,选择获取输出.
或者,如果希望在作业完成之前阻塞MATLAB,请使用等待
函数在作业对象上。
等待(工作);
要从群集中传输函数的输出,请使用fetchOutputs
函数。
输出= fetchOutputs(工作);numWorkers ={1}输出;时间=输出{2};
检索结果后,您可以将它们用于本地计算机上的计算。计算加速,并将其与工人的数量相提并论。因为代码运行了不同问题复杂性的因子化,所以您可以为每个级别进行绘图。您可以看到,对于每个问题复杂性,加速随工作人员的数量增加,直到额外工人的开销大于并行化的性能增益。当您提高问题复杂性时,您可以在大量工作人员获得更好的加速,因为与并行化相关的开销不太重要。
Figure speedup = time(1,:)./time;情节(numWorkers加速);传奇(“问题复杂性1”,《问题复杂性2》,'问题复杂性3','问题复杂性4','地点',“西北”);标题(“加速和复杂性”);包含(工人的数量);xticks (numWorkers(2:结束));ylabel ('加速');
另请参阅
parpool
|parfor
|批处理
|fetchOutputs(工作)
相关的例子
更多关于
- 并行for循环(parfor)
- 开始MATLAB并行服务器(MATLAB并行服务器)