Saya tidak yakin apakah ini dianggap lebih sebagai masalah OS, tapi saya pikir saya akan bertanya di sini kalau-kalau ada yang memiliki wawasan dari akhir Python.
Saya telah mencoba untuk memparalelkan penggunaan CPU-heavy for
loop joblib
, tetapi saya menemukan bahwa alih-alih setiap proses pekerja ditugaskan ke inti yang berbeda, saya berakhir dengan semuanya ditugaskan ke inti yang sama dan tidak ada peningkatan kinerja.
Inilah contoh yang sangat sepele ...
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()
... dan inilah yang saya lihat htop
saat skrip ini berjalan:
Saya menjalankan Ubuntu 12.10 (3.5.0-26) pada laptop dengan 4 core. Jelas joblib.Parallel
sedang memunculkan proses terpisah untuk pekerja yang berbeda, tetapi apakah ada cara saya bisa membuat proses ini dijalankan pada core yang berbeda?
Jawaban:
Setelah googling lagi saya menemukan jawabannya di sini .
Ternyata modul Python tertentu (
numpy
,scipy
,tables
,pandas
,skimage
...) berantakan dengan afinitas inti pada impor. Sejauh yang saya tahu, masalah ini tampaknya secara khusus disebabkan oleh mereka yang terhubung dengan pustaka OpenBLAS multithreaded.Solusinya adalah mereset afinitas tugas menggunakan
Dengan baris ini disisipkan setelah impor modul, contoh saya sekarang berjalan pada semua core:
Pengalaman saya sejauh ini adalah bahwa ini tampaknya tidak memiliki efek negatif pada
numpy
kinerja, meskipun ini mungkin khusus untuk mesin dan tugas.Memperbarui:
Ada juga dua cara untuk menonaktifkan perilaku reset-afinitas CPU dari OpenBLAS itu sendiri. Saat run-time Anda dapat menggunakan variabel lingkungan
OPENBLAS_MAIN_FREE
(atauGOTOBLAS_MAIN_FREE
), misalnyaAtau sebagai alternatif, jika Anda mengkompilasi OpenBLAS dari sumber, Anda dapat menonaktifkannya secara permanen saat membangun dengan mengedit
Makefile.rule
agar mengandung barissumber
psutil
.Python 3 sekarang memaparkan metode untuk secara langsung mengatur afinitas
sumber
Ini tampaknya menjadi masalah umum dengan Python di Ubuntu, dan tidak spesifik untuk
joblib
:Saya akan menyarankan bereksperimen dengan afinitas CPU (
taskset
).sumber
Python on Ubuntu
Ini berarti itu berfungsi tanpa masalah pada Windows dan OS lainnya. Apakah itu?