Heim  >  Artikel  >  Backend-Entwicklung  >  Warum stört Numpy die Multiprocessing-Kernzuweisung in Joblib?

Warum stört Numpy die Multiprocessing-Kernzuweisung in Joblib?

Susan Sarandon
Susan SarandonOriginal
2024-10-30 19:58:30559Durchsuche

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy stört die Multiprocessing-Kernzuweisung

Beim Parallelisieren CPU-intensiver Schleifen mithilfe von joblib kann es zu einem Problem kommen, bei dem alle Arbeitsprozesse einem einzelnen Kern zugewiesen werden Dies führt zu keinem Leistungsgewinn.

Dieses Problem ist auf den Import bestimmter Python-Module wie Numpy, Scipy, Pandas und Sklearn zurückzuführen. Diese Module sind mit Multithread-OpenBLAS-Bibliotheken verknüpft, die die Kernaffinität beeinträchtigen können.

Problemumgehung

Um dieses Problem zu beheben, können Sie die Aufgabenaffinität mit dem folgenden Befehl zurücksetzen:

<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>

Dieser Befehl setzt die Affinität des aktuellen Prozesses auf alle verfügbaren Kerne zurück. Hier ist eine aktualisierte Version Ihres Beispiels mit der Problemumgehung:

<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>

Nach der Anwendung dieser Problemumgehung sollten die Arbeitsprozesse verschiedenen Kernen zugewiesen werden, wobei alle verfügbaren Ressourcen für die Parallelisierung genutzt werden.

Alternative Lösungen

Zusätzlich zur Problemumgehung können Sie das Verhalten beim Zurücksetzen der CPU-Affinität von OpenBLAS auch mit den folgenden Methoden deaktivieren:

  • Laufzeit: Legen Sie vorher die Umgebungsvariable OPENBLAS_MAIN_FREE fest Ausführen Ihres Skripts:
OPENBLAS_MAIN_FREE=1 python myscript.py
  • Kompilierungszeit: Bearbeiten Sie die Makefile.rule beim Kompilieren von OpenBLAS und fügen Sie die folgende Zeile hinzu:
NO_AFFINITY=1

Das obige ist der detaillierte Inhalt vonWarum stört Numpy die Multiprocessing-Kernzuweisung in Joblib?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn