with studio nrow loop language how for example r parallel-processing

studio - R: problema con foreach% dopar% en la función llamada por optim



r cran for loop example (3)

Al llamar a una función que incluye la construcción foreach% dopar% de optim se produce un error:

> workers <- startWorkers(6) # 6 cores > > registerDoSMP(workers) > > t0 <- Sys.time() > > optim(w,maxProb2,control=list(fnscale=-1)) > > Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)" > > Sys.time()-t0 > > Time difference of 2.032 secs > > stopWorkers(workers)

La función llamada se ve así:

> maxProb2 <- function(wp) { > > r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],wp,isPrebuilt=TRUE) } > > cat("w=",wp,"max=",sum(r),"/n") > > sum(r) > > }

pf es alguna otra función, x es una tabla estática de elementos precalculados.

También llamar a la función para que se optimice solo una vez provoca el mismo error:

> workers <- startWorkers(6) # 6 cores > > Warning message: > In startWorkers(6) : there is an existing doSMP session using doSMP1 > > registerDoSMP(workers) > > maxProb2(w) > Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)" > > stopWorkers(workers)

Lo que es extraño, el código idéntico funciona bien cuando se lo llama directamente una sola vez (optim funciona la misma función muchas veces):

> workers <- startWorkers(6) # 6 - ilosc rdzeni > > Warning message: > In startWorkers(6) : there is an existing doSMP session using doSMP1 > > registerDoSMP(workers) > > r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],w,isPrebuilt=TRUE) } > > sum(r) > [1] 187.1781 > > stopWorkers(workers)

La función llamada (maxProb2) funciona bien, cuando se usa% do% en lugar de% dopar%.

¿Cómo puedo llamar correctamente a una función que incluya una construcción foreach% dopar%?

ACTUALIZACIÓN 2011-07-17:

He cambiado el nombre de la función pf a probf pero el problema persiste.

Las funciones de probf se definen en el script, no en algún paquete externo.

Dos notas: SO: Windows 7, IDE: Revolution Analytics Enterprise 4.3

> workers <- startWorkers(workerCount = 3) > > registerDoSMP(workers) > > maxProb2(w) > Error in { : task 1 failed - "could not find function "probf""


La solución rápida para el problema con foreach% dopar% es reinstalar estos paquetes:

install.packages("doSNOW") install.packages("doParallel") install.packages("doMPI")

Como se mencionó en varios subprocesos en , estos son responsables del paralelismo en R. Se eliminó el error que existía en las versiones anteriores de estos paquetes. Funcionó en mi caso. Debo mencionar que lo más probable es que ayude, aunque no esté utilizando estos paquetes en su proyecto / paquete.


Me encontré con el mismo problema y el problema es que el entorno no se incluye en los subprocesos. Tu error

Error en {: tarea 1 fallida - "no se pudo encontrar la función" simple_fn ""

Se puede reproducir con este sencillo ejemplo:

simple_fn <- function(x) x+1 test_par <- function(){ library("parallel") no_cores <- detectCores() library("foreach") cl<-makeCluster(no_cores) library("doSNOW") registerDoSNOW(cl) out <- foreach(i=1:10) %dopar% { simple_fn(i) } stopCluster(cl) return(out) } test_par()

Ahora todo lo que necesita es cambiar el foreach(i=1:10) por foreach(i=1:10, .export=c("simple_fn")) . Si desea exportar su entorno global completo, simplemente escriba .export=ls(envir=globalenv()) y lo tendrá para bien o para mal.


[[Editado]]

Su función pf y su "tabla estática" x deben distribuirse a todos los nodos de trabajo. Debe leer la documentación de su biblioteca paralela sobre cómo funciona.

Parece ser que cuando se ejecuta a través de optim, la función pf que encuentra es otra (probablemente stats::pf , que no tiene un argumento isPrebuilt ).

¿Puedes intentar cambiar el nombre de tu función pf (por ejemplo, a mypf )?

mypf <- pf # renaming the function maxProb2 <- function(wp) { r <- foreach (i=s0:s1, .combine=c) %dopar% { mypf(i,x[i,5],wp,isPrebuilt=TRUE) } cat("w=",wp,"max=",sum(r),"/n") sum(r) }

O, si su función pf es parte de un paquete con un espacio de nombres (por ejemplo, mypackage ), puede hacer referencia a esto de la siguiente manera: mypackage::pf

maxProb2 <- function(wp) { r <- foreach (i=s0:s1, .combine=c) %dopar% { mypackage::pf(i,x[i,5],wp,isPrebuilt=TRUE) } cat("w=",wp,"max=",sum(r),"/n") sum(r) }