Maison > Article > développement back-end > Pourquoi Numpy interfère-t-il avec l'affectation de base multitraitement dans Joblib ?
Lors de la parallélisation de boucles gourmandes en CPU à l'aide de joblib, vous pouvez rencontrer un problème où tous les processus de travail sont affectés à un seul cœur, ce qui entraîne sans gain de performances.
Ce problème provient de l'importation de certains modules Python, tels que Numpy, Scipy, Pandas et Sklearn. Ces modules sont liés aux bibliothèques OpenBLAS multithread, ce qui peut interférer avec l'affinité du cœur.
Pour résoudre ce problème, vous pouvez réinitialiser l'affinité des tâches à l'aide de la commande suivante :
<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>
Cette commande réinitialise l'affinité du processus en cours avec tous les cœurs disponibles. Voici une version mise à jour de votre exemple avec la solution de contournement :
<code class="python">from joblib import Parallel, delayed import numpy as np import os def testfunc(data): # some very boneheaded CPU work for nn in xrange(1000): for ii in data[0, :]: for jj in data[1, :]: ii*jj def run(niter=10): data = (np.random.randn(2, 100) for ii in xrange(niter)) pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch='all') # Reset task affinity os.system("taskset -p 0xff %d" % os.getpid()) results = pool(delayed(testfunc)(dd) for dd in data) if __name__ == '__main__': run()</code>
Après avoir appliqué cette solution de contournement, les processus de travail doivent être attribués à différents cœurs, en utilisant toutes les ressources disponibles pour la parallélisation.
En plus de la solution de contournement, vous pouvez également désactiver le comportement de réinitialisation de l'affinité du processeur d'OpenBLAS en utilisant les méthodes suivantes :
OPENBLAS_MAIN_FREE=1 python myscript.py
NO_AFFINITY=1
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!