我正在使用gensim框架中的doc2vec模型来表示1550万个简短文档(最多300个单词)的语料库:
gensim.models.Doc2Vec(sentences, size=400, window=10, min_count=1, workers=8 )
创建矢量后,有超过18000000个矢量表示单词和文档。
我想找到给定项目最相似的项目(单词或文档):
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交换空间的Ubuntu计算机。我检查了内存分配(在htop中),发现没有完全使用内存。我还将python中可能锁定在内存中的最大地址空间设置为无限制:
resource.getrlimit(resource.RLIMIT_MEMLOCK)
有人可以解释此MemoryError的原因吗?我认为可用内存应该足以进行此计算。可能是python或OS中的一些内存限制吗?
提前致谢!
最佳答案
该模型的syn0数组的18M向量* 400维* 4字节/浮点数= 28.8GB(训练的向量)
syn1数组(隐藏权重)也将为28.8GB,即使syn1确实不需要doc-vector的条目,在训练过程中也不是目标预测。
词汇结构(vocab dict和index2word表)可能会增加另一个GB或更多。这就是您所有的60GB RAM。
用于相似度计算的syn0norm数组将需要另外28.8GB,总使用量约为90GB。这是在syn0norm创建过程中遇到的错误。但是,即使syn0norm创建成功,那么深入虚拟内存也可能会破坏性能。
某些步骤可能会有所帮助:
正在进行的将文档和单词向量分离出来的工作(最终将在版本0.11.1之后的gensim中出现)最终也应会有所缓解。 (它将syn1缩小为仅包含单词条目,并允许doc-vectors来自文件支持的(具有内存映射的)数组。)
关于python - Doc2vec MemoryError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30488695/