Apabila menyelaraskan gelung intensif CPU menggunakan joblib, anda mungkin menghadapi isu di mana semua proses pekerja ditetapkan kepada satu teras, mengakibatkan tanpa keuntungan prestasi.
Isu ini berpunca daripada import modul Python tertentu, seperti Numpy, Scipy, Pandas dan Sklearn. Modul ini dipautkan dengan perpustakaan OpenBLAS berbilang benang, yang boleh mengganggu perkaitan teras.
Untuk menyelesaikan isu ini, anda boleh menetapkan semula perkaitan tugas menggunakan arahan berikut:
<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>
Arahan ini menetapkan semula perkaitan proses semasa kepada semua teras yang tersedia. Berikut ialah versi terkini contoh anda dengan penyelesaiannya:
<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>
Selepas menggunakan penyelesaian ini, proses pekerja harus diberikan kepada teras yang berbeza, menggunakan semua sumber yang tersedia untuk penyelarasan.
Sebagai tambahan kepada penyelesaian, anda juga boleh melumpuhkan gelagat penetapan semula afiniti CPU OpenBLAS menggunakan kaedah berikut:
OPENBLAS_MAIN_FREE=1 python myscript.py
NO_AFFINITY=1
Atas ialah kandungan terperinci Mengapa Numpy Mengganggu Tugasan Teras Berbilang Pemprosesan dalam Joblib?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!