Gensim Doc2Vec培训因Killed失败而崩溃:9错误

时间:2018-07-25 20:47:35

标签: gensim word2vec doc2vec

我有超过3700万个句子的文档,并且我正在使用Gensim的Doc2Vec进行培训。模型训练适用于较小的数据集,例如5M-10M记录。但是,在对整个数据集进行训练时,该过程通常会在“重置图层权重”阶段终止。有时候,它死了。

我怀疑这是内存问题。我有16 GB的RAM和4核。如果确实是内存问题,有什么办法可以分批训练模型。通过阅读文档,在新文档没有新词汇的情况下,train()似乎很有用。但是,我的文档不是这种情况。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

并不是使语料库的原始大小本身会使模型变大,而是要模型进行训练的唯一单词/文档标签的数量。

如果您使用的是3,700万个唯一文档,每个文档都有其自己的ID作为其文档标签,并且使用的是通用矢量大小(例如300个维度),则仅这些文档矢量就需要:

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

唯一的单词和内部模型权重将需要更多的RAM,但不如这些具有正常大小的词汇量和合理选择min_count的doc-vector来丢弃稀有单词。

Gensim支持的流式训练不需要为更大的语料库提供更多的内存,但是如果您想在同一模型中最终得到4,700万个300维向量,那么仍然需要大量可寻址内存。

您最好的选择是在适合可寻址内存的较小的,代表性的子集(可能只是随机子集)上训练模型。然后,当您需要其他文档的向量时,可以使用infer_vector()一次计算一次,然后将它们存储在其他位置。 (但是,您仍然没有将它们全部存储在内存中,这对于进行most_similar()或其他全语系比较的足够快速的扫描来说至关重要。)

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

(另一个可能的技巧是使用mapfile_path参数-但除非您熟悉操作系统如何处理内存映射文件,并且了解如何进一步使用/转换大型docvecs-array,对于以后的操作,这可能会带来更多的麻烦,而且还涉及性能下降,这可能仅在您的文档具有单个唯一ID标签的情况下才可以容忍,因此对mmapped文件的访问方式为总是在训练和相似性中,以相同的原始顺序搜索简单的前后负载。有关更多详细信息,请参见this answer