为了账号安全,请及时绑定邮箱和手机立即绑定

玄牟字2vc的训练时间

玄牟字2vc的训练时间

慕勒3428872 2022-09-13 17:44:01
我正在34 GB预处理MS_MARCO语料库(22 GB)上从头开始训练word2vec。(预处理语料库被发送标记化,因此其大小更大)我正在使用以下代码训练我的word2vec模型:from gensim.test.utils import common_texts, get_tmpfilefrom gensim.models import Word2Vecclass Corpus():    """Iterate over sentences from the corpus."""    def __init__(self):        self.files = [            "sp_cor1.txt",            "sp_cor2.txt",            "sp_cor3.txt",            "sp_cor4.txt",            "sp_cor5.txt",            "sp_cor6.txt",            "sp_cor7.txt",            "sp_cor8.txt"        ]    def __iter__(self):        for fname in self.files:            for line in open(fname):                words = line.split()                yield wordssentences = Corpus()model = Word2Vec(sentences, size=300, window=5, min_count=1, workers=8, sg=1, hs=1, negative=10)model.save("word2vec.model")我的模型现在运行了大约30多个小时。这是值得怀疑的,因为在我的i5笔记本电脑上有8个内核,我每时每刻都在100%使用所有8个内核。另外,我的程序现在似乎已经从磁盘中读取了超过100 GB的数据。我不知道这里是否有任何问题,但是我对培训产生怀疑的主要原因是因为从磁盘读取100 GB。整个语料库是34 GB,那么为什么我的代码从磁盘中读取了100 GB的数据?有谁知道在34 GB的文本上训练word2vec需要多少时间,8个内核的i5 CPU并行运行?谢谢。有关更多信息,我还从系统监视器附加了我的进程照片。我想知道为什么我的模型从内存中读取了 112 GB,即使我的语料库总共为 34 GB?我的训练会完成吗?此外,我有点担心我的笔记本电脑的健康状况,因为它自过去30小时以来一直以峰值容量运行。现在真的很热。我是否应该添加任何附加参数,以便更快地进行训练而不会造成太大的性能损失?Word2Vec
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

完成模型需要对所有数据进行一次传递以发现词汇,然后多次传递(默认值为 5)以执行向量训练。因此,您应该期望在磁盘读取中看到大约6倍的数据大小,仅从模型训练中即可。

(如果您的机器在此过程中最终需要使用虚拟内存交换,则可能会有更多的磁盘活动 - 但您绝对不希望发生这种情况,因为word2vec训练的随机访问模式几乎是虚拟内存使用的最坏情况,这将大大减慢训练速度。

如果您想了解代码的进度,并能够估计其完成时间,则应至少将Python日志记录启用到该级别。该过程的各个步骤将报告中期结果(例如发现和幸存的词汇量)和估计的进度。您通常可以通过研究合理值的日志记录输出来判断运行结束之前是否出现问题,并且一旦“训练”阶段开始,完成时间将是到目前为止完成的训练的简单预测。INFO

我相信大多数笔记本电脑应该限制自己的CPU,如果它变得如此之热以至于变得不安全或冒着CPU /组件极度磨损的风险,但是你的笔记本电脑是否这样做,我不能说,并且绝对确保其风扇工作&通风口畅通无阻。

我建议你选择一些小的随机数据子集 - 也许是1GB?– 在尝试在完整数据集上运行之前,能够运行所有步骤以完成,熟悉日志记录输出,资源使用情况和结果,并修补设置以观察更改,这可能需要数天的训练时间。Word2Vec

显示的某些参数对于快速训练不是最佳的。特别:

  • min_count=1保留语料库调查中看到的每个单词,包括仅出现一次的单词。这会导致一个非常大得多的模型 - 可能会冒着模型不适合RAM的风险,迫使灾难性的交换。但是,只有几个用法示例的单词不可能获得好的单词向量,因为该过程需要看到许多微妙不同的替代用法。尽管如此,通过典型的“Zipfian”词频,只有少数用法的此类单词的数量可能总共非常大,因此保留所有这些单词需要大量的训练时间/精力,甚至有点像“噪音”,使得其他单词的训练,大量的使用示例,效果较差。因此,对于模型大小、训练速度和剩余向量的质量,需要更大的向量。默认值对于更多的项目来说更好 - 这是一个参数,只有在您确定知道效果时才应该真正更改。而且,当您拥有大量数据时 - 就像您的34GB一样 - 可以做得更高,以保持模型大小易于管理。min_countmin_count=5min_count=1min_count

  • hs=1仅当您要使用“分层-softmax”训练模式而不是“负采样”时,才应启用该模式 - 在这种情况下,还应将其设置为禁用“负采样”。您可能不想使用分层软最大:它不是默认值是有原因的,并且它不能扩展到更大的数据集。但是,除了负采样之外,您在这里还启用了,可能将所需的训练时间增加了一倍以上。negative=0

  • 您选择是因为您在默认方面遇到问题吗?因为这种非默认选择会明显减慢训练速度。(但是,同样,这里的非默认选择对于较小的数据集更为常见,而像您这样的较大数据集更有可能尝试较小的值。negative=10negative=5negative

上述观察的主题是:“只有当你已经有一些工作,并且你有一个很好的理论(或测试方法)时,才改变默认值,这种改变可能会有所帮助”。

对于足够大的数据集,还有另一个默认参数可以考虑更改以加快训练速度(通常也提高单词向量质量):,该参数控制如何积极地使用高度频繁的单词(具有许多冗余的用法示例)可能会被缩减采样(随机跳过)。sample

默认值(又名 )非常保守。较小的值(如 )将丢弃更多最常用单词的冗余用法示例,从而大大加快整体训练速度。(而且,对于您大小的语料库,您最终可以尝试更小,更具侵略性的值。sample=0.0011e-03sample=1e-05

最后,如果所有数据(对于完整运行或子集运行)都可以位于已以空格分隔的文本文件中,则可以使用指定语料库的替代方法。然后,该类将使用优化的多线程 IO 方法将文件的各个部分分配给备用工作线程 - 如果您以前没有看到所有线程/CPU 内核的完全饱和,则可以增加我们的吞吐量。(我会把它推迟到尝试其他事情之后,然后检查你最好的设置是否仍然让你的8个线程中的一些经常闲置。corpus_fileWord2Vec


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信