簡體   English   中英

在python中使用多進程和numpy的速度急劇下降

[英]dramatic slow down using multiprocess and numpy in python

我為Q學習算法編寫了python代碼,由於該算法具有隨機輸出,因此必須多次運行。 因此,我使用multiprocessing模塊。 代碼的結構如下

import numpy as np
import scipy as sp
import multiprocessing as mp
# ...import other modules...

# ...define some parameters here...

# using multiprocessing
result = []
num_threads = 3
pool = mp.Pool(num_threads)
for cnt in range(num_threads):
    args = (RL_params+phys_params) # arguments
    result.append(pool.apply_async(Q_learning, args))

pool.close()
pool.join()

我的代碼中沒有I / O操作,並且我的工作站有6個核心(12個線程)和足夠的內存來完成此工作。 當我使用num_threads=1運行代碼時,只用了13秒,此任務僅占用1個線程,CPU使用率為100%(使用top命令)。

點擊查看CPU狀態圖

但是,如果我以num_threads=3 (或更多)運行它,則將花費40秒鍾以上的時間,並且此任務將占用3個線程,每個線程使用100%CPU內核。

點擊查看CPU狀態圖

我無法理解這種速度下降的原因,因為所有自定義函數都沒有並行化,也沒有I / O操作。 還有趣的是,當num_threads=1 ,CPU使用率始終小於100%,但是當num_threads大於1時,CPU使用率有時可能為101%或102%。

另一方面,我編寫了另一個簡單的測試文件,該文件不導入numpy和scipy,因此此問題從不顯示。 我已經注意到了這個問題, 為什么numpy.mean不是多線程的? 似乎我的問題是由於numpy中某些方法的自動並行化(例如dot )。 但是,正如我在圖片中所顯示的,運行單個作業時看不到任何並行化。

使用多處理池時,所有參數和結果都將通過pickle發送。 這可能是非常耗費處理器時間的。 這可能是問題的根源,尤其是當您的論點和/或結果很大時。 在這些情況下,Python可能比在運行計算上花費更多的時間來進行數據的選取和取消選取。

但是, numpy在計算過程中會釋放全局解釋器鎖,因此,如果您的工作是numpy密集型的,則可以通過使用線程而不是多處理來加快它的速度。 這樣可以避免酸洗步驟。 請參閱此處以獲取更多詳細信息: https : //stackoverflow.com/a/38775513/3830997

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM