【问题标题】:parallelization not benefit for training word2vec model并行化不利于训练 word2vec 模型
【发布时间】:2020-06-07 11:28:17
【问题描述】:

我尝试使用在 gensim 库中实现的 word2vec 的并行性。我注意到,我增加的线程越多,训练就越慢,我不知道为什么。 有什么设置可以做吗? 我用 : - Debian -蟒蛇3.6.9 - 赛通 我怎样才能使并行性受益?

感谢提前

【问题讨论】:

  • 你有多少个 CPU 内核?您尝试了哪些workers 值,您看到了哪些观察到的训练速度变化?
  • 我有 16 个 cpu 核心,我将 'workers' 值设置为 16。核心越多,训练就越慢()。

标签: parallel-processing nlp gensim word2vec


【解决方案1】:

Gensim 为Word2Vec(和相关模型)指定训练语料库的默认和原始方式是通过单个可迭代对象,该对象可以依次提供每个文本示例。然后,一个主线程从可迭代对象中读取,将成批的文本打包到任意数量的工作线程(由workers 参数控制)。

这仍然面临一些妨碍充分利用大量线程的性能瓶颈,尤其是随着线程数量的增长。

首先,如果可迭代对象本身正在做任何耗时的工作来准备每个项目——例如标记化或预处理,或对滞后/远程源的 IO——单个主线程可能不会尽可能快地发送文本,使许多工作人员能够处理它们,成为限制因素。 (您可以通过确保您的可迭代对象执行尽可能少的 IO 或正则表达式/文本扫描/查找来帮助这一点 - 例如通过使用已在内存中标记化的语料库,或仅从磁盘读取已标记化/预处理的语料库需要仅在空格/换行符上进行简单的项目/令牌拆分。)

第二,Python 的“全局解释器锁”(GIL) 意味着大多数纯 Python 代码一次只能由一个线程运行。 Gensim 使用 Cython 和库代码使大部分工作人员最密集的任务能够在 GIL 瓶颈之外发生,但是每个线程的控制循环和线程间结果切换的某些方面仍然需要 GIL。因此,随着工作线程数量的增加,对 GIL 的争用成为更多的限制因素——因此,即使有 16 个以上的内核,训练吞吐量通常也会在 5-12 个线程左右达到最大值。 (一些加强训练某些方面的参数选择——比如更大的向量大小或更多的负样本——可以减少争用,但可能不会提高运行时间,因为这些选项只是回收竞争时间以进行更多计算。)

最新版本的 gensim 包括提供语料库的替代方法,如果您可以将语料库作为单个文件提供,其中每个文本在其上自己的行,所有标记由空格分隔。在这种情况下,每个工作人员都可以在文件的范围内打开自己的视图,从而允许他们的训练完全进行,而无需 GIL/线程间切换。

要使用此替代方法,请使用 corpus_file 参数指定您的语料库,作为文件的路径。

Word2Vec class docs 中提到了此参数,release notes for gensim version 3.6.0 中对其用法进行了更多讨论。

使用此选项,训练吞吐量通常会随着每个额外的workers 线程线性提高,最多可达到可用 CPU 内核的数量。 (请注意,语料库的初始一次性词汇构建调查仍然是单线程的。)

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 2021-12-15
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多