ホームページ >バックエンド開発 >Python チュートリアル >Numpy が Joblib でのマルチプロセッシング コアの割り当てを妨げるのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 19:58:30647ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。