Maison > développement back-end > Tutoriel Python > 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
Libérer: 2024-10-30 19:58:30
original
696 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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
Copier après la connexion
  • Au moment de la compilation : Modifiez le Makefile.rule lors de la compilation d'OpenBLAS et ajoutez la ligne suivante :
NO_AFFINITY=1
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal