2017-02-12 7 views
1

Im essayant de comprendre comment faire le traitement distribué avec ipyparallel et cahier de jupyter, ainsi j'ai fait un certain essai et ai obtenu des résultats impairs.ipyparallel comportement aérien étrange

from ipyparallel import Client 
%px import numpy as np 

rc = Client() 
dview = rc[:] 
bview = rc.load_balanced_view() 

print(len(dview)) 
print(len(bview)) 

data = [np.random.rand(10000)] * 4 

%time np.sin(data) 

%%time #45.7ms 
results = dview.map(np.sin, data) 
results.get() 

%%time #110ms 
dview.push({'data': data}) 
%px results = np.sin(data) 
results 

%%time #4.9ms 
results = np.sin(data) 
results 

%%time #93ms 
results = bview.map(np.sin, data) 
results.get() 

Quel est le problème avec le surdébit? Est-ce que la tâche est liée dans ce cas et qu'un seul noyau peut le faire mieux? J'ai essayé des tableaux plus grands et j'ai quand même obtenu de meilleurs temps sans traitement parallèle.

Merci pour le conseil!

Répondre

1

Le problème semble être le io. Push pousse l'ensemble des données à chaque nœud. Je ne suis pas sûr de la fonction de la carte, mais il est probable qu'elle scinde les données en morceaux qui sont envoyés aux nœuds. Des morceaux plus petits - un traitement plus rapide. L'équilibreur de charge envoie très probablement les données et la tâche deux fois vers le même nœud, ce qui affecte considérablement les performances.

Et comment avez-vous réussi à envoyer les données en 40 ms? Je suis habitué au protocole http où seul le handshake prend environ une seconde. Pour moi 40 ms dans le réseau est rapide comme l'éclair.

EDIT A propos de longues périodes (40ms):

Dans les réseaux locaux le temps de ping de 1-10ms est considéré comme une situation normale. En tenant compte du fait que vous devez d'abord faire une poignée de main (minimum 2 signaux) et seulement ensuite envoyer les données (signal minimum 1) et attendre la réponse (un autre signal) vous parlez déjà de 20 ms juste pour connecter deux ordinateurs. Bien sûr, vous pouvez essayer de réduire le temps de ping à 1ms puis utiliser un protocole MPI plus rapide. Mais si je comprends bien, cela n'améliore pas la situation de manière significative. Un seul ordre de grandeur plus rapide.

Par conséquent, les recommandations générales sont d'utiliser des travaux plus importants. Par exemple, un framework distribué assez rapide (plus rapide que le céleri basé sur des benchmarks) recommande des durées de tâches supérieures à 100 ms. Dans le cas contraire, le surcoût du cadre commence à surpondérer le temps de l'exécution et les avantages de la parallélisation disparaissent. Efficiency on Dask Distributed

+0

Il fonctionne sur la machine locale. les nœuds ne sont que des moteurs fonctionnant sur la même machine. –

+0

Mais Ipyparallel utilise toujours le protocole ZeroMQ. Théoriquement, vous devriez être capable de l'accélérer en utilisant MPI. –