【问题标题】:mclapply encounters errors depending on core id?mclapply 根据核心 ID 遇到错误?
【发布时间】:2018-10-10 17:29:29
【问题描述】:

我有一组基因需要并行计算一些系数。 系数在GeneTo_GeneCoeffs_filtered 内部计算,将基因名称作为输入并返回 2 个数据框的列表。

拥有 100 个长度的 gene_array 我使用不同数量的核心运行此命令:5、6 和 7。

Coeffslist=mclapply(gene_array,GeneTo_GeneCoeffs_filtered,mc.cores = no_cores)

根据分配给mclapply 的核心数量,我在不同的基因名称上遇到错误。

GeneTo_GeneCoeffs_filtered 无法返回其具有模式的数据框列表的基因索引。 在分配给 mclapply 的 7 个核心的情况下,它是 gene_array 的 4、11、18、25、... 95 个元素(每 7 个),当 R 使用 6 个核心时,索引是 2、8、14、。 ..,98(每 6 次)和 5 核的相同方式 - 每 5 次。

最重要的是它们对于这些过程是不同的,这意味着问题不在于特定的基因。

我怀疑可能存在无法正确运行我的功能的“损坏”核心,只有它会产生此错误。有没有办法追溯其 id 并将其从 R 可以使用的核心列表中排除?

【问题讨论】:

  • 不检查,我的直觉是它与 gene_array 的分块有关 - 函数 GeneTo_GeneCoeffs_filtered(x) 将根据块的数量以不同的 x 块调用,即ncores 的值。例如,其中一个块可能包含所有缺失值。尝试生成chunks <- mcapply(gene_array, identity, mc.cores = ncores) 并使用y <- GeneTo_GeneCoeffs_filtered(chunks[[1]]) 等手动调用每个块,以查看其中一个块是否“有问题”。 (我怀疑是否存在 CPU 硬件问题;如果不运行 R,您会注意到)
  • 嗨@lizaveta - 我想知道你是否曾经为自己解决过这个问题。我遇到了相同的问题 - 当核心数设置为 k 时,每个第 k 个结果都是一个错误。很奇怪的经历。给您一个问题:您正在应用的函数 GeneTo_GeneCoeffs_filtered 是否对磁盘或屏幕执行任何 IO?
  • 嗨@malcook,我将结果保存在内存中,而没有将它们写入函数内部的磁盘。但是,我无法正确回忆起这种奇怪行为的原因是什么——我改用了另一种并行计算的方式。如果我没记错的话,问题出在我必须导出到核心的环境中

标签: r parallel-processing mclapply


【解决方案1】:

仔细阅读 mclapply 的 manpage 后发现,这种行为是有意为之的,它是以下交互的结果:

(a)

“输入 X 被分成与核心一样多的部分(目前 这些值按顺序分布在核心中,即第一个值 到核心 1,第二到核心 2,...(核心 + 1)-th 到核心 1 的值等) 然后将一个进程分叉到每个核心,结果是 收集。”

(b)

将为所有涉及的值返回一个“try-error”对象 失败,即使不是全部失败。

在您的情况下,凭借 (a),您的gene_array 以“循环”方式分布在核心之间(连续元素的索引之间有 mc.cores 的间隙),并且凭借 (b) ,如果任何gene_array 元素引发错误,您会为发送到该核心的每个gene_array 元素返回一个错误(这些元素的索引之间有mc.cores 的间隙)。

我昨天在与 Simon Urbanek 的交流中刷新了我的理解:https://stat.ethz.ch/pipermail/r-sig-hpc/2019-September/002098.html,其中我还提供了一种错误处理方法,只为产生错误的索引产生错误。

您还可以通过传递 mc.preschedule=FALSE 仅获取产生错误的索引的错误。

【讨论】:

  • 这是有道理的,我认为这正是当时发生的事情。感谢您的解释!
猜你喜欢
  • 2014-09-24
  • 2016-12-28
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2011-10-30
  • 2014-07-05
  • 2012-03-28
相关资源
最近更新 更多