2013-05-01 2 views
11

J'expérimente avec IPython.parallel et je veux juste lancer plusieurs commandes shell sur différents moteurs.IPython.parallel n'utilise pas le multicœur?

Je le portable suivant:

cellulaire 0:

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

et de lancer les commandes:

Cellule 1:

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

Cell 2:

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

Cellule 3:

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

Ce qu'il fait est qu'il utilise la mincemeat mise en œuvre de MapReduce. Quand je lance le premier !python mincemeat.py 127.0.0.1 il utilise à peu près 100% d'un noyau, puis quand je lance le second, il tombe à 50% chacun. J'ai 4 cœurs (+ coeurs virtuels) sur la machine et je peux les utiliser lors du lancement directement depuis le terminal mais pas dans le portable.

Y a-t-il quelque chose qui me manque? Je voudrais utiliser un noyau par commande !python mincemeat.py 127.0.0.1.

EDIT:
Pour plus de clarté, voici une autre chose qui est de ne pas utiliser plusieurs cœurs:

Mobitel 1:

%%px --targets 0 --noblock 

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

Cell 2:

%%px --targets 0 --noblock 

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

Je suppose qu'il me manque quelque chose. Je crois que ces deux cellules devraient fonctionner un noyau différent si disponible. Cependant, cela ne semble pas être le cas. Encore une fois, l'utilisation du processeur montre qu'ils partagent le même noyau et utilisent 50% de celui-ci. Qu'ai-je fait de mal?

+0

Je ne suis pas sûr de l'utilité d'utiliser IPython.parallèle ici, lorsque vous exécutez simplement des commandes de shell sur une seule machine à la fois, mais il est peu probable qu'IPython.parallel puisse interférer avec le nombre de cœurs utilisés par vos sous-processus. A quoi cela ressemble-t-il si vous faites ce même exemple sans IPython.parallel (puisqu'il ne s'agit que de trois appels de shell d'une ligne)? – minrk

+0

Bonjour @mnirk. Sans Ipython.parallel les cellules bloquent, c'est beaucoup moins intéressant. Pour clarifier les choses, je ne veux pas exécuter un processus sur des noyaux différents, je préférerais que chaque processus ait un noyau. C'est pourquoi j'assigne chaque commande à une cible différente. Cependant, il semble que tous les moteurs (cibles 0 à 4) tournent sur le même noyau. – zermelozf

+0

Je veux dire le faire en trois sessions terminales simples - c'est tout ce que vous faites en ce moment, en exécutant une seule commande shell en trois sessions distinctes. IPython n'est pas vraiment impliqué du tout. – minrk

Répondre

15

Résumé de la discussion de chat:

CPU affinity est un mécanisme pour épingler un processus à un noyau CPU particulier, et la question est que numpy parfois l'importation peut finir par épingler les processus Python à la CPU 0, comme un résultat de la liaison avec des bibliothèques BLAS particulières. Vous pouvez dégoupiller tous vos moteurs en exécutant cette cellule:

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

qui utilise multiprocessing.cpu_count pour obtenir le nombre de processeurs, et associe ensuite tous les moteurs avec tous les processeurs.

Un carnet IPython exploring the issue.

+0

Voir aussi ce rapport de bug https://github.com/ipython/ipython/issues/840 –

Questions connexes