Joblib Parallèle de plusieurs cpu est plus lent que seul

J'ai juste commencé à l'aide de la Joblib module et j'essaie de comprendre comment la fonction Parallèle des œuvres. Ci-dessous est un exemple de cas où la parallélisation conduit à des durées de fonctionnement plus longues, mais je ne comprends pas pourquoi. Mon moteur d'exécution sur 1 processeur était de 51 s vs 217 secondes sur 2 cpu.

Mon hypothèse était que l'exécution de la boucle en parallèle copie des listes a et b de chaque processeur. Puis l'expédition item_n à un seul processeur et item_n+1 pour les autres cpu, exécuter la fonction, puis d'écrire les résultats dans une liste (dans l'ordre). Puis, prenez les 2 éléments et ainsi de suite. Je suis évidemment manque quelque chose.

Est-ce un exemple de mauvais ou de l'utilisation de joblib? Je n'ai tout simplement la structure du code de mal?

Voici l'exemple:

import numpy as np
from matplotlib.path import Path
from joblib import Parallel, delayed

## Create pairs of points for line segments
a = zip(np.random.rand(5000,2),np.random.rand(5000,2))

b = zip(np.random.rand(300,2),np.random.rand(300,2))

## Check if one line segment contains another. 
def check_paths(path, paths):
    for other_path in paths:
        res='no cross'
        chck = Path(other_path)
        if chck.contains_path(path)==1:
            res= 'cross'
            break
    return res

res = Parallel(n_jobs=2) (delayed(check_paths) (Path(points), a) for points in b)
  • Avez-vous votre 1 processus de test avec le même code (seulement n_jobs=1) ou avez-vous utilisé une simple boucle for?
  • Il y a aussi un gros avertissement sur la joblib site, afin de protéger le code principal avec if __name__ == '__main__':.
  • Juste essayer avec le fil back-end...
  • J'ai exactement le même problème. Je suis en cours d'exécution tout de l'intérieur 'si nom == 'principal':', et en fait je suis juste en utilisant l'exemple de leur problème de sortie: = Parallele(n_jobs=2)(en retard(sqrt)(i**2) for i in range(int(1e5))) . Si je le lance avec n_jobs=1, il faut 5 secondes. Si n_jobs=2 à n_jobs=4 (c'est un 4-core de la machine), il faut de 42 secondes!?
  • de nombreux calculs ne peuvent bénéficier de calcul parallèle en raison du temps qu'il faut pour carte le calcul pour les autres processeurs, puis retourner les résultats. Je reçois à peu près les mêmes résultats que vous faites avec les joblib exemple. J'ai trouvé les gains les plus importants lorsque l'on compare les éléments d'une liste à une liste d'éléments et d'avoir besoin de retourner la correspondance la plus proche (par exemple, le géocodage ou floue adresse de correspondance).
  • Mon parallèle semble être en cours d'exécution plus lent qu'un seul processeur jusqu'à ce que j'ai découvert c'était mon code Timer. Pour voir la fonction en cours d'exécution, ajouter dans la verbose=50 argument; ceci affichera le temps écoulé et les détails de la tâche. E. g. Parallèle(n_jobs=4, verbose=50)

InformationsquelleAutor mhabiger | 2014-01-09