CRF 的多线程 Forwards/Backwards

Multithreading Forwards/Backwards for a CRF

我正在尝试对前向-后向算法进行多线程处理以找到边际概率。这将用作训练 CRF 的子模块。下面是 CRF 训练的前向段在单个例子上的伪代码(来自 here)。

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(全局解释器锁)的性质,实际上一次只有一个线程 运行ning。这对于不需要任何 IO 操作的计算有限程序来说是非常低效的。上下文切换只会导致我的代码 运行 变慢。在不同进程之间共享同步原语完全是另一个问题,我还不确定如何处理它...