Maison >développement back-end >Tutoriel Python >Pourquoi mes travailleurs Joblib sont-ils bloqués sur un seul noyau après l'importation de NumPy ?
Problème d'affinité de base du multitraitement
Dans certains scénarios, lors de l'importation de la bibliothèque NumPy et de la tentative de parallélisation d'une boucle gourmande en CPU à l'aide du module joblib , on peut observer que les processus de travail affectés à la boucle sont tous confinés à un seul cœur, ce qui entrave les gains de performances.
Ce problème survient en raison de l'interaction entre NumPy et les bibliothèques OpenBLAS sous-jacentes, qui sont souvent utilisées pour les opérations multithread. Par défaut, ces bibliothèques peuvent interférer avec les paramètres d'affinité du noyau, ce qui entraîne l'attribution de tous les processus de travail au même noyau.
Solution : réinitialiser l'affinité des tâches
Une méthode simple La solution consiste à réinitialiser l'affinité des tâches à l'aide de la fonction os.system() après avoir importé les modules concernés. En exécutant la commande os.system("taskset -p 0xff %d" % os.getpid()), l'affinité du cœur est réinitialisée, permettant aux processus de travail de se propager sur tous les cœurs disponibles.
Désactiver la réinitialisation de l'affinité du processeur OpenBLAS
Alternativement, le comportement de réinitialisation de l'affinité du processeur d'OpenBLAS peut être désactivé soit au moment de l'exécution, soit au moment de la construction. Au moment de l'exécution, définir la variable d'environnement OPENBLAS_MAIN_FREE sur 1 empêche la bibliothèque d'ajuster l'affinité du noyau. Alternativement, pendant le processus de compilation OpenBLAS, l'ajout de NO_AFFINITY=1 au Makefile.rule désactive définitivement ce comportement.
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!