2017-01-13 2 views
1

Я пытаюсь запустить репликативные цепочки байесовской статистической функции на нескольких ядрах; 1 цепь на сердечник. Функция mcmc ниже представляет собой скрипт для запуска одной цепочки mcmc. Я думаю, что я могу просто запустить mcmc функцию три раза, каждый экземпляр на отдельном ядре. Я нашел пару примеров, которые я пытался изменить, но не смог заставить его работать надлежащим образом. Я получаю следующую ошибку: 3 узла произвели ошибки; первая ошибка: неправильное количество измерений. Это заставляет меня думать, что я не понимаю, как использовать параллельную версию функции apply. Я продолжаю думать, что это должно быть прямо, но, похоже, не может найти мою ошибку. Я так много изучаю байесовскую статистику, программирование и компьютеры на лету. Может ли кто-нибудь сказать мне, что я делаю неправильно?Запуск нескольких байесовских цепей в параллельном R: 3 узла вызвали ошибки; первая ошибка: неправильное количество измерений

Приносим извинения, если ранее был дан ответ, я не смог найти ответ, который помог.

library(parallel) 
library(snowfall) 
library(rlecuyer) 

cps=detectCores()-5 #I have access to 8 cores, but want to target only three 
sfInit(parallel=TRUE, cpus=cps) 
sfExportAll() 
sfClusterSetupRNG() 

#necessary input; GB, all.layers, ind defined previously 
nchain=3 
n.mcmc=2000 
df=9 

#mcmc is a function to run a single mcmc chain 
tmp.fcn <- function(i){ 
    tmp.out[i]=mcmc(GB,all.layers,ind,df,n.mcmc) 
} 


sfExport("GB","all.layers","ind","df","n.mcmc","nchain") 
tmp.time=Sys.time() 
score.list=sfClusterApplySR(1:nchain,tmp.fcn) 
time.1=Sys.time()-tmp.time 

ответ

1

Я выяснил, каковы были мои проблемы. Во-первых, я переключил пакеты и использовал параллель вместо снегопада. Во-вторых, я понял, что мне нужен список, который разбивает мою проблему на части, чтобы применить мою функцию. В моем случае вместо начальных значений для моей переменной t, случайно созданной внутри функции, которую я хотел применить, я составил список из 3 случайных значений начала, а затем применил мою функцию (tmp.func) к этому списку (t.start) ,

library(parallel) 
n.core<-detectCores()-5 
cl <- makeCluster(n.core) 

#write function 
tmp.func<-function(i){ 
tmp.out=mcmc(GB,all.layers,ind,df=8,cov.1=.5,cov.0=.15,t.start[i],n.mcmc=11000) 
tmp.out 
} 

t.start=c(.15,.1,.2) 
clusterEvalQ(cl,{library(adegenet);library(Matrix);library(MASS);library(mvtnorm);library(fda);library(raster);library(rgdal)}) 

clusterExport(cl,c("t.start","GB","all.layers","ind","mcmc")) 

#apply function 
out.11k=parLapply(cl,1:length(t.start),tmp.func) 


stopCluster(cl)