【问题标题】:Parallel processing in R with "parallel" package - unpredictable runtime使用“并行”包在 R 中进行并行处理 - 不可预测的运行时间
【发布时间】:2021-08-11 17:01:17
【问题描述】:

我一直在学习使用 parallel 包在 R 中并行化代码,特别是具有 14 个内核的 mclapply() 函数。

我注意到,仅从几次代码运行中,mclapply() 的重复调用(使用相同的参数和相同数量的核心)花费的时间长度明显不同。例如,第一次运行需要 18 秒,下一次运行需要 23 秒,当我背靠背(在相同的输入上)进行时,下一次运行需要 34 秒。所以我等了一分钟,再次运行代码,结果又回到了 18 秒。

在运行代码后是否存在相当于“计算机需要一秒钟才能冷却下来”的情况,这意味着连续运行 mclapply() 的单独调用可能需要越来越长的时间,但要等待分钟左右,然后再次运行mclapply() 使其恢复正常?

我对 R 中的并行化没有太多经验,但这是我能想到的唯一临时解释。知道我的推理是否正确,并更详细地了解为什么会发生这种情况,这将非常有帮助。谢谢!

为了澄清,我的电话是这样的:

RNGkind("L'Ecuyer-CMRG")
set.seed(1)    
x <- mclapply(training_data, simulation, testing_data, mc.cores=14, mc.set.seed = TRUE)

连续运行两次对我来说第二次需要更长的时间。等一分钟再运行,又变快了。

【问题讨论】:

  • R 中并行工作的运行时可以基于很多因素,包括数据大小,因为 R 需要在进程之间序列化和传输数据;如果不小,那么这不是微不足道的。此外,您不会说您是否正在重新启动集群,或者集群是否通过您对mclapply(.) 的每次重新应用程序持续存在;如果集群是持久的,并且每个节点中的数据不平凡,那么垃圾收集可能是一个因素。 (否则我假设主机操作系统处于空闲状态。)
  • 感谢@r2evans 的帮助 - 我的集群通过重新应用程序保持不变。但是,如果垃圾正在收集,那是否意味着我一分钟后的跑步也应该花费更长的时间?当我在函数调用之间让它冷却一分钟时,时间就会恢复正常。
  • 垃圾收集不是可预测的事件(除非您手动触发它,这通常是不必要的)。坦率地说,我不知道这是一个问题,但它可能是导致运行时不一致的原因,这就是为什么基准测试工具经常受到虚假“最大值”值的影响(例如,参见 bench 的垃圾计数 -收藏:bench.r-lib.org)
  • 如果您在mclapply() 之前立即触发垃圾收集器(即调用gc())会有所不同吗?顺便说一句,不,除了垃圾收集,没有“冷却”需求。

标签: r parallel-processing cpu-cores mclapply


【解决方案1】:

我没有使用过 mcapply,但我使用过 parallel、foreach 和 pbapply 包。我认为不一致之处在于解雇工人和就并行运行任务的进度进行沟通时所涉及的开销很小。

【讨论】:

  • 我不一定看到在相同输入上运行相同代码之间这些开销会如何变化。你能澄清一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2015-02-13
  • 2015-03-26
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多