Gensim Doc2vec finalize_vocab Memory E版

2024-10-02 00:40:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用gensim来训练Doc2Vec模型,它有114M个独特的文档/标签和大约3M个单词的voab大小。我在Azure上有115gbramlinux机器。 当我运行build_vocab时,迭代器解析所有文件,然后抛出内存错误,如下所示。在

    Traceback (most recent call last):
  File "doc_2_vec.py", line 63, in <module>
    model.build_vocab(sentences.to_array())
  File "/home/meghana/.local/lib/python2.7/site-packages/gensim/models/word2vec.py", line 579, in build_vocab
    self.finalize_vocab(update=update)  # build tables & arrays
  File "/home/meghana/.local/lib/python2.7/site-packages/gensim/models/word2vec.py", line 752, in finalize_vocab
    self.reset_weights()
  File "/home/meghana/.local/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 662, in reset_weights
    self.docvecs.reset_weights(self)
  File "/home/meghana/.local/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 390, in reset_weights
    self.doctag_syn0 = empty((length, model.vector_size), dtype=REAL)
MemoryError

我的代码-

^{pr2}$

按top计算的内存使用量为-

enter image description here

有人能告诉我预期内存是多少吗?什么是更好的选择-添加交换空间并减慢进程或添加更多内存,这样集群的成本最终可能相等。 gensim在内存中存储什么向量?我在内存效率使用中丢失的任何标志。在


Tags: 内存inpybuildselfhomelibpackages
1条回答
网友
1楼 · 发布于 2024-10-02 00:40:53

1.14亿个doctag至少需要114,000,000 doctags * 300 dimensions * 4 bytes/float = 136GB来存储训练期间的原始doctag向量。在

(如果doctag键row['Id']是字符串,那么记住字符串到int索引映射dict会有额外的开销。如果doctag键是0到1.14亿的原始整数,这将避免填充该dict。如果doctag键是原始int,但包含任何大于1.14亿的int,模型将尝试分配一个足够大的数组,以包含一行最大的int–即使许多其他较低的int未使用)

原始单词向量和模型输出层(model.syn1)将需要大约8GB的空间,而词汇词典需要另外几个GB。在

因此,理想情况下,您需要更多的可寻址内存,或者更小的doctag集。在

您提到了一个“集群”,但是gensimDoc2Vec不支持多机分发。在

对于这些算法来说,使用交换空间通常不是一个好主意,因为这些算法可能涉及大量的随机访问,因此在交换过程中变得非常缓慢。但是对于Doc2Vec,您可以使用Doc2Vec.__init__()可选参数docvecs_mapfile,将其doctags数组设置为由内存映射文件提供服务。如果每个文档都有一个标记,并且这些标记在每次重复扫描培训文本时以相同的升序出现,则性能可以接受。在

单独:

你对训练迭代和alpha学习率的管理是有缺陷的。您将在数据上实现2次传递,值分别为0.025和0.023,即使每个train()调用都尝试默认的5次传递,但只从不可重新启动的sentences.to_array()对象获取一次迭代。在

您应该争取更多的传递,模型用更少的代码行来管理alpha从最初的高值到默认的最终微小值min_alpha值。您只需要调用train()一次,除非您绝对确定需要在多个调用之间执行额外的步骤。(此处显示的内容不需要此功能。)

通过将to_array()更改为__iter__(),然后将sentences单独传递给模型,从而使sentences成为可以多次迭代的真正的iterable对象。在

然后用这个multiply-iterable对象调用一次train(),并让它用从高到低的平滑alpha更新来完成指定次数的迭代。(从Word2Vec继承的默认值是5次迭代,但是在已发布的Doc2Vec工作中通常使用10到20次迭代。0.0001的默认值min_alpha几乎不应更改。)

相关问题 更多 >

    热门问题