繁体   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