簡體   English   中英

CRF 的多線程向前/向后

[英]Multithreading Forwards/Backwards for a CRF

我正在嘗試多線程前向后算法以找到邊際概率。 這將用作訓練 CRF 的子模塊。 下面是針對單個示例的 CRF 訓練的前向部分的偽代碼(來自此處)。

for i in 0 .. T-1:
    for j in 1 ... N:
        for k in 1 ... N:
            p = alpha[(i-1)][k] + trans[k][j] + obvs[j][i]
            alpha[i][j] = logadd(alpha[i][j], p)

我計划使用 N 個線程(對於我的用例而言,N 最多為 10)來獨立計算 alpha 矩陣的列,並在完成計算每一行后與屏障同步實際上比原始順序代碼運行得慢。

我相信同步機制的開銷是這個問題的根源,因為我使用池中的線程和所有操作的可重用屏障。 是否有更好的設計我應該考慮,或者 N 的小尺寸是否不能證明並行計算 alpha 列是合理的?

我變慢的原因是使用多線程庫而不是 Python 中的多處理庫。 由於 GIL(全局解釋器鎖)的性質,一次實際上只有一個線程在運行。 這對於不需要任何 IO 操作的計算有界程序來說是非常無效的。 上下文切換只會導致我的代碼運行速度變慢。 在不同進程之間共享同步原語完全是另一個問題,我不知道如何處理......

暫無
暫無

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

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