微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以使用 R {targets} 包为不同的目标设置不同程度的并行度吗?

如何解决我可以使用 R {targets} 包为不同的目标设置不同程度的并行度吗?

我正在测试 targets 包,但遇到了自定义并行化的问题。我的工作流程有两个步骤,我想并行处理 4 个工人的第一步和 16 个工人的第二步。

我想知道是否可以通过调用 tar_make_future()解决问题,然后在 tar_target 调用中指定每个步骤需要多少工人。我在下面有一个简单的例子,我希望 data 步骤用 1 个工人执行,sums 步骤用 3 个工人执行。

library(targets)

tar_dir({
  tar_script({
    library(future)
    library(future.callr)
    library(dplyr)

    plan(callr)

    list(
      # Goal: this step should execute with 1 worker
      tar_target(
        data,data.frame(
          x = seq_len(6),id = rep(letters[seq_len(3)],each = 2)
        ) %>%
          group_by(id) %>%
          tar_group(),iteration = "group"
      ),# Goal: this step should execute with 3 workers,in parallel
      tar_target(
        sums,sum(data$x),pattern = map(data),iteration = "vector"
      )
    )
  })
  tar_make_future()
})

我知道一种选择是在每个步骤中单独配置并行后端,然后调用 tar_make() 以串行执行工作流。我很好奇我是否可以用 tar_make_future() 得到这种结果。

解决方法

我建议您调用 tar_make_future(workers = <max_parallel_workers>) 并让 targets 计算出并行运行的工作线程数。 targets 会自动确定哪些目标可以并行运行,哪些需要等待上游依赖项完成。在您的情况下,某些 data 分支可能会先于其他分支完成,在这种情况下,sum 可以立即开始。换句话说,某些 sum 分支将在其他 sum 分支开始运行之前开始运行,您可以信任 targets 在需要时扩展临时工作线程。 https://books.ropensci.org/targets/hpc.html#future 处的动画可能有助于对此进行可视化。如果您要分别微观管理 datasum 的并行性,您可能需要等待所有 data 完成后才能开始 sum 中的任何一个,这可能需要很长时间。

,

对我的情况有效的解决方案是调用 tar_make_future() 两次。在上面的例子中,这将是:

tar_make_future(data,workers = 1)
tar_make_future(workers = 3)

虽然在我的实际工作流程中它看起来更像:

tar_make_future(data,workers = 4)
tar_make_future(workers = <max_parallel_workers>)

@landau 提出了一个很好的观点,即在进入后续步骤之前,这完全构建了 data 目标。在某些工作流中,干净有效的解决方案是调用 tar_make_future(workers = <max_parallel_workers>) 并接受生成的运行时。

就我而言,等待 data 完成不是问题:我的 data 目标包含许多快速的分支,后续目标的构建速度要慢得多,我可以并行化缓慢的跨过比快步多得多的工人(慢步超过 16 个工人,而快步只有 4 个工人)。如果这些不适用于您的情况,@landau 的建议可能是更好的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?