6

4 コアの Windows コンピューターでジャグ モデルを並行して実行したいのですが、モデルが実行されない理由がわかりません。私はこれらの投稿を含めて広範囲にウェブを検索しました:

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、およびパッケージ 3-11 の新しい rjags で発生します。エラーメッセージは関数内で発生します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)

この一時ディレクトリにファイルは書き込まれません。

foreach と で 3 つのチェーンを連続して実行すると%do%、3 つの一時ファイルがこのフォルダーに書き込まれます。これらのファイルのサイズは 1 kb で、テキスト エディターで開くと空白で表示されます。

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) 

foreach と で 3 つのチェーンを並行して実行すると%dopar%、3 つの一時ファイルがフォルダーに書き込まれます..Temp\RtmpoBe1gw。outfile のエラー メッセージは、関数が DIFFERENT 一時ディレクトリ内の DIFFERENT ファイルを探していることを示しています。tempfile ディレクトリと名前を作成する行を含めると、3 つの新しい一時フォルダーが作成されていることがわかります (これらは後で削除されますstopCluster)。 jags.modelこれらの 3 つのフォルダーで一時ファイルを探しますが、何もないため失敗します。したがって、一時ファイルが 1 つの一時ディレクトリ (親 R セッションに関連付けられている) に書き込まれ、foreach 内で作成された 3 つの一時ディレクトリで異なる tmpfile を開こうとすると失敗すると思われます。

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が存在しません。

4

3 に答える 3

1

問題の原因を特定しました。通常、R を使用している場合は、一時ディレクトリに対してファイルを読み書きできます。並行して、一時ディレクトリにファイルを書き込むことはできますが、ファイルを読み取る権限がありません。

この問題は、テキスト ファイル (writeLines と readLines を使用) と csv ファイルの書き込みと読み取りの両方で発生します。

その後、「 { のエラー: タスク 1 が失敗しました - 接続を開くことができません」というメッセージが表示された場合、TEMP 内のすべての一時ファイルを削除することで問題を解決できることがわかりました。一部のロックされたファイルについては、必要なファイルを削除する前に、コンピューターをシャットダウンして再起動する必要があります。それでも、同じ R セッション内でエラー メッセージを受け取り、次の試行でプログラムを正常に実行できる場合があります。この問題は、政府のウイルス対策ソフトウェアやリモート ネットワーク アクセスの構造に起因する可能性があります。

簡単にするために、テキスト ファイルを読み書きする例を次に示します。

library(foreach)              
library(doParallel)
wd <- getwd()
data <- data.frame(x=1:10, y=1:10)

これはうまくいきます。

modfile <- tempfile()
print(modfile)
# "C:\\Users\\JESSEW~1\\AppData\\Local\\Temp\\RtmpsvYfFk\\filef38a272022"
write.csv(data, modfile, row.names=F)
m <- read.csv(modfile) 

これは動作しません

cl <- makePSOCKcluster(3, outfile=paste(wd,'/Out_messages.txt', sep=''))   # 3 chains           
clusterSetRNGStream(cl)
registerDoParallel(cl)   
m <- foreach(i=1:3) %dopar% {  
  modfile <- tempfile()
  write.csv(data, modfile, row.names=F)
  x <- read.csv(modfile)
  return(x)
}  
# Error in { : task 1 failed - "cannot open the connection"
stopCluster(cl) 

Out_message.txt からの出力を次に示します。右端の「許可が拒否されました」に注意してください。

starting worker pid=6852 on localhost:11611 at 22:09:19.488
starting worker pid=6984 on localhost:11611 at 22:09:19.926
starting worker pid=3384 on localhost:11611 at 22:09:20.441
Warning message:
  Warning message:
  In file(con, "r") :
  cannot open file 'C:\Users\JESSEW~1\AppData\Local\Temp\Rtmp6dEZLP\file1ac44a506032': Permission denied
In file(con, "r") :
  cannot open file 'C:\Users\JESSEW~1\AppData\Local\Temp\RtmpuydRvR\file1b48185f2a2d': Permission denied
Warning message:
  In file(con, "r") :
  cannot open file 'C:\Users\JESSEW~1\AppData\Local\Temp\RtmpAbOIng\filed382ef37d51': Permission denied
于 2013-09-02T04:27:18.053 に答える
1

エラーはモデル ファイルの書き込みと読み取りによって発生するため、"textConnection" 関数を使用してその問題を回避することをお勧めします。これを使用して、実際のファイルを作成せずにファイルのようなオブジェクトを作成できるため、一時ファイルが不要になります。これを実証するためにあなたの例を修正しました:

library(rjags)
library(doParallel)
library(random)
load.module("lecuyer")
y <- rnorm(100)
n <- length(y)
win.data <- list(y=y, n=n)
model <- "
  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)
    }
  }"
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)

m <- foreach(i=1:3, .packages=c('rjags', 'random'),
             .combine='c', .final=mcmc.list) %dopar% {
  load.module( "lecuyer" )
  model.jags <- jags.model(textConnection(model), win.data, inits=inits,
                           n.chains=1, n.adapt=1000, quiet=TRUE)
  coda.samples(model.jags, params, 1000, thin=5)
}

また、結果の処理を変更して、foreach ループによって返される値が「mcmc.list」オブジェクトになるようにしました。これは、「coda.samples」関数が返すものです。

于 2013-09-02T19:20:41.213 に答える