2013-05-01 12 views
11

Sto sperimentando con IPython.parallel e voglio solo lanciare diversi comandi di shell su motori diversi.IPython.parallel non usa il multicore?

Ho il seguente Notebook:

cellulare 0:

from IPython.parallel import Client 
client = Client() 
print len(client) 
5 

e lanciare i comandi:

cellulare 1:

%%px --targets 0 --noblock 
!python server.py 

Cellulare 2:

%%px --targets 1 --noblock 
!python mincemeat.py 127.0.0.1 

cellulare 3:

%%px --targets 2 --noblock 
!python mincemeat.py 127.0.0.1 

Ciò che non è utilizza la mincemeat attuazione di MapReduce. Quando lancio il primo !python mincemeat.py 127.0.0.1 utilizza circa il 100% di un core, quindi quando lancio il secondo scende al 50% ciascuno. Ho 4 core (+ core virtuali) sulla macchina e posso usarli quando si lancia direttamente dal terminale ma non nel Notebook.

C'è qualcosa che mi manca? Vorrei utilizzare un core per il comando !python mincemeat.py 127.0.0.1.

EDIT:
Per chiarezza, ecco un'altra cosa che non utilizza più core:

cellulare 1:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 

cellulare 2:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 

Suppongo che mi manchi qualcosa. Credo che quelle due celle dovrebbero eseguire un core diverso se disponibile. Tuttavia, non sembra essere il caso. Ancora una volta l'utilizzo della CPU mostra che condividono lo stesso core e ne usano il 50%. Che cosa ho fatto di sbagliato?

+0

Non sono sicuro di quale sia il significato dell'utilizzo di IPython.Parallelamente, quando si eseguono solo comandi di shell a linea singola su una macchina alla volta, ma è improbabile che IPython.parallel abbia la capacità di interferire con il numero di core utilizzati dai processi secondari. Che aspetto ha se si esegue lo stesso esempio senza IPython.parallel (poiché sono solo tre chiamate di shell su una riga)? – minrk

+0

Ciao @mnirk. Senza Ipython.parallel le celle si bloccano, è molto meno interessante. Per chiarire le cose, non voglio eseguire un processo su diversi core, preferirei che ogni processo avesse un nucleo. Ecco perché assegno ciascun comando a un obiettivo diverso. Tuttavia, sembra che tutti i motori (target 0 a 4) siano in esecuzione sullo stesso core. – zermelozf

+0

Voglio dire farlo in tre sessioni di terminale: è tutto ciò che state facendo in questo momento, eseguendo un singolo comando di shell in tre sessioni separate. IPython non è affatto coinvolto. – minrk

risposta

15

Sintesi della discussione di chat:

CPU affinity è un meccanismo di spinatura un processo per un particolare nucleo CPU, e il problema è che a volte importazione NumPy può finire appunta processi Python alla CPU 0, come un risultato del collegamento a particolari librerie BLAS. È possibile sbloccare tutti i motori eseguendo questa cella:

%%px 
import os 
import psutil 
from multiprocessing import cpu_count 

p = psutil.Process(os.getpid()) 
p.set_cpu_affinity(range(cpu_count())) 
print p.get_cpu_affinity() 

che utilizza multiprocessing.cpu_count per ottenere il numero di CPU, e quindi associa ogni motore con tutte le CPU.

Un notebook IPython exploring the issue.

+0

Vedi anche questa segnalazione di bug https://github.com/ipython/ipython/temi/840 –