マルチプロセッシングを使用したNumpy行列の乗算は、次元が増加するにつれて突然遅くなります。

スンヒョンユ

を使用して大きな行列の乗算を実行したいと思いますmultiprocessing.Pool

突然、次元が50を超えると、計算時間が非常に長くなります。

より速くする簡単な方法はありますか?

ここでは、のような共有メモリを使用したくありません。RawArray元のコードが毎回ランダムにマトリックスを生成するためです。

サンプルコードは以下のとおりです。

import numpy as np
from time import time
from multiprocessing import Pool
from functools import partial

def f(d):
    a = int(10*d)
    N = int(10000/d)
    for _ in range(N):
        X = np.random.randn(a,10) @ np.random.randn(10,10)
    return X

# Dimensions
ds = [1,2,3,4,5,6,8,10,20,35,40,45,50,60,62,64,66,68,70,80,90,100]

# Serial processing
serial = []
for d in ds:
    t1 = time()
    for i in range(20):
        f(d)
    serial.append(time()-t1)

# Parallel processing
parallel = []
for d in ds:
    t1 = time()
    pool = Pool()
    for i in range(20):
        pool.apply_async(partial(f,d), args=())
    pool.close()
    pool.join()
    parallel.append(time()-t1)

# Plot
import matplotlib.pyplot as plt
plt.title('Matrix multiplication time with 10000/d repetitions')
plt.plot(ds,serial,label='serial')
plt.plot(ds,parallel,label='parallel')
plt.xlabel('d (dimension)') 
plt.ylabel('Total time (sec)')
plt.legend()
plt.show()

の合計計算コストはf(d)すべて同じであるためd、並列処理時間は等しくなければなりません。

しかし、実際の出力はそうではありません。

ここに画像の説明を入力してください

システム情報:

Linux-4.15.0-47-generic-x86_64-with-debian-stretch-sid
3.6.8 |Anaconda custom (64-bit)| (default, Dec 30 2018, 01:22:34) 
[GCC 7.3.0]
Intel(R) Core(TM) i9-7940X CPU @ 3.10GHz

