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.
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.
Zusätzlich zur Problemumgehung können Sie das Verhalten beim Zurücksetzen der CPU-Affinität von OpenBLAS auch mit den folgenden Methoden deaktivieren:
OPENBLAS_MAIN_FREE=1 python myscript.py
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!