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