Doc2vec 内存错误

Doc2vec MemoryError

我正在使用来自 teh gensim 框架的 doc2vec 模型来表示包含 15,500,000 个短文档(最多 300 个单词)的语料库:

gensim.models.Doc2Vec(sentences, size=400, window=10, min_count=1, workers=8 )

创建向量后,有超过 18 000 000 个表示单词和文档的向量。

我想为给定项目查找最相似的项目(单词或文档):

 similarities = model.most_similar(‘uid_10693076’)

但是在计算相似性时我得到一个 MemoryError:

Traceback (most recent call last):

   File "article/test_vectors.py", line 31, in <module> 
    similarities = model.most_similar(item) 
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 639, in most_similar 
    self.init_sims() 
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 827, in init_sims 
    self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) 

我有一台 Ubuntu 机器,配备 60GB Ram 和 70GB swap。我检查了内存分配(在 htop 中),发现内存从未被完全使用过。我还将最大地址 space 设置为无限制,它可能被锁定在内存中 python:

resource.getrlimit(resource.RLIMIT_MEMLOCK)

谁能解释一下这个 MemoryError 的原因?在我看来,可用内存应该足以进行此计算。可能是 python 或 OS 中的某些内存限制?

提前致谢!

18M 向量 * 400 维 * 4 bytes/float = 28.8GB 用于模型的 syn0 数组(经过训练的向量)

syn1 数组(隐藏权重)也将是 28.8GB – 尽管 syn1 并不真正需要文档向量的条目,而文档向量在训练期间从来都不是目标预测。

词汇结构(vocab dict 和 index2word table)可能会再增加 GB 或更多。这就是你所有的 60GB 内存。

用于相似度计算的 syn0norm 数组还需要 28.8GB,总用量约为 90GB。这是您遇到错误的 syn0norm 创建。但即使 syn0norm 创建成功,深入虚拟内存也可能会破坏性能。

一些可能有帮助的步骤:

  • 使用至少 2 的 min_count:出现一次的词不太可能贡献很多,但可能会占用大量内存。 (但由于单词只是 syn0 的一小部分,这只会节省一点。)

  • 在训练之后但在触发 init_sims() 之前,丢弃 syn1 数组。您将无法训练更多,但您现有的 word/doc 向量仍然可以访问。

  • 训练后但调用most_similar()之前,使用replace=True参数自己调用init_sims(),丢弃非规范化的syn0并将其替换为同义词。同样,您将无法训练更多,但您将保存 syn0 内存。

正在进行的分离文档和词向量的工作,将出现在 gensim 过去的版本 0.11.1 中,最终也应该提供一些缓解。 (它将缩小 syn1 以仅包含单词条目,并允许文档向量来自文件支持的(memmap'd)数组。)