【问题标题】:Can I set different degrees of parallelism for different targets with the R {targets} package?我可以使用 R {targets} 包为不同的目标设置不同的并行度吗?
【发布时间】:2021-08-20 20:26:05
【问题描述】:

我正在测试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()能不能得到这样的结果。

【问题讨论】:

    标签: r r-future targets-r-package


    【解决方案1】:

    我建议您致电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,这可能需要很长时间。

    【讨论】:

      【解决方案2】:

      适用于我的情况的解决方案是调用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 = &lt;max_parallel_workers&gt;) 并接受生成的运行时。

      在我的例子中,等待 data 完成不是问题:我的 data 目标包含许多快速的分支,后续目标的构建速度要慢得多,我可以将慢步并行处理更多工人比快步骤(慢步骤 16 个以上的工人,而快步骤只有 4 个工人)。如果您的情况并非如此,@landau 的建议可能是更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        相关资源
        最近更新 更多