Я хотел бы запускать модели jags параллельно на своем компьютере с Windows с 4 ядрами, но не смог понять, почему моя модель не запускается. Я много искал в Интернете, включая эти сообщения:
http://andrewgelman.com/2011/07/23/parallel-jags-rngs/
http://users.soe.ucsc.edu/~draper/eBay-Google-2013-parallel-rjags-example.txt
Когда я запускаю простой пример (см. код ниже) с %do%
, модель работает нормально (конечно, последовательно). Когда я использую %dopar%
, я получаю сообщение об ошибке: Error in { : task 1 failed - "Symbol table is empty"
library(rjags)
library(coda)
library(foreach)
library(doParallel)
library(random)
load.module("lecuyer")
### Data generation
y <- rnorm(100)
n <- length(y)
win.data <- list(y=y, n=n)
# Define model
sink("model.txt")
cat("
model {
# Priors
mu ~ dnorm(0, 0.001)
tau <- 1 / (sigma * sigma)
sigma ~ dunif(0, 10)
# Likelihood
for (i in 1:n) {
y[i] ~ dnorm(mu, tau)
}
}
",fill=TRUE)
sink()
inits <- function(){ list(mu=rnorm(1), sigma=runif(1, 0, 10),
.RNG.name = "lecuyer::RngStream",
.RNG.seed = as.numeric(randomNumbers( n = 1, min = 1, max = 1e+06, col = 1 )) ) }
params <- c('mu','sigma')
cl <- makePSOCKcluster(3)
clusterSetRNGStream(cl)
registerDoParallel(cl)
model.wd <- paste(getwd(), '/model.txt', sep='') # I wondered if the cores were having trouble finding the model.
m <- foreach(i=1:3, .packages=c('rjags','random','coda'), .multicombine=TRUE) %dopar% {
load.module( "lecuyer" )
model.jags <- jags.model(model.wd, win.data, inits=inits, n.chains=1, n.adapt=1000, quiet=TRUE)
result <- coda.samples(model.jags, params, 1000, thin=5)
return(result)
}
stopCluster(cl)
# Error in { : task 1 failed - "Symbol table is empty
sessionInfo()
# R version 3.0.1 (2013-05-16)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
#
# locale:
# [1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 LC_MONETARY=English_Canada.1252
# [4] LC_NUMERIC=C LC_TIME=English_Canada.1252
#
# attached base packages:
# [1] parallel stats graphics grDevices utils datasets methods base
#
# other attached packages:
# [1] random_0.2.1 doParallel_1.0.3 iterators_1.0.6 foreach_1.4.1 rjags_3-10 coda_0.16-1
# [7] lattice_0.20-21
#
# loaded via a namespace (and not attached):
# [1] codetools_0.2-8 compiler_3.0.1 grid_3.0.1 tools_3.0.1
Подробнее:
Проблема возникает на компьютере с Windows 7 без прав администратора, но не на компьютере с правами администратора. Проблема возникает с Rgui и Rterm, а также с новыми пакетами rjag 3-11. Сообщение об ошибке возникает внутри функции jags.model
Проблема, по-видимому, связана с несоответствием при записи и чтении файлов во временный каталог. Когда я запускаю R, он автоматически создает временную папку. Когда я закрываю R, эта папка автоматически удаляется, если в ней нет файлов.
Например, когда я запускаю R, он создает эту папку: C:\Users\jesse whittington\AppData\Local\Temp\RtmpoBe1gw
.
Когда я запускаю модель rjags с
m <- jags.model(file='model.txt', data=win.data, inits=inits, n.chains=3, n.adapt=1000, quiet=FALSE)
Никакие файлы не записываются в этот временный каталог.
Когда я последовательно запускаю 3 цепочки с помощью foreach и %do%
, в эту папку записывается 3 временных файла. Эти файлы имеют размер 1 КБ, и когда я открываю их в текстовом редакторе, они кажутся пустыми.
wd <- getwd()
cl <- makePSOCKcluster(3, outfile=paste(wd,'/Out_messages.txt', sep='')) # 3 chains
clusterSetRNGStream(cl)
registerDoParallel(cl)
m <- foreach(i=1:3, .packages=c('rjags','random','coda'), .multicombine=TRUE) %do% {
load.module( "lecuyer" )
result <- jags.model(file='model.txt', data=win.data, inits=inits, n.chains=1, n.adapt=1000, quiet=FALSE)
return(result)
}
stopCluster(cl)
Когда я запускаю 3 цепочки параллельно с foreach и %dopar%
, в папку ..Temp\RtmpoBe1gw
записывается 3 временных файла. Сообщения об ошибках в выходном файле предполагают, что функция ищет РАЗНЫЕ файлы в РАЗНЫХ временных каталогах. Когда я включаю строку для создания каталога и имени временного файла, я вижу, что создаются 3 новых временных папки (позже они удаляются с помощью stopCluster
). jags.model
ищет в этих трех папках временные файлы и терпит неудачу, потому что в них ничего нет. Таким образом, я подозреваю, что временные файлы записываются в один временный каталог (связанный с родительским сеансом R), а затем происходит сбой при попытке открыть разные временные файлы в трех временных каталогах, созданных в foreach.
wd <- getwd()
cl <- makePSOCKcluster(3, outfile=paste(wd,'/Out_messages.txt', sep='')) # 3 chains
clusterSetRNGStream(cl)
registerDoParallel(cl)
m <- foreach(i=1:3, .packages=c('rjags','random','coda'), .multicombine=TRUE) %dopar% {
load.module( "lecuyer" )
tmp <- tempfile()
print(tmp)
result <- jags.model(file='model.txt', data=win.data, inits=inits, n.chains=1, n.adapt=1000, quiet=FALSE)
return(result)
}
stopCluster(cl)
Из Out_messages.txt
starting worker pid=4396 on localhost:11109 at 08:34:06.430
starting worker pid=6548 on localhost:11109 at 08:34:06.879
starting worker pid=6212 on localhost:11109 at 08:34:07.418
Loading required package: coda
Loading required package: lattice
Loading required package: coda
Loading required package: lattice
Loading required package: coda
Loading required package: lattice
Linked to JAGS 3.3.0
Loaded modules: basemod,bugs
Linked to JAGS 3.3.0
Loaded modules: basemod,bugs
Linked to JAGS 3.3.0
Loaded modules: basemod,bugs
module lecuyer loaded
module lecuyer loaded
module lecuyer loaded
[1] "C:\\Users\\JESSEW~1\\AppData\\Local\\Temp\\RtmpQbPAVC\\file112c8077a0" # Note this is from: tmp <- tempfile()
[1] "C:\\Users\\JESSEW~1\\AppData\\Local\\Temp\\RtmpMPMpcY\\file199489564c6"
[1] "C:\\Users\\JESSEW~1\\AppData\\Local\\Temp\\Rtmpk9vMR5\\file18445f6b2fd4"
Compiling model graph
Compiling model graph
Compiling model graph
Warning messages:
1: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Unused variable "y" in data
2: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Unused variable "n" in data
3: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Failed to open file C:\Users\JESSEW~1\AppData\Local\Temp\RtmpQbPAVC\file112c394b4eef
Nothing to compile
4: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Unused initial value for "mu" in chain 1
5: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Unused initial value for "sigma" in chain 1
6: In jags.model(file = "model.txt", data = win.data, inits = inits, :
Can't initialize. No nodes in graph (Have you compiled the model?)
Папка RtmpQbPAVC
создана, а файл file112c394b4eef
не существует.
cl
вregisterDoParallel
. Я не думаю, что это является причиной вашей ошибки, но это означает, что кластер, который вы фактически будете использовать, не будет кластером, инициализированнымclusterSetRNGStream
. - person Steve Weston   schedule 26.08.2013jags.model
. Функция обнаруживает ошибки в имени модели и недопустимые функции в инициализации, но не ошибки в win.data. - person Jesse   schedule 27.08.2013jags.model
работает правильно при использовании вне строкиforeach
(последовательно)? - person nograpes   schedule 30.08.2013%dopar%
на%do%
. Я установил программу JAGS некоторое время назад в C:/Stats, я думаю (если я правильно помню), потому что она не работала при установке в Program Files (Windows 7). Интересно, запущены ли параллельные процессы в каком-то каталоге, где они не могут создавать файлы. Например, я не могу копировать и вставлять какие-либо файлы в каталог Program Files, потому что у меня нет прав администратора. Спасибо за тестирование! - person Jesse   schedule 30.08.2013clusterEvalQ(cl, getwd())
. Вы также можете попробовать запустить простой тест, чтобы увидеть, могут ли рабочие создавать файлы в своем текущем каталоге. - person Steve Weston   schedule 30.08.2013clusterEvalQ(cl, getwd())
печатает текущий каталог, как иreturn(getwd())
в вызове foreach. C:/a_U_drive/R_scripts/Parallel_MCMC. - person Jesse   schedule 30.08.2013get_data
что-то пошло не так, но до тех пор об этом не сообщалось. Вы должны убедиться, что видите какие-либо предупреждающие сообщения от воркеров, установивquiet=FALSE
при вызове jags.model, а также использовать параметр makePSOCKclusteroutfile
, чтобы выходные данные не сбрасывались. К сожалению,outfile=''
может не работать, если вы используете R GUI, что я обычно и советую. - person Steve Weston   schedule 31.08.2013C:\Users\Jesse... Nothing to compile
. Есть еще 5 ошибок, связанных с неиспользуемыми переменными и начальными значениями. Спасибо за вашу помощь! - person Jesse   schedule 31.08.2013jags.parallel
илиrunjags
? Это может быть проще, чем пытаться выполнить параллельную работу самостоятельно. - person Tomas   schedule 26.01.2014jags.parallel
есть два сообщения, возможно, они помогут вам заставить его работать stackoverflow.com/q/17808575/684229 и < href="http://stackoverflow.com/q/16723036/684229">stackoverflow.com/q/16723036/684229. Но у меня нет окончательного решения. Пожалуйста, дайте мне знать, если вы найдете решение, я должен сделать то же самое. - person Tomas   schedule 27.01.2014