注子@プロセスにデータを送信するのではなく、(のような複雑な内部シミュレーションとして並列計算を使用したいと思います。

スンヒョンユ

これは自己参照用です。

ここで、私は解決策を見つけました。

numpyはバックエンドとしてMKLを使用していますが、MKLマルチスレッドが衝突することが問題である可能性がありますmultiprocessing

コードを実行した場合:

import os
os.environ['MKL_NUM_THREADS'] = '1'

インポートする前にnumpy、それは解決しました。

ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

TypeError:__ init __()は1つの位置引数を取りますが、2つが与えられました(Pytesseractを使用したPythonマルチプロセッシング)

分類Dev

マルチプロセッシングは、プロセスが多いほど遅くなります

分類Dev

マルチプロセッシングのメモリ使用量は着実に増加しています。Pool.imap_unordered

分類Dev

他のコードがコメントアウトされていない場合、マルチプロセッシングが遅くなります

分類Dev

マルチプロセッシングモジュールによって生成された多くのプロセスを持つことはどれくらいの費用がかかりますか?

分類Dev

np.array == numの比較は非常に遅いですか?マルチプロセッシングを使用してそれを加速できますか?

分類Dev

numpyをインポートした後、マルチプロセッシングが単一コアのみを使用するのはなぜですか?

分類Dev

NumPyで行列ベクトルを乗算すると、1次元ベクトルではなく2次元配列が生成されるのはなぜですか?

分類Dev

Pythonマルチプロセッシング-実行時間が増加しました、何が間違っていますか?

分類Dev

この小さなスニペットが、maxtasksperchild、numpy.random.randint、およびnumpy.random.seedを使用したマルチプロセッシングを使用してハングするのはなぜですか?

分類Dev

Rで次元が異なる2つの行列を乗算します

分類Dev

マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

分類Dev

Python:4つのコアに分割された同じワークロードはマルチプロセッシングライブラリで機能しますが、mpi4pyを使用するとハングします

分類Dev

マルチプロセッシングを使用して、forループで、引数が異なる同じ関数への2つの呼び出しを並列化するにはどうすればよいですか?

分類Dev

マルチプロセッシングキュー-メモリ消費が増加するのはなぜですか?

分類Dev

Pythonは、プールを閉じたりmap()を使用したりせずに、マルチプロセッシングプール内のプロセスが完了するのを待ちます

分類Dev

ターミナルまたはマルチプロセッシングライブラリなしでPythonスクリプトによって使用されるCPUの数を制限するにはどうすればよいですか?

分類Dev

numpy行列代数またはpythonfor-loop / list-comprehensionは自動的にマルチプロセッシングを利用しますか?

分類Dev

Numba、ベクトル化、またはマルチプロセッシングを使用して、この空気力学計算を高速化できますか?

分類Dev

Pythonマルチプロセッシング+ savefigはエラーまたはシステムロックアップにつながります

分類Dev

Pythonで関数の引数を繰り返しながら、マルチプロセッシングを使用して関数を並列に実行するにはどうすればよいですか?

分類Dev

Armadilloを使用すると、スパースx密行列の乗算が予想外に遅くなります

分類Dev

マルチプロセッシングでは、各プロセスがCPythonで独自のGILを取得するというのは本当ですか?これは、新しいランタイムの作成とどのように異なりますか?

分類Dev

Pythonのヒープアロケーターは、全体的なメモリ使用量が増えるにつれてコードを大幅に遅くしますか?

分類Dev

マルチプロセッシングは、Windowsのシリアル処理よりも遅くなります(Linuxではできません)

分類Dev

パンダを使用したPython3.5マルチプロセッシング:プロセスが停止することはありません

分類Dev

マルチプロセッシングで参照だけでなく、Pythonが戻り値の新しいコピーを作成するのはなぜですか

分類Dev

パンダの単純な計算よりもマルチプロセッシングが遅いのはなぜですか?

分類Dev

次のネストされたループに対して python3.x でマルチプロセッシングを適用する方法

Related 関連記事

  1. 1

    TypeError:__ init __()は1つの位置引数を取りますが、2つが与えられました(Pytesseractを使用したPythonマルチプロセッシング)

  2. 2

    マルチプロセッシングは、プロセスが多いほど遅くなります

  3. 3

    マルチプロセッシングのメモリ使用量は着実に増加しています。Pool.imap_unordered

  4. 4

    他のコードがコメントアウトされていない場合、マルチプロセッシングが遅くなります

  5. 5

    マルチプロセッシングモジュールによって生成された多くのプロセスを持つことはどれくらいの費用がかかりますか?

  6. 6

    np.array == numの比較は非常に遅いですか?マルチプロセッシングを使用してそれを加速できますか?

  7. 7

    numpyをインポートした後、マルチプロセッシングが単一コアのみを使用するのはなぜですか?

  8. 8

    NumPyで行列ベクトルを乗算すると、1次元ベクトルではなく2次元配列が生成されるのはなぜですか?

  9. 9

    Pythonマルチプロセッシング-実行時間が増加しました、何が間違っていますか?

  10. 10

    この小さなスニペットが、maxtasksperchild、numpy.random.randint、およびnumpy.random.seedを使用したマルチプロセッシングを使用してハングするのはなぜですか?

  11. 11

    Rで次元が異なる2つの行列を乗算します

  12. 12

    マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

  13. 13

    Python:4つのコアに分割された同じワークロードはマルチプロセッシングライブラリで機能しますが、mpi4pyを使用するとハングします

  14. 14

    マルチプロセッシングを使用して、forループで、引数が異なる同じ関数への2つの呼び出しを並列化するにはどうすればよいですか?

  15. 15

    マルチプロセッシングキュー-メモリ消費が増加するのはなぜですか?

  16. 16

    Pythonは、プールを閉じたりmap()を使用したりせずに、マルチプロセッシングプール内のプロセスが完了するのを待ちます

  17. 17

    ターミナルまたはマルチプロセッシングライブラリなしでPythonスクリプトによって使用されるCPUの数を制限するにはどうすればよいですか?

  18. 18

    numpy行列代数またはpythonfor-loop / list-comprehensionは自動的にマルチプロセッシングを利用しますか?

  19. 19

    Numba、ベクトル化、またはマルチプロセッシングを使用して、この空気力学計算を高速化できますか?

  20. 20

    Pythonマルチプロセッシング+ savefigはエラーまたはシステムロックアップにつながります

  21. 21

    Pythonで関数の引数を繰り返しながら、マルチプロセッシングを使用して関数を並列に実行するにはどうすればよいですか?

  22. 22

    Armadilloを使用すると、スパースx密行列の乗算が予想外に遅くなります

  23. 23

    マルチプロセッシングでは、各プロセスがCPythonで独自のGILを取得するというのは本当ですか?これは、新しいランタイムの作成とどのように異なりますか?

  24. 24

    Pythonのヒープアロケーターは、全体的なメモリ使用量が増えるにつれてコードを大幅に遅くしますか?

  25. 25

    マルチプロセッシングは、Windowsのシリアル処理よりも遅くなります(Linuxではできません)

  26. 26

    パンダを使用したPython3.5マルチプロセッシング:プロセスが停止することはありません

  27. 27

    マルチプロセッシングで参照だけでなく、Pythonが戻り値の新しいコピーを作成するのはなぜですか

  28. 28

    パンダの単純な計算よりもマルチプロセッシングが遅いのはなぜですか?

  29. 29

    次のネストされたループに対して python3.x でマルチプロセッシングを適用する方法

ホットタグ

アーカイブ