簡體   English   中英

與SciPy.optimize的並行性

[英]Parallelism with SciPy.optimize

我正在研究一些使用scipy.optimize.leastsq來優化函數的研究代碼。 它每次迭代執行大約18次,所以我想並行調用leastsq以減少運行時間。 這應該不是問題,因為優化幾乎是完全獨立的,因此需要很少的同步。 我最近發現了multiprocessing.pool.ThreadPool ,它允許我這樣做,而不必顯式設置共享內存(因為我的大多數數據都在NumPy數組中,所以很痛苦)。 所以我稍微重寫了我的代碼,希望它能工作,但它會拋出一個奇怪的錯誤: SystemError: null argument to internal routine

以下是我的代碼的簡化:

def optfunc(id):
    def errfunc(x):
        return somedata[id] - somefunc(x)

    lock.acquire()
    x0 = numpy.copy(currentx[id])
    lock.release()

    result = scipy.optimize.leastsq(errfunc, x0)

    lock.acquire()
    currentx[id] = result
    lock.release()

ThreadPool(processes=8).map(optfunc, range(idcount))

除非scipy.optimize.leastsq不是線程安全的,否則這應該可以正常工作。 所以我試着鎖定scipy.optimize.leastsq ; 瞧,它有效。 但是,處理器利用率停留在100%,所以這對我來說毫無用處。

我的問題是,我該怎么辦呢? 我認為我的選擇是:

  1. 找到LM的線程安全實現(levmar,也許?)
  2. 嘗試使用進程而不是線程(我不認為這會產生影響)

任何幫助或建議將不勝感激。

使用進程而不是線程會產生影響 - 無論程序是否是線程安全的,它都將起作用。 當然,它是否更快取決於解決問題所花費的時間是否大於開銷。

使用過程可能需要一些額外的麻煩來設置所有必要的數據。 然而, multiprocessing模塊負責大部分工作,因此不應該太難。

多少CPU /核心? 如果沒有線程,你所擁有的是100%運行沒有任何好處。 如果leastq()不是線程安全的,並且您沒有使用100%的計算機,那么您可以為每個核心運行一個程序實例,並讓實例通過文件系統進行同步。

暫無
暫無

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

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