2012-02-09 12 views
12

Deseo ejecutar varias instancias de una simulación en paralelo, pero con cada simulación que tenga su propio conjunto de datos independiente.Uso del multiprocesamiento de Python con diferente semilla aleatoria para cada proceso

Actualmente implemento de la siguiente manera:

P = mp.Pool(ncpus) # Generate pool of workers 
for j in range(nrun): # Generate processes 
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp) 
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp) 
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)   
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process 
P.close() 
P.join() # start processes 

donde sim, adatom1 y lattice objetos son pasados ​​a la función run que inicia la simulación.

Sin embargo, recientemente descubrí que cada lote que ejecuto simultáneamente (es decir, cada ncpus se queda sin el total de nrun de ejecuciones de simulaciones) da exactamente los mismos resultados.

¿Puede alguien aquí aclarar cómo solucionar esto?

+0

¿Cómo se obtiene el resultado? –

+0

¿Esto implica números aleatorios? ¿Cómo estás poniendo las semillas? ¿Por qué deberían ser diferentes? Si ejecuta el mismo proceso dos veces, se supone que debe producir el mismo resultado dos veces. ¿Por qué crees que deberían ser diferentes? –

+0

La función 'ejecutar' inicia la simulación y devuelve los resultados a los que se dirige la función 'Después' para consolidar todos los resultados. Cada simulación tiene condiciones iniciales aleatorias, por lo que espero tener resultados diferentes. No uso una semilla, creo. Utilizo el siguiente código: randshift = np.random.rand (a, b) -0.5 * np.ones ((a, b)) –

Respuesta

15

Acabo de pensar que añadiría una respuesta real para que quede claro para los demás.

Citando la respuesta de Aix in this question:

Lo que ocurre es que en Unix cada proceso de trabajo hereda el mismo estado del generador de números aleatorios del proceso padre. Esto es por qué generan secuencias pseudoaleatorias idénticas.

Utilice el método random.seed() (o el equivalente scipy/numpy) para establecer la semilla correctamente. Vea también this numpy thread.

+1

¿Esto garantiza que cualquier biblioteca que use números aleatorios con cada nuevo proceso se habrá iniciado correctamente con un nuevo número aleatorio? ¿O necesitamos establecer el número aleatorio para cada biblioteca por separado? –

0

Una solución para el problema era utilizar scipy.random.seed() en la función run que asignar una nueva semilla para funciones aleatorias llamados de run.

Un problema similar (a partir del cual obtuve la solución) se pueden encontrar en multiprocessing.Pool seems to work in Windows but not in ubuntu?

+0

¿No hay forma de establecer el número aleatorio para cada proceso que pueda usar números aleatorios? Digamos que uno usa el módulo random, numpy, scipy, tensorflow y quién sabe qué más. ¿Es la única manera de asegurarse de que el proceso tenga una semilla aleatoria diferente para pasar por cada uno de estos y establecer manualmente el estado? –

Cuestiones relacionadas