如何解决我可以使用 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 处的动画可能有助于对此进行可视化。如果您要分别微观管理 data
和 sum
的并行性,您可能需要等待所有 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 举报,一经查实,本站将立刻删除。