web-dev-qa-db-fra.com

multiprocessing.dummy dans Python n'utilise pas 100% cpu

Je fais un projet d'apprentissage automatique en Python, donc je dois faire une fonction de prédiction parallèle, 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 qu'à 20-40% (en somme, c'est 100%). J'utilise multiprocessing.dummy parce que j'ai des problèmes avec le module de multiprocessing dans la fonction de décapage.

34
Demyanov

Lorsque vous utilisez multiprocessing.dummy , vous utilisez des threads, pas des processus:

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

Cela signifie que vous êtes limité par le Global Interpreter Lock (GIL) , et qu'un seul thread peut réellement exécuter des opérations liées au CPU à la fois. Cela vous empêchera d'utiliser pleinement vos processeurs. Si vous souhaitez obtenir un parallélisme complet sur tous les cœurs disponibles, vous devrez résoudre le problème de décapage que vous rencontrez avec multiprocessing.Pool.

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

64
dano