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

Mengapa Numpy Mengganggu Tugasan Teras Berbilang Pemprosesan dalam Joblib?

Susan Sarandon
Susan Sarandonasal
2024-10-30 19:58:30571semak imbas

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>

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.

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
  • Masa kompilasi: Edit Makefile.rule apabila menyusun OpenBLAS dan tambah baris berikut:
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!

Kenyataan:
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