Warum multiprocessing verwenden Sie nur einen single-core-nachdem ich den import numpy?
Ich bin mir nicht sicher, ob das zählt mehr als ein OS-Problem, aber ich dachte, ich würde bitten, hier in den Fall, jemand hat einen kleinen Einblick von der Python-Seite der Dinge.
Ich habe versucht, parallelise ein CPU-heavy for
Schleife mit joblib
, aber ich finde, dass nicht jeder worker-Prozess zugewiesen wird, um einen anderen Kern, ich am Ende mit allen von Ihnen zugewiesen wird, die gleichen Kern-und kein performance-Gewinn.
Hier ein sehr triviales Beispiel...
from joblib import Parallel,delayed
import numpy as np
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')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
...und hier ist, was ich sehe in htop
während das Skript ausgeführt wird:
Ich bin mit Ubuntu 12.10 (3.5.0-26) auf einem laptop mit 4 Kernen. Klar joblib.Parallel
ist Laich-separate Prozesse für die verschiedenen Arbeiter, aber gibt es irgendeine Möglichkeit, dass ich diese Prozesse werden auf verschiedenen Kernen?
Auch stackoverflow.com/questions/6905264/...
Und stackoverflow.com/questions/12592018/...
InformationsquelleAutor ali_m | 2013-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach etwas mehr googlen fand ich die Antwort hier.
Es stellt sich heraus, dass bestimmte Python-Module (
numpy
,scipy
,tables
,pandas
,skimage
...) Chaos mit core affinity auf "importieren". Soweit ich das beurteilen kann, scheint dieses problem speziell von Ihnen verursachten Verlinkung gegen Multithread-OpenBLAS Bibliotheken.Ist ein workaround zum zurücksetzen der task-Affinität mit
Mit dieser Zeile eingefügt, nachdem das Modul importiert, mein Beispiel läuft jetzt auf allen Kernen:
Meine Erfahrung war bisher, dass dies nicht scheinen, um eine negative Wirkung auf
numpy
's Leistung, aber das ist wohl Rechner - und Aufgaben-spezifisch .Update:
Gibt es auch zwei Möglichkeiten, deaktivieren Sie die CPU-Affinität rückstellend Verhalten OpenBLAS selbst. Zur Laufzeit können Sie die Umgebungsvariable
OPENBLAS_MAIN_FREE
(oderGOTOBLAS_MAIN_FREE
), zum BeispielOder alternativ, wenn Sie kompilieren OpenBLAS von der Quelle können Sie dauerhaft deaktivieren, es zu bauen-Zeit durch Bearbeiten der
Makefile.rule
enthalten die ZeileBeide Maschinen haben OpenBLAS (bauen mit OpenMPI).
Alter thread, aber falls sich jemand anderes findet, dieses Problem hatte ich genau das problem und es war in der Tat im Zusammenhang mit der OpenBLAS Bibliotheken. Siehe here für zwei mögliche Abhilfen sowie einige zugehörige Diskussion.
Ein weiterer Weg, um die cpu-Affinität wird zu
psutil
.Es ist ein Problem mit OpenBLAS eher als Python, daher kann ich keinen Grund sehen, warum die Python-version würde einen Unterschied machen
InformationsquelleAutor ali_m
Python 3 stellt nun die Methoden, direkt auf die Affinität
Aus der verlinkten Doku: Sie sind nur auf einigen Unix-Plattformen.
Ich habe das gleiche problem, aber ich habe die Integration dieser gleichen Linie an der Oberseite os.system("taskset -p 0xff %d" % os.getpid ()), aber seine nicht nutzt alle cpu
InformationsquelleAutor WoJ
Dies scheint ein häufiges problem zu sein mit Python auf Ubuntu und ist nicht spezifisch für
joblib
:Ich würde vorschlagen, das Experimentieren mit der CPU-Affinität (
taskset
).Python on Ubuntu
Dies bedeutet, es funktioniert ohne Probleme auf Windows-und andere Betriebssystem. Ist es?InformationsquelleAutor NPE