【问题标题】:load balancing for parallel processing并行处理的负载平衡
【发布时间】:2016-11-26 06:03:42
【问题描述】:

我正在运行一个类似于查找标准偏差的函数...但运行时间要长得多。

我打算使用该函数来计算标准差的累积值,即第 1 天到第 n 天的标准差类型函数。

但是由于计算需要很长时间,我想在集群上运行它。

所以我想拆分数据,以便集群的每个节点大致在同一时间完成。例如如果我的功能如下,单机方法将按以下方式工作:

vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
lapply(1:length(vec), function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}

(注意这里添加了 sys.sleep 以表示处理我的自定义函数所花费的额外时间)

但是,假设我想将其拆分为两台机器而不是 1,我将如何拆分向量 1:length(vec) 以便我可以为每台机器提供 c(1:y) 到机器 1 和 c((y+1):length(vec)) 到机器的列表2、使两台机器按时完成。即 y 的值是多少,这样两个过程将大致同时完成......如果我们要在 10 台机器上完成它会怎样......如何在原始向量中找到中断 @987654325 @ 让它工作......

即我会的

y <- 750 # This is just a guess as to potentially where it might be.
vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
# on machine 1 I would have
lapply(1:y, function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}

# and on machine 2 I would have

lapply(y+1:length(vec), function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}

【问题讨论】:

  • 我会考虑以递归方式重写算法和/或矢量化计算。这可以节省大量的重复计算。请注意,您仍然可以通过例如并行化它将 x = seq (1, length (vec), by = p) + (0 : (p - 1)) 分配给 p 不同的工作人员(但这将意味着再次重复计算,但不像总是从 1 开始计算那么多)。

标签: r parallel-processing load-balancing


【解决方案1】:

parallel package 现在是基本 R 的一部分,可以帮助在中等规模的集群上运行 R,包括在 Amazon EC2 上。 parLapplyLB 函数会将输入向量中的工作分配到集群的工作节点上。

要知道的是,makePSOCKcluster(目前从 R 2.15.2 开始)被 NCONNECTIONS constant in connections.c 限制为 128 名工作人员。

这是一个使用并行包的会话的快速示例,您可以在自己的机器上尝试:

library(parallel)
help(package=parallel)

## create the cluster passing an IP address for
## the head node
## hostname -i works on Linux, but not on BSD
## descendants (like OS X)
# cl <- makePSOCKcluster(hosts, master=system("hostname -i", intern=TRUE))

## for testing, start a cluster on your local machine
cl <- makePSOCKcluster(rep("localhost", 3))

## do something once on each worker
ans <- clusterEvalQ(cl, { mean(rnorm(1000)) })

## push data to the workers
myBigData <- rnorm(10000)
moreData <- c("foo", "bar", "blabber")
clusterExport(cl, c('myBigData', 'moreData'))

## test a time consuming job
## (~30 seconds on a 4 core machine)
system.time(ans <- parLapplyLB(cl, 1:100, function(i) {
  ## summarize a bunch of random sample means
  summary(
    sapply(1:runif(1, 100, 2000),
           function(j) { mean(rnorm(10000)) }))
}))

## shut down worker processes
stopCluster(cl)

Bioconductor 小组已经建立了一个非常简单的入门方法:Using a parallel cluster in the cloud

有关在 EC2 上使用并行包的更多信息,请参阅:R in the Cloud,对于集群上的 R,请参阅:CRAN Task View: High-Performance and Parallel Computing with R

最后,R 之外的另一个完善的选项是Starcluster

【讨论】:

  • 非常感谢!这是我发现的唯一适用于 Windows 7 64 位的工作示例。有没有办法以同样的方式用 %dopar% 制作 foreach?
  • 是的,doParallel 包是 foreach 包的后端,它在下面使用并行。
【解决方案2】:

查看snow 包——特别是clusterApplyLB 函数来处理负载平衡的应用函数。

这实际上将比平均分区更智能地处理节点/核心的工作分配。

【讨论】:

  • 在我的示例中(多次运行 kmeans),clusterApplyLB 比 parLapply 快 50%。
【解决方案3】:

考虑通过RHIPE 使用 Hadoop(又名 MapReduce)。

【讨论】:

  • 您的链接已损坏。
  • @scs 感谢您的提醒。下次,请随时提出修改建议:)
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2012-07-22
  • 2017-09-21
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多