Problemas em foreach e parallel

Prezados, estou tentando utilizar as ferramentas de paralelo em R para Windows. Acontecem dois problemas: 1. Às vezes parece que os workers não 'ativam', dando a mensagem de erro abaixo. Note que não roda, pois o tetaM continua como matriz de 0s. Eu às vezes tenho de colar as funções mais de uma vez para então 'ligar'. 2. Neste exemplo, eu faço replicações de amostras de um MRLM (só um treinamento) e estimo o modelo para cada amostra. Independente da quantidade de amostras que eu gero (M amostras), ele sempre me devolve com 3 resultados a menos. 3 é o nº de cores que eu coloquei. Alguém tem alguma ideia da origem do problema? Ah, eu fiz para outros modelos que trabalho e ocorrem os mesmos problemas # Criação dos cores em paralelo: library(doParallel) library(foreach) cl<-makeCluster(3, type="SOCK") library(doSNOW) registerDoSNOW(cl) # Código # Modelo Normal n=100 M=10 p=2 X=matrix(1,n,p) X[,2]=runif(n) beta0=matrix(c(5,1),2,1) sigma2=1 yM=matrix(0,n,M) for (k in 1:M) { erro=rnorm(n,0,sigma2) yM[,k]=X%*%beta0+erro } tetaM=matrix(0,p,M) strt<-Sys.time() tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { y=yM[,k] tetaM[,k]=lm(y~X-1)$coefficients #sgn.logL(teta3,y,X) } print(Sys.time()-strt) tetaM # Rodando no R: > tetaM=matrix(0,p,M) > strt<-Sys.time() > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { + y=yM[,k] + tetaM[,k]=lm(y~X-1)$coefficients + #sgn.logL(teta3,y,X) + } Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : worker initialization failed: 5.207760032192210.72556160440376 > print(Sys.time()-strt) Time difference of 0.06304097 secs > > tetaM [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0 0 0 0 0 0 0 0 0 0 [2,] 0 0 0 0 0 0 0 0 0 0 > tetaM=matrix(0,p,M) > strt<-Sys.time() > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { + y=yM[,k] + tetaM[,k]=lm(y~X-1)$coefficients + #sgn.logL(teta3,y,X) + } > print(Sys.time()-strt) Time difference of 0.07505703 secs > > tetaM result.1 result.2 result.3 result.4 result.6 result.7 result.10 X1 4.738553 4.584143 4.923599 4.962845 4.737695 5.2330998 4.9280171 X2 1.313208 1.855138 1.121618 1.053215 1.571513 0.6168855 0.9040763 Atenciosamente, Prof. Clécio da Silva Ferreira Depto de Estatística - UFJF Tel: (32) 2102-3306 Página: www.ufjf.br/clecio_ferreira

