如何使 CPU 计数为 40 的 Doc2Vec 更快 运行?

How to get Doc2Vec to run faster with a CPU count of 40?

我正在构建自己的词汇表来衡量文档相似性。我还附上了 运行.

的日志
tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data)]

max_epochs = 1000
vec_size =50
alpha = 0.025

tic = time.perf_counter()
#Building a model from the tokenized data

model = Doc2Vec(vector_size=vec_size,
                alpha=alpha, 
                min_alpha=0.0025,
                min_count=5,
                workers =5,
                dm =1)
  
model.build_vocab(tagged_data)


model.train(tagged_data,total_examples=model.corpus_count,epochs=max_epochs)



model.save("d2v.model")
print("Model Saved")

toc = time.perf_counter()
print(f"Time {toc - tic:0.4f} seconds")

Log of Doc2Vec

通常是由于 Python 'Global Interpreter Lock' ('GIL') 和默认的 Gensim master-reader-thread, many-worker 固有的线程争用-thread 方法,一旦你超过了大约 8-16 个核心,训练就不能让所有核心都忙于单独的线程。

如果您可以接受每个文本的唯一 tag 将是其在语料库中的序号,则指定训练数据的备用 corpus_file 方法允许任意多个线程打开他们自己的 readers 到(whitespace-token-delimited)纯文本语料库文件中,当你有 16+ cores/workers.

时实现更高的核心利用率

请参阅 corpus_file 参数的 Gensim 文档:

https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.Doc2Vec

请注意,尽管有一些 unsolved bugs 暗示此模式可能会在某些分段边界处错误处理或遗漏训练数据。 (这在大型训练数据中可能并不重要。)

否则,其他有助于 Word2Vec/Doc2Vec 训练 运行 更快的参数调整可能值得尝试,例如更改 windowvector_size , negative 值。 (不过请注意,与直觉相反,当瓶颈是 Gensim 默认语料库可迭代模式中的线程争用时,这些参数中的某些值通常需要更多计算,因此意味着较慢的训练设法主要吸收先前空闲的争用时间,因此是比较 'free'。因此,当遇到竞争时,为 window/negative/vector_size 尝试更昂贵的值可能会变得更实用。)

一般来说,更高的min_count(丢弃更多的稀有词),或者更激进(更小)的sample值(丢弃更多的高频词),也可以减少发生的原始训练量,从而更快地完成训练,而对质量的影响最小。 (有时,更激进的 sample 值设法 两者 加速训练并改善下游评估的结果,方法是让模型花费相对更多的时间在下游仍然重要的稀有词上.)