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.
Lorsque vous utilisez multiprocessing.dummy
, vous utilisez des threads, pas des processus:
multiprocessing.dummy
réplique l'API demultiprocessing
mais n'est rien de plus qu'un wrapper autour du modulethreading
.
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
.