【问题标题】:foreach with doParallel doesn't work with more than 1 core带有 doParallel 的 foreach 不适用于超过 1 个核心
【发布时间】:2023-03-12 18:15:01
【问题描述】:

我在启动此功能时遇到问题:

  blocs <- split(df, 1 + (1:nrow(df)) %% ncores)
  cl <- makeCluster(ncores)
  registerDoParallel(cl)
  if (mode == "batch"){
    res <- foreach(i = blocs, .combine = "cbind", .export = c("batch_gradient_descent", "sampled_df", "add_constant", "sigmoid", "log_loss_function")) %dopar% {
      coefs <- batch_gradient_descent(df, colnames(X), colnames(y), learning_rate, max_iter)
    }
    return(res)
  }

当我使用 1 个核心运行它时,它可以工作。当我使用 2 个或更多内核时,它不会进入我的 foreach 函数,没有任何反应,我也没有错误。 我可能会错过一些东西,但经过大量搜索后,无法找到解决方案!

有人可以给我这个案例的提示吗?

【问题讨论】:

  • 你的问题描述不够详细。你怎么知道它没有进入循环?你怎么知道什么都没发生?您应该提供一个最小的、独立且可重现的示例,以便我们对此进行调查。
  • 抱歉 Roland,这只是我在 stackoverflow 上的第二篇文章。下次我会尽力而为,会更准确。 Danlooo 帮助了我,而且效果很好!关于您的问题:它没有进入循环,因为我尝试制作一个简单的“print("ok") 并且控制台上没有出现任何内容。
  • 并行工作者无法打印到控制台。

标签: r foreach parallel-processing logistic-regression doparallel


【解决方案1】:

blocs &lt;- split(df, 1 + (1:nrow(df)) %% ncores) 将产生ncores 包含相同数据的许多批次(例如,只有 3 个副本)。尝试做某事。改为这样:

library(tidyverse)
library(doParallel)
ncores <- 3
df <- iris

blocs <-
  df %>%
  mutate(batch = row_number() %% ncores) %>%
  nest(-batch) %>%
  pull(data)
cl <- makeCluster(ncores)
registerDoParallel(cl)

res <- foreach(i = blocs, .combine = "rbind") %dopar% {
    Sys.sleep(5)
    coefs <- mean(i$Sepal.Length)
}

【讨论】:

  • 谢谢 danlooo,我的 blocs 已创建,我在打印 blocs 时看到了它们,但现在我面临一个新错误,它似乎来自我的数据集。你知道这个错误吗? data.frame 中的错误(值,row.names = rn,check.names = FALSE):'row.names' 应指定变量之一
  • rn 的值有误。请为新问题打开一个新问题。
猜你喜欢
  • 2016-10-11
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2013-09-26
  • 2021-02-13
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多