一个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矩阵的列,并且在计算完成每行时与barrier同步,实际上运行速度比原始顺序代码慢。

我认为同步机制的开销是这个问题的根源,因为我使用来自池的线程和所有操作的可重用屏障。有没有更好的设计,我应该考虑,或者N的小尺寸不证明并行计算列的合理性?

速度变慢的原因是使用了多线程库而不是Python的多处理库。由于GIL(全局解释器锁)的性质,实际上一次只有一个线程在运行。对于不需要任何IO操作的计算有限的程序来说,这是相当无效的。上下文切换只会导致我的代码运行得更慢。在不同进程之间共享同步原语完全是另一个问题,我还不确定如何处理这个问题…

最新更新