Maison  >  Article  >  développement back-end  >  Pourquoi Numpy interfère-t-il avec l'affectation de base multitraitement dans Joblib ?

Pourquoi Numpy interfère-t-il avec l'affectation de base multitraitement dans Joblib ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 19:58:30559parcourir

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy interférant avec l'attribution de cœurs multitraitements

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.

Solution de contournement

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.

Solutions alternatives

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 :

  • Exécution : Définissez la variable d'environnement OPENBLAS_MAIN_FREE avant exécutez votre script :
OPENBLAS_MAIN_FREE=1 python myscript.py
  • Au moment de la compilation : Modifiez le Makefile.rule lors de la compilation d'OpenBLAS et ajoutez la ligne suivante :
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn