并行统计计算的再现性
再现并行计算中的问题和注意事项
一个可再生的计算是每次运行都给出相同结果的计算。再现性在以下方面很重要:
调试—要纠正异常结果,需要重新生成结果。
自信——当你能重现结果时,你就能调查和理解它们。
修改现有代码——当您更改现有代码时,您希望确保不会破坏任何东西。
通常,您不需要确保计算的可再现性。通常,当您想要重现性时,最简单的技术是串行而不是并行地运行。在串行计算中,你可以简单地调用rng
功能如下:
s = rng %获取随机流的当前状态%运行统计函数rng(s) %将流重置为之前的状态%再次运行统计函数,得到相同的结果
本节将介绍函数使用随机数,并且希望并行生成可重复结果的情况。本节还介绍了在并行和串行中希望得到相同结果的情况。
运行可重复并行计算
重复运行统计和机器学习工具箱™功能:
设置
UseSubstreams
选项真正的
使用statset
.设置
流
支持子流的类型的选项:金宝app“mlfg6331_64”
或“mrg32k3a”
.有关这些流的信息,请参见RandStream.list
.要并行计算,请设置
UseParallel
选项真正的
.平行使用使一个整体平行使用
fitcensemble
或fitrensemble
,创建一个树模板“复制”
名称-值对设置为真正的
:t = templateTree(“复制”,真正的);ens = fitcensemble(X,Y,“方法”,“包”,“学习者”t...“选项”、选择);
使用options结构调用函数。
若要重现计算,请重置流,然后再次调用函数。
要了解为什么这种技术具有可重复性,请参见子流如何实现可重复的并行计算.
例如,使用“mlfg6331_64”
用于可重复计算的流:
创建适当的选项结构:
s = RandStream(“mlfg6331_64”);选项= statset(“UseParallel”,真的,...“流”年代,“UseSubstreams”,真正的);
运行并行计算。有关说明,请参见快速开始并行计算统计和机器学习工具箱.
重置随机流:
重置(年代);
重新运行并行计算。你会得到相同的结果。
使用随机数的并行统计计算
什么是子流?
一个substream是随机流的一部分吗RandStream
可以快速访问。有一个数字米
对于任何正整数k
,RandStream
可以去公里
流中的伪随机数。从那一点开始,RandStream
可以生成流中的后续条目。目前,RandStream
有米
= 272大约5e21,或更多。
不同子流中的条目具有良好的统计属性,类似于单个流中的条目的属性:独立性和缺乏性k-方式相关性在不同滞后。子流非常长,可以将子流视为独立的流,如下图所示。
两个RandStream
流类型支持子流:金宝app“mlfg6331_64”
而且“mrg32k3a”
.
子流如何实现可重复的并行计算
当MATLAB®并行执行计算parfor
,每个worker以不可预知的顺序接收循环迭代。因此,您无法预测哪个工作人员得到哪个迭代,因此无法确定与每个迭代相关的随机数。
子流允许MATLAB将每次迭代绑定到特定的随机数序列。parfor
给每个迭代一个索引。迭代使用索引作为子流号。由于随机数与迭代相关,而不是与工人相关,因此整个计算是可重复的。
要获得可重复的结果,只需重置流,所有子流在再次调用时生成相同的随机数。当所有工作线程都使用同一个流,且该流支持子流时,此方法成功。金宝app这就结束了对该程序的讨论运行可重复并行计算给出可重复的并行结果。
客户端或工作端上的随机数
一些函数在客户端生成随机数,然后分发给并行工作者。工作人员不使用随机数,所以操作完全是确定性的。对于这些函数,您可以使用任意随机流类型重复地运行并行计算。
以这种方式运行的函数包括:
为了获得相同的结果,重置客户端上的随机流,或者重置传递给客户端的随机流。例如:
s = rng %获取随机流的当前状态%运行统计函数rng(s) %将流重置为之前的状态%再次运行统计函数,得到相同的结果
虽然此方法使您能够并行地重复运行,但结果可能与串行计算不同。造成这种差异的原因是parfor
循环以相反的顺序运行为
循环。因此,串行计算可以以与并行计算不同的顺序生成随机数。为了明确的再现性,在运行可重复并行计算.
显式分发流
要使用特定的随机数算法进行测试或比较,必须设置随机数生成器。如何并行地设置这些生成器,或者如何以特定的方式在每个worker上初始化流?或者,您可能想使用不同于您运行的任何其他随机数序列来运行计算。如何确保所使用的序列在统计上是独立的?
并行统计和机器学习工具箱功能允许您显式地在每个工人上设置随机流。有关创建多个流,进入帮助RandStream /创建
在命令行。方法创建四个独立的流“mrg32k3a”
发电机:
s = RandStream.create('mrg32k3a','NumStreams',4,…“CellOutput”,真正的);
类将这些流传递给统计函数流
选择。例如:
parpool(4) %如果你有至少4个核s = RandStream.create('mrg32k3a','NumStreams',4,…“CellOutput”,真正的);创建4个独立流paroptions = statset('UseParallel',true,…流,年代);%设置4个不同的流x = [randn(700,1);4 + 2*randn(300,1)];拉特= -4:0.01:12;myfun = @(X) ksdensity(X,latt);Pdfestimate = myfun(x);B = bootstrp(200,myfun,x,'选项',paroptions);
这种分配流的方法为每个工作者提供了不同的计算流。然而,它不允许重复计算,因为工作人员以不可预测的顺序执行200个自举。如果要执行可重复的计算,请使用中所述的子流运行可重复并行计算.
如果你设置UseSubstreams
选项真正的
,然后设置流
选项设置为支持子流类型的单个随机流(金宝app“mlfg6331_64”
或“mrg32k3a”
).此设置提供了可重复的计算。