python - doc2vec:性能测量和 'workers' 参数

标签 python nlp multiprocessing word2vec doc2vec

我有一个非常大的语料库作为我的 doc2vec 训练的输入,大约有 2300 万个文档使用可迭代函数流式传输。我想知道是否完全有可能看到我的训练进度的发展,可能是通过找出它当前进行的迭代、每秒字数或一些类似的指标。

除了减小语料库的大小之外,我还想知道如何加快 doc2vec 的性能。我发现了 workers 参数,目前我正在训练 4 个进程;这个数字背后的直觉是多处理不能利用虚拟核心。我想知道 doc2vec workers 参数是否属于这种情况,或者我是否可以使用 8 个 worker 代替甚至可能更高(我有一个四核处理器,运行 Ubuntu)。

我必须补充一点,使用 unix 命令 top -H 仅报告使用 8 个工作人员时每个 python 进程的 CPU 使用率约为 15%,而使用 4 个工作人员时每个进程的 CPU 使用率约为 27%。

最佳答案

如果您在 INFO 级别启用日志记录,您应该会看到大量的进度输出。正在关注gensim's Doc2Vec tutorial , 那看起来像

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

gensim 的 Word2VecDoc2Vec 模型的最佳吞吐量通常在 3 到 12 之间的某个 workers 级别,但绝不会超过可用的处理器内核数。 (如果您使用特定的磁盘语料库格式,则有一个进一步的优化对于具有更多内核的机器特别有用,该格式在最新的 3.6.0 gensim 版本中可用 - 请参阅 release notes 了解更多信息。)

如果您在 4 核、4 工作人员设置上看到如此低的利用率,瓶颈可能是您的语料库迭代器。如果它正在执行任何复杂的 IO 或基于正则表达式的文本处理,那么训练工作线程通常会空闲,等待一个主语料库迭代器线程生成更多文本,从而限制整体利用率和效率。

您应该尝试将复杂的事情做一次,然后将标记/标记化的结果作为更简单的文件重新写入磁盘。然后使用一个非常简单的以行和空格分隔的迭代器阅读它以进行实际模型训练。

(如果您的 4 个核心实际上支持更多的虚拟核心,则某些 workers 值高达 8 可能会实现更高的吞吐量......但只能通过反复试验,使用您的特定模型参数,目前可以找到您的局部最优值。最优值可能随其他参数(如 sizewindownegative 等)而变化)

关于python - doc2vec:性能测量和 'workers' 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53639236/

相关文章:

python - 使用 NLTK 提取关系

python - 在IPython中运行ProcessPoolExecutor

python - 范围和随机

python - 根据pandas数据框的列值使用networkx创建图表

nlp - Instagram使用哪个API来执行 'see translation'

php - 使用CURL与cronjob进行PHP多处理

python - 从列表中更新大量 dynamodb 项目的最佳方法

python - 使用 Python 的命令行

python - 如何对图中每一行的 Y 轴标签进行不同的排序?

python - 对整个句子应用 NLP WordNetLemmatizer 显示错误且位置未知