2013-05-01 12 views
11

Eksperymentuję z IPython.parallel i chcę tylko uruchomić kilka poleceń powłoki w różnych silnikach.IPython.parallel nie używając wielordzeniowych?

Mam następujący Notebook:

komórki 0:

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

i uruchomienie polecenia:

komórkowy 1:

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

Telefon komórkowy 2:

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

Celi 3:

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

Co robi to wykorzystuje realizację mincemeat z MapReduce. Kiedy uruchamiam pierwszy !python mincemeat.py 127.0.0.1 używa on w przybliżeniu 100% jednego rdzenia, a kiedy uruchamiam drugi, spada do 50%. Mam 4 rdzenie (+ wirtualne rdzenie) na maszynie i mogę ich używać podczas uruchamiania bezpośrednio z terminalu, ale nie w Notebooku.

Czy jest coś, czego mi brakuje? Chciałbym użyć jednego rdzenia na polecenie !python mincemeat.py 127.0.0.1.

EDIT:
Dla jasności, tutaj jest inna sprawa, że ​​nie używa wielu rdzeni:

komórkowy 1:

%%px --targets 0 --noblock 

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

komórkowy 2:

%%px --targets 0 --noblock 

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

Przypuszczam, że czegoś mi brakuje. Wierzę, że te dwie komórki powinny uruchomić jeden inny rdzeń, jeśli jest dostępny. Jednak wydaje się, że tak nie jest. Znowu użycie procesora pokazuje, że dzielą one ten sam rdzeń i używają go w 50%. Co zrobiłem źle?

+0

Nie jestem pewien, jaki jest sens używania IPython.równolegle tutaj, gdy po prostu uruchamiasz jednoliniowe polecenia powłoki na jednym komputerze na raz, ale jest mało prawdopodobne, że IPython.parallel ma jakąkolwiek zdolność do ingerowania w liczbę rdzeni używanych przez twoje podprocesy. Jak to wygląda, jeśli robisz ten sam przykład bez IPython.parallel (skoro to tylko trzy jednoliniowe wywołania powłoki)? – minrk

+0

Witam @mnirk. Bez Ipython równolegle komórki blokują, to jest o wiele mniej interesujące. Aby to wyjaśnić, nie chcę uruchamiać jednego procesu na różnych rdzeniach, wolałbym, aby każdy proces miał jeden rdzeń. Dlatego przypisuję każde polecenie do innego celu. Wydaje się jednak, że wszystkie silniki (docelowa wartość od 0 do 4) działają na tym samym rdzeniu. – zermelozf

+0

Mam na myśli zrobić to w trzech prostych sesjach terminalowych - to wszystko, co teraz robisz, uruchamiając jedno polecenie powłoki w trzech oddzielnych sesjach. IPython w ogóle nie angażuje się. – minrk

Odpowiedz

15

Podsumowanie czatu dyskusji:

CPU affinity jest mechanizm przypinanie procesu do konkretnego rdzenia procesora, oraz kwestia jest to, że czasami importowania numpy może skończyć przypinanie procesy Pythona do CPU 0, jako wynik połączenia z konkretnymi bibliotekami BLAS. Można odpiąć wszystkich silników uruchamiając tę ​​komórkę:

%%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() 

który wykorzystuje multiprocessing.cpu_count aby uzyskać liczbę procesorów, a następnie kojarzy każdy silnik ze wszystkimi procesorami.

Notebook IPython exploring the issue.

+0

Zobacz także ten raport o błędzie https://github.com/ipython/ipython/issues/840 –

Powiązane problemy