6

我正在使用来自 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) 

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

resource.getrlimit(resource.RLIMIT_MEMLOCK)

有人可以解释这个 MemoryError 的原因吗?在我看来,可用内存应该足以进行此计算。python或操作系统中可能有一些内存限制吗?

提前致谢!

4

1 回答 1

15

18M 个向量 * 400 个维度 * 4 个字节/浮点数 = 28.8GB 用于模型的 syn0 数组(训练向量)

syn1 数组(隐藏权重)也将是 28.8GB——尽管 syn1 并不真正需要 doc-vector 的条目,这些条目在训练期间绝不是目标预测。

词汇结构(vocab dict 和 index2word 表)可能会增加另一个 GB 或更多。这就是你所有的 60GB RAM。

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

一些可能有帮助的步骤:

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

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

  • 在训练之后但在调用 most_similar() 之前,使用 replace=True 参数自己调用 init_sims(),以丢弃未归一化的 syn0 并用 syn0norm 替换它。同样,您将无法进行更多训练,但您将节省 syn0 内存。

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

于 2015-05-28T23:28:25.330 回答