Numpy が Joblib でのマルチプロセッシング コアの割り当てを妨げるのはなぜですか?

Susan Sarandon
リリース: 2024-10-30 19:58:30
オリジナル
579 人が閲覧しました

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy によるマルチプロセッシング コア割り当ての干渉

joblib を使用して CPU 集中型のループを並列化すると、すべてのワーカー プロセスが 1 つのコアに割り当てられるという問題が発生する場合があります。

この問題は、Numpy、Scipy、Pandas、Sklearn などの特定の Python モジュールのインポートに起因します。これらのモジュールはマルチスレッド 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.rule を編集し、次の行を追加します:
NO_AFFINITY=1
ログイン後にコピー

以上がNumpy が Joblib でのマルチプロセッシング コアの割り当てを妨げるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!