Gensim Doc2Vec训练崩溃,出现Killed:9错误



我有超过3700万个句子的文档,我正在使用Gensim的Doc2Vec来训练它们。模型训练可以很好地处理较小的数据集,比如5M-10M的记录。然而,当在整个数据集上进行训练时,该过程大多在"重置层权重"阶段结束。有时,它以前就死了。

我怀疑这是记忆问题。我有16GB的4核RAM。如果这确实是内存问题,有什么方法可以批量训练模型吗。从阅读文档来看,train((在新文档没有新词汇的情况下似乎很有用。但是,我的文件并非如此。

有什么建议吗?

让模型变大的不是语料库的原始大小,而是你希望模型训练的唯一单词/doc标签的数量。

如果你使用3700万个唯一的文档,每个文档都有自己的ID作为文档标签,并且你使用的是一个像300维这样的通用向量大小,那么仅这些文档向量就需要:

37 million * 300 dimensions * 4 bytes/dimension = 44.4 GB

唯一单词和内部模型权重将需要更多的RAM,但没有这些具有正常大小词汇表和合理选择min_count以丢弃稀有单词的文档向量那么多。

Gensim支持流式训练,对于更大的语料库来说,流式训练不需要更多的内存,但如果你想在同一模型中获得4700万个300维向量,那么仍然需要大量的可寻址内存。

你最好的选择可能是在一些较小的、有代表性的子集上训练模型——也许只是一个随机子集——它适合可寻址内存。然后,当您需要其他文档的向量时,可以使用infer_vector()一次计算一个向量,然后将它们存储在其他地方。(但是,你仍然不会把它们都记在记忆中,这对于most_similar()或其他完整语料库比较的快速扫描至关重要(。

使用具有大量RAM的机器可以更容易地处理如此大的向量集。

(另一个可能的技巧是使用mapfile_path参数,但除非您熟悉操作系统如何处理内存映射文件,并了解大型docvecs数组是如何在以后的操作中进一步使用/转换的,否则它可能会带来更大的麻烦。它还涉及性能问题,只有当您的文档只有一个unique ID标签,以便对mmamapped文件的访问模式始终处于训练中,并且相似性搜索以相同的原始顺序进行简单的前后加载。您可以查看此答案以了解更多详细信息。(

最新更新