如何使 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
训练 运行 更快的参数调整可能值得尝试,例如更改 window
、vector_size
, negative
值。 (不过请注意,与直觉相反,当瓶颈是 Gensim 默认语料库可迭代模式中的线程争用时,这些参数中的某些值通常需要更多计算,因此意味着较慢的训练设法主要吸收先前空闲的争用时间,因此是比较 'free'。因此,当遇到竞争时,为 window
/negative
/vector_size
尝试更昂贵的值可能会变得更实用。)
一般来说,更高的min_count
(丢弃更多的稀有词),或者更激进(更小)的sample
值(丢弃更多的高频词),也可以减少发生的原始训练量,从而更快地完成训练,而对质量的影响最小。 (有时,更激进的 sample
值设法 两者 加速训练并改善下游评估的结果,方法是让模型花费相对更多的时间在下游仍然重要的稀有词上.)
我正在构建自己的词汇表来衡量文档相似性。我还附上了 运行.
的日志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
训练 运行 更快的参数调整可能值得尝试,例如更改 window
、vector_size
, negative
值。 (不过请注意,与直觉相反,当瓶颈是 Gensim 默认语料库可迭代模式中的线程争用时,这些参数中的某些值通常需要更多计算,因此意味着较慢的训练设法主要吸收先前空闲的争用时间,因此是比较 'free'。因此,当遇到竞争时,为 window
/negative
/vector_size
尝试更昂贵的值可能会变得更实用。)
一般来说,更高的min_count
(丢弃更多的稀有词),或者更激进(更小)的sample
值(丢弃更多的高频词),也可以减少发生的原始训练量,从而更快地完成训练,而对质量的影响最小。 (有时,更激进的 sample
值设法 两者 加速训练并改善下游评估的结果,方法是让模型花费相对更多的时间在下游仍然重要的稀有词上.)