gpt4 book ai didi

python - Doc2vec 内存错误

转载 作者:太空狗 更新时间:2023-10-30 00:27:51 26 4
gpt4 key购买 nike

我正在使用来自 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 或操作系统中的一些内存限制?

提前致谢!

最佳答案

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

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

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

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

一些可能有帮助的步骤:

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

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

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

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

关于python - Doc2vec 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30488695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com