Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Numpy Mengganggu Tugasan Teras Berbilang Pemprosesan dalam Joblib?

Mengapa Numpy Mengganggu Tugasan Teras Berbilang Pemprosesan dalam Joblib?

Susan Sarandon
Lepaskan: 2024-10-30 19:58:30
asal
639 orang telah melayarinya

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy Interfering with Multiprocessing Core Assignment

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.

Penyelesaian

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Selepas menggunakan penyelesaian ini, proses pekerja harus diberikan kepada teras yang berbeza, menggunakan semua sumber yang tersedia untuk penyelarasan.

Penyelesaian Alternatif

Sebagai tambahan kepada penyelesaian, anda juga boleh melumpuhkan gelagat penetapan semula afiniti CPU OpenBLAS menggunakan kaedah berikut:

  • Masa Jalan: Tetapkan pembolehubah persekitaran OPENBLAS_MAIN_FREE sebelum menjalankan skrip anda:
OPENBLAS_MAIN_FREE=1 python myscript.py
Salin selepas log masuk
  • Masa kompilasi: Edit Makefile.rule apabila menyusun OpenBLAS dan tambah baris berikut:
NO_AFFINITY=1
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan