為什麼 Numpy 會幹擾 Joblib 中的多處理核心分配?

Susan Sarandon
發布: 2024-10-30 19:58:30
原創
579 人瀏覽過

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy 幹擾多處理核心分配

使用joblib 並行化CPU 密集型循環時,可能會遇到所有工作進程都分配給單一核心的問題,從而導致沒有任何性能提升。

此問題源自於某些 Python 模組的導入,例如 Numpy、Scipy、熊貓和 Sklearn。這些模組連結到多執行緒 OpenBLAS 函式庫,這可能會幹擾核心關聯性。

解決方法

要解決此問題,您可以使用以下命令重置任務關聯性:

<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>
登入後複製

此命令重置當前進程與所有可用核心的關聯性。以下是包含解決方法的範例的更新版本:

<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>
登入後複製

應用此解決方法後,工作進程應分配給不同的核心,利用所有可用資源進行並行化。

替代解決方案

除了解決方法之外,您還可以使用以下方法停用OpenBLAS 的CPU 關聯性重置行為方法:

  • 執行時間: 在執行腳本之前設定OPENBLAS_MAIN_FREE 環境變數:
OPENBLAS_MAIN_FREE=1 python myscript.py
登入後複製
  • 編譯時:編譯OpenBLAS編輯Makefile.線:
NO_AFFINITY=1
登入後複製

以上是為什麼 Numpy 會幹擾 Joblib 中的多處理核心分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!