programacion paralelismo paralela lenguajes introduccion hilos ejemplos con aplicada for-loop parallel-processing julia

for loop - paralelismo - Programación paralela Julia-Poniendo la función existente a disposición de todos los trabajadores.



programacion paralela en c (2)

El enfoque para devolver la función parece elegante, pero desafortunadamente, a diferencia de JavaScript, Julia no resuelve todas las variables al crear las funciones. Técnicamente, su función de entrenamiento podría producir el código fuente de la función con valores literales para todos los parámetros entrenados. Luego páselo a cada uno de los procesos de trabajo, que pueden analizarlo en su entorno a una función que se pueda llamar.

Sugiero devolver una estructura de datos que contenga toda la información para producir la función entrenada: pesos de una ANN, vectores de apoyo, reglas de decisión ... Definir una función "entrenada" en los procesos de trabajo, de manera que se utilice el capacitado parámetros Es posible que desee tener la capacidad de guardar los resultados de la capacitación en el disco de todos modos, de modo que pueda volver a producir fácilmente sus cálculos.

Me enfrento con el siguiente problema:

Tengo una función llamada TrainModel que se ejecuta durante mucho tiempo en un solo hilo. Cuando termina de computar, devuelve una función como un argumento de salida, llamémosla f . Cuando pregunto el tipo de esta f , Julia vuelve:

(función genérica con 1 método)

(No estoy seguro de que esta última información sea útil para cualquiera que lea esto)

Ahora, en un segundo paso, necesito aplicar la función f en una gran variedad de valores. Este es un paso que me gustaría paralelizar. Habiendo comenzado a Julia con múltiples procesos, por ej.

julia -p 4

Idealmente, yo usaría:

pmap(f, my_values)

o quizás:

aux = @parallel (hcat) for ii=1:100000000 f(my_values[ii]) end

Desafortunadamente, esto no funciona. Julia se queja de que los trabajadores no están conscientes de la función f , es decir, recibo un mensaje:

ERROR: función f no definida en el proceso 2

¿Cómo puedo hacer que la función f esté disponible para todos los trabajadores? Obviamente, una solución "sucia" sería ejecutar la función TrainModel, que consume mucho tiempo, en todos los trabajadores, de esta forma quizás:

@everywhere f = TrainModel( ... )

pero esto sería un desperdicio de CPU cuando lo único que quiero es que el resultado f esté disponible para todos los trabajadores.

Aunque busqué publicaciones con problemas similares, hasta ahora no he podido encontrar una respuesta ...

¡Gracias por adelantado! mejor,

NORTE.


Hay una solución solo para Unix basada en el paquete PTools.jl ( https://github.com/amitmurthy/PTools.jl ).

Se basa en el paralelismo a través de forking en lugar del mecanismo incorporado de Julia. Los procesos bifurcados se generan con el mismo espacio de trabajo que el proceso principal, por lo que todas las funciones y variables están directamente disponibles para los trabajadores.

Esto es similar a los grupos de bifurcaciones en el paquete paralelo R, por lo que se puede utilizar como la función mclapply.

La función de interés es pfork (n :: Integer, f :: Function, args ...) y una diferencia notable con mclapply en R es que la función f debe tomar como primer argumento el índice del trabajador.

Un ejemplo:

Pkg.add("PTools") Pkg.checkout("PTools") #to get the last version, else the package does not build at the time of writing using PTools f(workid,x) = x[workid] + 1 pfork(3, f, [1,2,3,4,5]) #Only the three first elements of the array will be computed 3-element Array{Any,1}: 2 3 4

Espero que se construya una interfaz con pfork para que el primer argumento de la función no sea el índice del trabajador, pero por el momento se puede usar para resolver el problema.