【问题标题】:Rmpi mpi.remote.exec() can't access user-defined functionrmpi mpi.remote.exec() 无法访问用户定义的函数
【发布时间】:2020-10-13 17:26:28
【问题描述】:

我正在尝试使用 R 中的 Rmpi​​ 包执行一个简单的函数。当我使用内部用户定义的函数运行 mpi.remote.exec() 函数时,程序找不到我的函数。

library(Rmpi)
mpi.spawn.Rslaves()

df1 <- data.frame("x" = 1:2, "y" = 1:2)
df2 <- data.frame("x" = 2:3, "y" = 2:3)
df3 <- data.frame("x" = 3:4, "y" = 3:4)
df4 <- data.frame("x" = 4:5, "y" = 4:5)

fun <- function(x) {
  input <- get(paste0("df", x), envir = .GlobalEnv) 
  return(input)
}

array <- 1:4
MPIresults <- mpi.remote.exec(cmd = fun, array)

这样做,我收到以下错误消息:

$slave1
[1] "Error in fun(1:4) : could not find function \"fun\"\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in fun(1:4): could not find function "fun">

知道我在这里缺少什么吗?

谢谢!

【问题讨论】:

    标签: r parallel-processing mpi


    【解决方案1】:

    对不起,如果这不合适,但我想我可以帮助解决错误。我可以在这里看到两个问题。

    首先,您必须将自定义函数显式传递给从站,函数mpi.bcast.Robj2slave 将为您完成此操作。有关更详细的说明,请参阅documentation

    所以代码会这样运行:

    library(Rmpi)
    mpi.spawn.Rslaves()
    
    df1 <- data.frame("x" = 1:2, "y" = 1:2)
    df2 <- data.frame("x" = 2:3, "y" = 2:3)
    df3 <- data.frame("x" = 3:4, "y" = 3:4)
    df4 <- data.frame("x" = 4:5, "y" = 4:5)
    
    fun <- function(x) {
      input <- get(paste0("df", x), envir = .GlobalEnv) 
      return(input)
    }
    
    array <- 1:4
    MPIresults <- mpi.remote.exec(cmd = fun, array)
    

    但现在我们看到从站找不到数据帧。解决此问题的一种方法是将它们显式传递给从站,并使用一种方法来选择每个从站将处理的方法。所以对于四个奴隶,你可以这样做:

    library(Rmpi)
    mpi.spawn.Rslaves(nslaves=4)
    
    df1 <- data.frame("x" = 1:2, "y" = 1:2)
    df2 <- data.frame("x" = 2:3, "y" = 2:3)
    df3 <- data.frame("x" = 3:4, "y" = 3:4)
    df4 <- data.frame("x" = 4:5, "y" = 4:5)
    
    fun <- function(x,df_list) {
      slave_num <- mpi.comm.rank() #give slave number
      input <- df_list[[slave_num]] 
      return(input)
    }
    
    array <- 1:4
    df_list <- list(df1,df2,df3,df4)
    
    mpi.bcast.Robj2slave(fun)
    MPIresults <- mpi.remote.exec(cmd = fun, array, df_list)
    

    这将返回您想要的输出

    MPIresults
    $slave1
      x y
    1 1 1
    2 2 2
    
    $slave2
      x y
    1 2 2
    2 3 3
    
    $slave3
      x y
    1 3 3
    2 4 4
    
    $slave4
      x y
    1 4 4
    2 5 5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2017-09-13
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多