问题标签 [doparallel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
879 浏览

r - R foreach doParallel 与 1 个工作线程/线程

好吧,我认为没有人理解这个问题......

我有一个动态脚本。有时,它会遍历一个包含 10 个东西的列表,有时它只会遍历 1 个东西。

当要迭代的项目大于 1 时,我想使用foreach并行运行脚本。我只想使用每个项目 1 个核心进行迭代。所以,如果有 5 件事情,我将跨 5 个线程并行。

我的问题是,当迭代列表为 1 时会发生什么?

不并行运行并让机器最大化吞吐量会更好吗?或者我可以让我的脚本分配 1 个工作人员,它的运行方式与我根本没有告诉它并行运行一样吗?

0 投票
2 回答
3825 浏览

r - 为什么 foreach %dopar% 每增加一个节点就会变慢?

我写了一个简单的矩阵乘法来测试我的网络的多线程/并行化能力,我注意到计算比预期的要慢得多。

测试很简单:乘以 2 个矩阵 (4096x4096) 并返回计算时间。既不存储矩阵也不存储结果。计算时间并非微不足道(50-90 秒,具体取决于您的处理器)。

条件:我使用 1 个处理器重复此计算 10 次,将这 10 个计算拆分为 2 个处理器(每个 5 个),然后是 3 个处理器,......最多 10 个处理器(每个处理器 1 个计算)。我预计总计算时间会逐步减少,并且我预计 10 个处理器完成计算的速度是一个处理器完成计算的10 倍

结果:相反,我得到的只是计算时间减少了 2 倍,比预期的慢5 倍。

在此处输入图像描述

当我计算每个节点的平均计算时间时,我希望每个处理器在相同的时间内(平均)计算测试,而不管分配的处理器数量如何。我惊讶地发现,仅仅将相同的操作发送到多个处理器就会减慢每个处理器的平均计算时间。

在此处输入图像描述

谁能解释为什么会这样?

请注意,这个问题不是这些问题的重复:

foreach %dopar% 比 for 循环慢

或者

为什么并行包比只使用 apply 慢?

因为测试计算不是微不足道的(即 50-90 秒而不是 1-2 秒),并且因为我可以看到处理器之间没有通信(即除了计算时间之外没有返回或存储任何结果)。

我附上了下面的脚本和函数以进行复制。

编辑:回复@Hong Ooi 的评论

lscpu在 UNIX 中使用得到;

编辑:回复@Steve Weston 的评论。

我正在使用可以访问多达 30 个集群的虚拟机网络(但我不是管理员)。我进行了您建议的测试。打开 5 个 R 会话并同时在 1,2...5 上运行矩阵乘法(或尽可能快地切换并执行)。得到与以前非常相似的结果(re:每个额外的过程都会减慢所有单独的会话)。请注意,我使用 and 检查了内存使用情况tophtop并且使用情况从未超过网络容量的 5%(~2.5/64Gb)。

在此处输入图像描述

结论:

这个问题似乎是 R 特定的。当我使用其他软件(例如PLINK )运行其他多线程命令时,我不会遇到这个问题并且并行进程按预期运行。我也尝试过以相同(较慢)的结果运行上述Rmpi内容doMPI。问题似乎是R虚拟机网络上的相关会话/并行命令。我真正需要帮助的是如何查明问题。类似的问题似乎在这里被指出

0 投票
0 回答
110 浏览

r - 使用 parallel / foreach 加速 Rtexttools

我正在尝试使用 RTexttools 包对大约 10.000 个文档进行分类。当我计算随机森林训练模型时,过程会消耗大量时间(CPU 和内存)。我在一台有 4 个内核和 4GB 内存的机器上工作。但是,我可以看到我的 R-session 只使用 1 个核心来执行。我已经阅读了一些关于 foreach 和 doparallel 的文档,但我无法将其与文本挖掘联系起来。假设我想加速以下命令(目前需要 120 多分钟):

有没有办法通过使用并行化来加快这个过程?如果我只是使用

在训练模型计算之前它不会有太大帮助。

0 投票
1 回答
641 浏览

r - foreach %dopar% 环境中的嵌套 do.call 找不到使用 .export 传递的函数

do.call在并行化环境中嵌套了多个级别(每个级别本身都使用参数中命名的函数,而不是硬编码)%dopar%,并且最里面的函数无法找到来自外部环境的函数。我知道.export参数 onforeach并正在使用它,但不知何故,命名函数并没有沿着整个链传播。

我将问题简化为以下测试用例,它确实存在此问题:

我没有给出正确答案(带有一些数字的列表),而是得到:

添加if (!exists("simple.func")) stop("Could not find parse.data in scope main.func")到每个函数的开头(根据需要更改范围的名称)表明它是inner.func看不到的simple.func——即使outer.func 确实看到了。

我还测试了上面的几个变体,或者main.funcouter.func编码下一级函数,而不是从参数中使用它。这两种变体有效(例如,给出预期的结果),但对于现实世界的情况,我想保留将子函数作为参数的普遍性。

我也可以simple.func手动传递链,将它作为一个额外的参数包含在内,但这看起来非常混乱,为什么在simple.func应该作为环境的一部分传递时有必要呢?

有没有人有关于不那么笨拙的解决方案的想法,或者这个问题的根本原因?

0 投票
1 回答
145 浏览

r - 使用 doMPI 写入日志文件

我在 HPC 上运行 doMPI,我想记录工作人员的输出。使用 doParallel,我能够使用makeCluster(outfile='myfile.log'). 使用 doMPI,任何方法中似乎都没有outfile参数。我尝试使用sinkWorkerOutput(). 这行得通,但只为其中一名工人写了日志。我怀疑每个工人都在覆盖另一个。是否有outfile用于 doMPI 的模拟?

一个相关的问题 - 在工人内部,我可以找到工人编号吗?

编辑:这是一个讨论如何使用 outfile 的答案的链接:How can I print when using %dopar%

谢谢您的帮助,

0 投票
1 回答
1505 浏览

r - 并行处理中的最佳内核数是多少?

假设我有一个 8 核 CPU。在 R 中使用doParallel,当我注册时makeCluster(x),理想的核心数是x多少?

是否尽可能多的核心?还是使用 7 核会比使用 6 核慢?有没有这方面的规则?

0 投票
2 回答
844 浏览

r - R foreach 循环中的负载平衡

有没有办法修改 R foreach 循环如何使用 doParallel 后端进行负载平衡?当并行化执行时间非常不同的任务时,可能会发生所有节点,但一个节点已完成任务,而最后一个节点仍有几项任务要做。这是一个玩具示例:

基本上,代码注册了 4 个内核。对于每个循环i,任务是等待waittime[i]几秒钟。但是,因为默认情况下,foreach 循环中的负载均衡似乎是将任务总数拆分为长度为已注册核心数的集合,所以在上面的示例中,第一个核心接收所有带有waittime=的任务10,而其他 3 个收到waittime= 1 的任务,因此这 3 个核心将在第一个完成第一个之前完成所有任务。

有没有办法foreach()一次分配一个任务?即在上述情况下,我希望前 4 个任务分布在 4 个内核之间,然后每个下一个任务都分布到下一个可用内核。

谢谢。

0 投票
1 回答
116 浏览

r - 在一组不同的解释变量上并行化 R 中的面板 logit 计算

我是 R 中并行计算的初学者。我遇到了这个doParallel包,我认为它可能对我有用。

以下代码旨在并行评估多个pglm回归:

当我尝试以下列方式并行化它时,它不起作用。我收到以下错误:

{ 中的错误:任务 1 失败 - “找不到对象 'XX'”

一组几个pglm回归顺序评估的作品:

有人可以就如何正确并行化此任务提出建议吗?

谢谢!

0 投票
1 回答
532 浏览

r - R sys.child 中的 system.time 和并行包为 0

我想在 R 中使用 system.time 来获取多核函数的总 CPU 时间。问题是 system.time 显然没有捕获由并行包产生的子进程花费的 CPU 时间。

然后时序看起来像这样

时间加起来。现在,如果我使用并行处理:

用户和系统时间仅捕获主进程。具体查看时间 [4] 和 [5] 显示 user.child 和 sys.child 时间为 0。

我需要做什么来测量 R 中并行处理的总 CPU 时间?

注意:将集群启动代码移动到 system.time 调用中并没有什么不同。

0 投票
1 回答
1341 浏览

r - 在 foreach %dopar% 循环中写入文件

我有这段代码,我想并行但是我似乎无法让它工作。这个想法是,对于每个值 chr,snp_sel(geno_data,k, bl) 给我一个由 k 列组成的矩阵,这些列随后被一一写入文件。我怎样才能 %dopar% 这个循环?