multitraitement.dummy en Python n'utilise pas 100% cpu

Je fais un projet d'apprentissage automatique en Python, donc je dois paralléliser la fonction de prédiction, que j'utilise dans mon programme.

from multiprocessing.dummy import Pool
from multiprocessing import cpu_count


def multi_predict(X, predict, *args, **kwargs):
    pool = Pool(cpu_count())
    results = pool.map(predict, X)
    pool.close()
    pool.join()
    return results

Le problème est que tous mes processeurs ne sont chargés que sur 20-40% (en somme c'est 100%). J'utilise le multitraitement.dummy parce que j'ai quelques problèmes avec le module multiprocessing dans la fonction de décapage.

26
demandé sur maxymoo 2014-10-17 23:46:30

1 réponses

Lorsque vous utilisez multiprocessing.dummy, vous êtes à l'aide de fils, pas de processus:

multiprocessing.dummy réplique L'API de multiprocessing mais n'est pas plus qu'un wrapper autour du module threading.

Cela signifie que vous êtes limité par leGlobal Interpreter Lock (Gil) , et un seul thread peut réellement exécuter des opérations liées au processeur à la fois. Cela va vous empêcher d'utiliser pleinement vos processeurs. Si vous voulez obtenir un parallélisme complet sur tous les cœurs disponibles, vous devrez adressez-vous au problème de décapage que vous rencontrez avec multiprocessing.Pool.

Notez que multiprocessing.dummy peut toujours être utile si le travail que vous devez paralléliser est lié à IO, ou utilise une extension C qui libère le GIL. Pour le code Python pur, cependant, vous aurez besoin de multiprocessing.

51
répondu dano 2016-04-19 18:01:57