簡體   English   中英

python中的多線程優化

[英]multithreading optimization in python

我正在使用lmfit進行一些優化,而且速度很慢。 我的圖像很大,基本上每個像素都在進行最小二乘最小化。 在我看來,它可能非常適合多線程或其他類型的優化,因為它目前非常緩慢。

因此,我的優化代碼如下:

我將目標函數定義為:

def objective(params, x, data):
    s0 = params['S0']
    t1 = params['T1']
    m = s0 * (1.0 - np.exp(-x / t1))
    return m - data

因此,我試圖最小化模型與觀察值之間的差異。 我認為lmfit可以確保將絕對值最小化,但是我不確定,需要檢查。

主循環如下:

我需要估計的參數初始化如下,並帶有一些初始值:

p = Parameters()
p.add('S0', value=1.0)
p.add('T1', value=3.0)

final_data = <numpy image>
tis = np.asarray([1.0, 2.0, 3.0])

for i in range(final_data.shape[0]):
    print "Processing pixel: ", i
    minner = Minimizer(objective, params=p, fcn_args=np.asarray(tis),
                       final_data[i, :]),
                       nan_policy='propagate')
    result = minner.minimize(method='least_squares')
    s0_data[i] = result.params['S0']
    t1_data[i] = result.params['T1']

這可以正常工作,但速度很慢。 我試圖弄清楚如何在python中執行多線程,並對關於GIL鎖定的帖子感到非常困惑,而python中的多線程並不真正存在。

我的問題是:1:可以使用python中的多線程輕松擴展嗎? 2:還有其他可以嘗試的優化方法嗎?

就像評論所暗示的那樣,這里的多線程不會有很多成果。 基本上,任何與lmfit或scipy匹配的結果都會以單線程fortran例程結尾,該例程會反復調用python目標函數,並使用這些結果生成下一步。 嘗試使用多線程意味着必須在線程之間管理python目標函數和參數-fortran代碼不適用於此目的,並且無論如何,計算實際上並不是I / O綁定的。

為了使用多個內核進行多處理是一種更好的方法。 但是嘗試將多重處理用於單個擬合並不是聽起來那么簡單,因為目標函數和參數必須是可腌制的。 對於您的簡單示例,這應該可行,但是隨着問題使用更復雜的對象,該方法可能會失效。 蒔蘿包可以幫助您。

而且:由於您的問題自然並行化,因此有一個甚至更簡單的解決方案。 只是針對每個像素分別進行擬合,每個像素都在自己的過程中進行。 您可以為此使用多重處理,或者甚至可以將問題分解為N個單獨的實際進程,它們運行N個不同的腳本,每個腳本適合像素的1 / N。

暫無
暫無

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

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