Clécio, Não sei exatamente a razão da mensagem de erro, mas repare que você cria a matriz tetaM, depois atribui à tetaM o resultado do foreach, e *dentro* do foreach você ainda tenta atribuir à coluna k de tetaM os coeficientes da regressão. Imagino que seja alguma coisa aí no meio que esteja causando o erro. De toda forma, o foreach com o argumento .combine=cbind já retornaria uma matriz p por M. Segue abaixo uma versão simplificada e funcional do seu código: # Criação dos cores em paralelo:library(doParallel)cl <- makeCluster(3) registerDoParallel(cl) # Código# Modelo Normal n <- 100M <- 1e4p <- 2X <- matrix(1, n, p)X[, 2] <- runif(n)beta0 <- matrix(c(5, 1), 2, 1)sigma2 <- 1 # Simulação strt <- Sys.time()tetaM <- foreach(k = 1:M, .combine = cbind) %dopar% { erro <- rnorm(n, 0, sigma2) y <- X %*% beta0 + erro lm(y ~ X-1)$coefficients}print(Sys.time()-strt) dim(tetaM)tetaM[, 1:100] De: Clécio da Silva Ferreira <clecio.ferreira@ufjf.edu.br> Para: r-br@listas.c3sl.ufpr.br Enviadas: Quarta-feira, 21 de Outubro de 2015 9:03 Assunto: [R-br] Problemas em foreach e parallel Prezados, estou tentando utilizar as ferramentas de paralelo em R para Windows. Acontecem dois problemas:1. Às vezes parece que os workers não 'ativam', dando a mensagem de erro abaixo. Note que não roda, pois o tetaM continua como matriz de 0s. Eu às vezes tenho de colar as funções mais de uma vez para então 'ligar'. 2. Neste exemplo, eu faço replicações de amostras de um MRLM (só um treinamento) e estimo o modelo para cada amostra. Independente da quantidade de amostras que eu gero (M amostras), ele sempre me devolve com 3 resultados a menos. 3 é o nº de cores que eu coloquei. Alguém tem alguma ideia da origem do problema? Ah, eu fiz para outros modelos que trabalho e ocorrem os mesmos problemas # Criação dos cores em paralelo:library(doParallel)library(foreach)cl<-makeCluster(3, type="SOCK") library(doSNOW)registerDoSNOW(cl) # Código # Modelo Normaln=100M=10p=2X=matrix(1,n,p)X[,2]=runif(n)beta0=matrix(c(5,1),2,1)sigma2=1 yM=matrix(0,n,M)for (k in 1:M) { erro=rnorm(n,0,sigma2) yM[,k]=X%*%beta0+erro} tetaM=matrix(0,p,M)strt<-Sys.time()tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { y=yM[,k]tetaM[,k]=lm(y~X-1)$coefficients#sgn.logL(teta3,y,X)}print(Sys.time()-strt) tetaM # Rodando no R:
tetaM=matrix(0,p,M)> strt<-Sys.time()> tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { + y=yM[,k]+ tetaM[,k]=lm(y~X-1)$coefficients+ #sgn.logL(teta3,y,X)+ }Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : worker initialization failed: 5.207760032192210.72556160440376> print(Sys.time()-strt)Time difference of 0.06304097 secs> > tetaM [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10][1,] 0 0 0 0 0 0 0 0 0 0[2,] 0 0 0 0 0 0 0 0 0 0> tetaM=matrix(0,p,M)> strt<-Sys.time()> tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { + y=yM[,k]+ tetaM[,k]=lm(y~X-1)$coefficients+ #sgn.logL(teta3,y,X)+ }> print(Sys.time()-strt)Time difference of 0.07505703 secs> > tetaM result.1 result.2 result.3 result.4 result.6 result.7 result.10X1 4.738553 4.584143 4.923599 4.962845 4.737695 5.2330998 4.9280171X2 1.313208 1.855138 1.121618 1.053215 1.571513 0.6168855 0.9040763
Atenciosamente, Prof. Clécio da Silva Ferreira Depto de Estatística - UFJF Tel: (32) 2102-3306 Página: www.ufjf.br/clecio_ferreira _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne� c�igo m�imo reproduz�el.

Olá, Rubem, obrigado pela ajuda. Mas note abaixo que não resolveu o problema de não estimar todas as amostras. Anda, note que é aleatório, pois nesse resultado, ela deixou de estimar as amostras 1, 4 e 5. No exemplo anterior, foram as amostras 5, 8 e 9. > tetaM=matrix(0,p,M) > strt<-Sys.time() > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { + y=yM[,k] + lm(y~X-1)$coefficients + #sgn.logL(teta3,y,X) + } > print(Sys.time()-strt) Time difference of 0.1875119 secs > > tetaM result.2 result.3 result.6 result.7 result.8 result.9 result.10 X1 4.584143 4.923599 4.737695 5.2330998 4.743239 5.2077600 4.9280171 X2 1.855138 1.121618 1.571513 0.6168855 1.305456 0.7255616 0.9040763 Atenciosamente, Prof. Clécio da Silva Ferreira Depto de Estatística - UFJF Tel: (32) 2102-3306 Página: www.ufjf.br/clecio_ferreira Em 21 de outubro de 2015 13:24, Rubem Kaipper Ceratti < rubem_ceratti@yahoo.com.br> escreveu: > Clécio, > > Não sei exatamente a razão da mensagem de erro, mas repare que você cria a > matriz tetaM, depois atribui à tetaM o resultado do foreach, e *dentro* do > foreach você ainda tenta atribuir à coluna k de tetaM os coeficientes da > regressão. Imagino que seja alguma coisa aí no meio que esteja causando o > erro. > > De toda forma, o foreach com o argumento *.combine=cbind* já retornaria > uma matriz p por M. Segue abaixo uma versão simplificada e funcional do seu > código: > > # Criação dos cores em paralelo: > library(doParallel) > cl <- makeCluster(3) > registerDoParallel(cl) > > > # Código > # Modelo Normal > n <- 100 > M <- 1e4 > p <- 2 > X <- matrix(1, n, p) > X[, 2] <- runif(n) > beta0 <- matrix(c(5, 1), 2, 1) > sigma2 <- 1 > > > # Simulação > strt <- Sys.time() > tetaM <- foreach(k = 1:M, .combine = cbind) %dopar% { > erro <- rnorm(n, 0, sigma2) > y <- X %*% beta0 + erro > lm(y ~ X-1)$coefficients > } > print(Sys.time()-strt) > > dim(tetaM) > tetaM[, 1:100] > > > ------------------------------ > *De:* Clécio da Silva Ferreira <clecio.ferreira@ufjf.edu.br> > *Para:* r-br@listas.c3sl.ufpr.br > *Enviadas:* Quarta-feira, 21 de Outubro de 2015 9:03 > *Assunto:* [R-br] Problemas em foreach e parallel > > Prezados, estou tentando utilizar as ferramentas de paralelo em R para > Windows. Acontecem dois problemas: > 1. Às vezes parece que os workers não 'ativam', dando a mensagem de erro > abaixo. Note que não roda, pois o tetaM continua como matriz de 0s. Eu às > vezes tenho de colar as funções mais de uma vez para então 'ligar'. > > 2. Neste exemplo, eu faço replicações de amostras de um MRLM (só um > treinamento) e estimo o modelo para cada amostra. Independente da > quantidade de amostras que eu gero (M amostras), ele sempre me devolve com > 3 resultados a menos. 3 é o nº de cores que eu coloquei. > > Alguém tem alguma ideia da origem do problema? Ah, eu fiz para outros > modelos que trabalho e ocorrem os mesmos problemas > > > # Criação dos cores em paralelo: > library(doParallel) > library(foreach) > cl<-makeCluster(3, type="SOCK") > library(doSNOW) > registerDoSNOW(cl) > > > # Código > > # Modelo Normal > n=100 > M=10 > p=2 > X=matrix(1,n,p) > X[,2]=runif(n) > beta0=matrix(c(5,1),2,1) > sigma2=1 > > yM=matrix(0,n,M) > for (k in 1:M) { > erro=rnorm(n,0,sigma2) > yM[,k]=X%*%beta0+erro > } > > > tetaM=matrix(0,p,M) > strt<-Sys.time() > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { > y=yM[,k] > tetaM[,k]=lm(y~X-1)$coefficients > #sgn.logL(teta3,y,X) > } > print(Sys.time()-strt) > > tetaM > > > # Rodando no R: > > > tetaM=matrix(0,p,M) > > strt<-Sys.time() > > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { > + y=yM[,k] > + tetaM[,k]=lm(y~X-1)$coefficients > + #sgn.logL(teta3,y,X) > + } > Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : > worker initialization failed: 5.207760032192210.72556160440376 > > print(Sys.time()-strt) > Time difference of 0.06304097 secs > > > > tetaM > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] 0 0 0 0 0 0 0 0 0 0 > [2,] 0 0 0 0 0 0 0 0 0 0 > > tetaM=matrix(0,p,M) > > strt<-Sys.time() > > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { > + y=yM[,k] > + tetaM[,k]=lm(y~X-1)$coefficients > + #sgn.logL(teta3,y,X) > + } > > print(Sys.time()-strt) > Time difference of 0.07505703 secs > > > > tetaM > result.1 result.2 result.3 result.4 result.6 result.7 result.10 > X1 4.738553 4.584143 4.923599 4.962845 4.737695 5.2330998 4.9280171 > X2 1.313208 1.855138 1.121618 1.053215 1.571513 0.6168855 0.9040763 > > > Atenciosamente, > > Prof. Clécio da Silva Ferreira > Depto de Estatística - UFJF > Tel: (32) 2102-3306 > Página: www.ufjf.br/clecio_ferreira > > > _______________________________________________ > R-br mailing list > R-br@listas.c3sl.ufpr.br > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne� c�igo > m�imo reproduz�el. > > > _______________________________________________ > R-br mailing list > R-br@listas.c3sl.ufpr.br > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça > código mínimo reproduzível. >

Problema resolvido pela regra nº 1: reseta (no caso remover todos os objetos) e recomece. Atenciosamente, Prof. Clécio da Silva Ferreira Depto de Estatística - UFJF Tel: (32) 2102-3306 Página: www.ufjf.br/clecio_ferreira Em 21 de outubro de 2015 18:13, Clécio da Silva Ferreira < clecio.ferreira@ufjf.edu.br> escreveu: > Olá, Rubem, obrigado pela ajuda. Mas note abaixo que não resolveu o > problema de não estimar todas as amostras. Anda, note que é aleatório, > pois nesse resultado, ela deixou de estimar as amostras 1, 4 e 5. No > exemplo anterior, foram as amostras 5, 8 e 9. > > > tetaM=matrix(0,p,M) > > strt<-Sys.time() > > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { > + y=yM[,k] > + lm(y~X-1)$coefficients > + #sgn.logL(teta3,y,X) > + } > > print(Sys.time()-strt) > Time difference of 0.1875119 secs > > > > tetaM > result.2 result.3 result.6 result.7 result.8 result.9 result.10 > X1 4.584143 4.923599 4.737695 5.2330998 4.743239 5.2077600 4.9280171 > X2 1.855138 1.121618 1.571513 0.6168855 1.305456 0.7255616 0.9040763 > > Atenciosamente, > > Prof. Clécio da Silva Ferreira > Depto de Estatística - UFJF > Tel: (32) 2102-3306 > Página: www.ufjf.br/clecio_ferreira > > > Em 21 de outubro de 2015 13:24, Rubem Kaipper Ceratti < > rubem_ceratti@yahoo.com.br> escreveu: > >> Clécio, >> >> Não sei exatamente a razão da mensagem de erro, mas repare que você cria >> a matriz tetaM, depois atribui à tetaM o resultado do foreach, e *dentro* >> do foreach você ainda tenta atribuir à coluna k de tetaM os coeficientes da >> regressão. Imagino que seja alguma coisa aí no meio que esteja causando o >> erro. >> >> De toda forma, o foreach com o argumento *.combine=cbind* já retornaria >> uma matriz p por M. Segue abaixo uma versão simplificada e funcional do seu >> código: >> >> # Criação dos cores em paralelo: >> library(doParallel) >> cl <- makeCluster(3) >> registerDoParallel(cl) >> >> >> # Código >> # Modelo Normal >> n <- 100 >> M <- 1e4 >> p <- 2 >> X <- matrix(1, n, p) >> X[, 2] <- runif(n) >> beta0 <- matrix(c(5, 1), 2, 1) >> sigma2 <- 1 >> >> >> # Simulação >> strt <- Sys.time() >> tetaM <- foreach(k = 1:M, .combine = cbind) %dopar% { >> erro <- rnorm(n, 0, sigma2) >> y <- X %*% beta0 + erro >> lm(y ~ X-1)$coefficients >> } >> print(Sys.time()-strt) >> >> dim(tetaM) >> tetaM[, 1:100] >> >> >> ------------------------------ >> *De:* Clécio da Silva Ferreira <clecio.ferreira@ufjf.edu.br> >> *Para:* r-br@listas.c3sl.ufpr.br >> *Enviadas:* Quarta-feira, 21 de Outubro de 2015 9:03 >> *Assunto:* [R-br] Problemas em foreach e parallel >> >> Prezados, estou tentando utilizar as ferramentas de paralelo em R para >> Windows. Acontecem dois problemas: >> 1. Às vezes parece que os workers não 'ativam', dando a mensagem de erro >> abaixo. Note que não roda, pois o tetaM continua como matriz de 0s. Eu às >> vezes tenho de colar as funções mais de uma vez para então 'ligar'. >> >> 2. Neste exemplo, eu faço replicações de amostras de um MRLM (só um >> treinamento) e estimo o modelo para cada amostra. Independente da >> quantidade de amostras que eu gero (M amostras), ele sempre me devolve com >> 3 resultados a menos. 3 é o nº de cores que eu coloquei. >> >> Alguém tem alguma ideia da origem do problema? Ah, eu fiz para outros >> modelos que trabalho e ocorrem os mesmos problemas >> >> >> # Criação dos cores em paralelo: >> library(doParallel) >> library(foreach) >> cl<-makeCluster(3, type="SOCK") >> library(doSNOW) >> registerDoSNOW(cl) >> >> >> # Código >> >> # Modelo Normal >> n=100 >> M=10 >> p=2 >> X=matrix(1,n,p) >> X[,2]=runif(n) >> beta0=matrix(c(5,1),2,1) >> sigma2=1 >> >> yM=matrix(0,n,M) >> for (k in 1:M) { >> erro=rnorm(n,0,sigma2) >> yM[,k]=X%*%beta0+erro >> } >> >> >> tetaM=matrix(0,p,M) >> strt<-Sys.time() >> tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { >> y=yM[,k] >> tetaM[,k]=lm(y~X-1)$coefficients >> #sgn.logL(teta3,y,X) >> } >> print(Sys.time()-strt) >> >> tetaM >> >> >> # Rodando no R: >> >> > tetaM=matrix(0,p,M) >> > strt<-Sys.time() >> > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { >> + y=yM[,k] >> + tetaM[,k]=lm(y~X-1)$coefficients >> + #sgn.logL(teta3,y,X) >> + } >> Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : >> worker initialization failed: 5.207760032192210.72556160440376 >> > print(Sys.time()-strt) >> Time difference of 0.06304097 secs >> > >> > tetaM >> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] >> [1,] 0 0 0 0 0 0 0 0 0 0 >> [2,] 0 0 0 0 0 0 0 0 0 0 >> > tetaM=matrix(0,p,M) >> > strt<-Sys.time() >> > tetaM=foreach (k = 1:M,.combine=cbind) %dopar% { >> + y=yM[,k] >> + tetaM[,k]=lm(y~X-1)$coefficients >> + #sgn.logL(teta3,y,X) >> + } >> > print(Sys.time()-strt) >> Time difference of 0.07505703 secs >> > >> > tetaM >> result.1 result.2 result.3 result.4 result.6 result.7 result.10 >> X1 4.738553 4.584143 4.923599 4.962845 4.737695 5.2330998 4.9280171 >> X2 1.313208 1.855138 1.121618 1.053215 1.571513 0.6168855 0.9040763 >> >> >> Atenciosamente, >> >> Prof. Clécio da Silva Ferreira >> Depto de Estatística - UFJF >> Tel: (32) 2102-3306 >> Página: www.ufjf.br/clecio_ferreira >> >> >> _______________________________________________ >> R-br mailing list >> R-br@listas.c3sl.ufpr.br >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne� >> c�igo m�imo reproduz�el. >> >> >> _______________________________________________ >> R-br mailing list >> R-br@listas.c3sl.ufpr.br >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >> código mínimo reproduzível. >> > >
participantes (2)
-
Clécio da Silva Ferreira
-
Rubem Kaipper Ceratti