我已经尝试了很长时间来并行化这段代码,但无济于事。我要么得到错误,要么无效。有人有什么想法吗?
cal_Ops <- function(n, dtm, ratio = 0.1) {
print(n)
selVect <- sample(nrow(dtm), nrow(dtm) * ratio)
holdout <- dtm[selVect,]
training <- dtm[-selVect,]
topModel <- LDA(training, n, control = list(estimate.alpha = FALSE))
return(c(n, perplexity(topModel, holdout), as.numeric(logLik(topModel))))
}
require(plyr)
replication <- 1000
sequ <-seq(5,100,5)
perplex <- ldply(sequ, function(x, dtm) {
t(replicate(replication, cal_Ops(x, dtm))) } , dtm = DTM_to_use)
按原样运行需要很长时间。提前谢谢你。
我尝试将此示例用作复制的并行版本 - 但是,我有很多错误: https://stackoverflow.com/a/19281611/8598566
答案 0 :(得分:1)
您的示例不可重复,例如DTM_to_use
未定义,除了“以下应该工作”的建议外,很难提供帮助:
plyr::ldply(x)
函数接受参数.parallel = TRUE
,它将处理分配给您拥有的任意数量工作人员的块中的x
。这在内部使用foreach框架进行并行处理。有了它,你可以使用任何“做”包。以下是使用未来后端的示例:
library("doFuture")
registerDoFuture()
## Utilize all cores available to this R session
plan(multiprocess)
replication <- 1000
sequ <-seq(from = 5, to = 100, by = 5)
perplex <- plyr::ldply(sequ, function(x) {
t(replicate(replication, c(a = x, b = sqrt(x))))
}, .parallel = TRUE)
str(perplex)
'data.frame': 20000 obs. of 2 variables:
$ a: num 5 5 5 5 5 5 5 5 5 5 ...
$ b: num 2.24 2.24 2.24 2.24 2.24 ...
由于您提到HPC是您的目标:如果您有一个没有作业调度程序的临时群集,但您可以通过SSH连接到每个节点,那么您可以使用:
plan(cluster, workers = c("node1", "node2", "node2", "node3"))
在node1
和node3
以及node2
上的两个核心上分别运行一个核心。如果您确实有一个真正的作业调度程序,比如SGE,那么您可以使用:
library("future.batchtools")
plan(batchtools_sge)
并且sequ
中的每个元素将作为队列中的单个作业处理(实际上对应于具有无限数量的工作者)。如果你想把它组合起来,你可以限制工人数量(=工作),例如
plan(batchtools_sge, workers = 200)
无论后端使用什么,您的脚本都会看起来相同。