python - doc2vec:性能测量和“工人”参数
问题描述
我有一个非常大的语料库作为我的 doc2vec 培训的输入,大约 2300 万个文档使用可迭代函数进行流式传输。我想知道是否有可能看到我的训练进度的发展,可能是通过找出它当前正在进行的迭代、每秒字数或一些类似的指标。
我还想知道如何加快 doc2vec 的性能,而不是减小语料库的大小。我发现了workers参数,我目前正在培训 4 个流程;这个数字背后的直觉是多处理不能利用虚拟内核。我想知道 doc2vec workers参数是否属于这种情况,或者我是否可以使用 8 个工作程序,甚至可能更高(我有一个四核处理器,运行 Ubuntu)。
我必须补充一点,使用 unix 命令top -H
仅报告使用 8 个工作人员的每个 python 进程的 CPU 使用率约为 15%,而使用 4 个工作人员的每个进程的 CPU 使用率约为 27%。
解决方案
如果您在 INFO 级别启用日志记录,您应该会看到大量的进度输出。以下gensim
是 Doc2Vec 教程,看起来像
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
Word2Vec
gensim或模型的最佳吞吐量Doc2Vec
通常在workers
3 到 12 之间,但绝不会超过可用处理器内核的数量。(如果您使用特定的磁盘语料库格式,则进一步优化对于具有更多内核的机器特别有用,该格式在最新的 3.6.0 gensim 版本中可用 - 请参阅发行说明以获取更多信息。)
如果您在 4 核、4 工作人员设置上看到如此低的利用率,那么瓶颈可能是您的语料库迭代器。如果它正在执行任何复杂的 IO 或基于正则表达式的文本处理,那么训练工作线程通常处于空闲状态,等待一个主语料库迭代器线程生成更多文本,从而限制了整体利用率和效率。
您应该尝试做一次复杂的事情,然后将标记/标记化的结果作为更简单的文件重新写入磁盘。然后用一个非常简单的以行和空格分隔的迭代器来阅读它,以进行实际的模型训练。
(如果您的 4 核实际上支持更多的虚拟核,那么workers
高达 8 的某个值可能会实现更高的吞吐量......但只有使用您的特定模型参数的试错法,当前才能找到您的局部最优值。最优值可以随其他参数而变化,例如size
, window
,negative
等)
推荐阅读
- google-chrome - 如何确定 Chrome 中的 cookie 问题?
- c# - 当应用程序在后台 Xamarin.Android 中时,无法第二次获得意图额外的文本
- sql - 在 postgresql 中有一组指令的函数中,查询没有结果数据的目的地
- ios - 如何定义具有动态缓冲区声明的金属着色器?
- php - 当我在 foreach 循环中(使用 post 方法)时无法访问输入的值
- android - ArrayList 在初始化后立即为空
- python - groupby + apply 导致一系列同时出现在索引和列中 - 如何防止它?
- ansible - Ansible playbook 可在缺少时在 IOS 设备上添加本地帐户
- ios - CIImage在SWIFT中的矩形到正方形
- python - Tkinter OOP 在实例方法中更新小部件