Parallel processing 并行化不利于word2vec模型的训练

Parallel processing 并行化不利于word2vec模型的训练,parallel-processing,nlp,gensim,word2vec,Parallel Processing,Nlp,Gensim,Word2vec,我尝试使用在gensim库中实现的word2vec的并行性。我注意到,我增加的线程越多,训练就越慢,我不知道为什么。 有什么设置要做吗? 我使用: -德比安 -python 3.6.9 -赛昂 我怎样才能从并行性中获益 感谢advanceGensim为Word2Vec(&相关模型)指定训练语料库的默认和原始方法是通过单个iterable对象,该对象可以依次提供每个文本示例。然后,一个主线程从iterable中读取,将成批文本分发给任意数量的工作线程(由workers参数控制) 这仍然面临一些性能

我尝试使用在gensim库中实现的word2vec的并行性。我注意到,我增加的线程越多,训练就越慢,我不知道为什么。 有什么设置要做吗? 我使用: -德比安 -python 3.6.9 -赛昂 我怎样才能从并行性中获益


感谢advance

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

这仍然面临一些性能瓶颈,阻碍了大量线程的充分利用,特别是随着线程数量的增加

首先,如果iterable对象本身正在做任何耗时的工作来准备每个项目,例如标记化或预处理,或者向一个滞后/远程源发送IO,那么单个主线程发送文本的速度可能不如许多工作人员处理文本的速度快,从而成为限制因素。(您可以通过确保iteratable执行尽可能少的IO或regex/文本扫描/查找来帮助实现这一点,例如使用内存中已标记的语料库,或者仅从磁盘读取已标记/预处理的语料库,只需要在空格/换行符上进行简单的项/标记拆分。)

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

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

要使用此选项,请使用
corpus\u file
参数指定语料库作为文件路径

中提到了此参数,并且在中对其用法进行了更多讨论


使用此选项,培训吞吐量通常会随着每个额外的
worker
线程的增加而近似线性地提高,直到可用的CPU内核数。(请注意,最初对语料库进行的一次性词汇构建调查仍然是单线程的。)

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