当我在大型文本语料库上训练d2v时,我收到了以下3个文件:
doc2vec.model.trainables.syn1neg.npy
doc2vec.model.vocabulary.cum_table.npy
doc2vec.model.wv.vectors.npy
Bun最终模型尚未保存,因为磁盘上没有足够的可用空间。
OSError: 5516903000 requested and 4427726816 written
有没有一种方法可以在比所有训练时间短的时间内使用这些文件重新保存模型?
先谢谢您!
答案 0 :(得分:1)
如果模型仍在RAM中,并且在可以运行新代码的环境(如Jupyter笔记本电脑)中,则可以尝试清除空间(或附加新卷),然后尝试.save()
再次。也就是说,您不需要重新培训,只需重新保存RAM中已经存在的内容。
没有例程可以保存“只是尚未保存的内容”。因此,即使您急于从第一次训练中抢救任何东西,即使 did 保存的子文件可能也很有价值(也许通过my Word2Vec
answer here之类的过程,尽管它有些复杂) Doc2Vec
),尝试再次保存到相同的位置/卷将需要将这些现有文件移开。 (也许您可以将它们转移到远程存储中,以防万一,但是要在本地删除它们以释放空间?)
如果您尝试将文件名保存为以“ .gz”结尾的文件,gensim将尝试保存所有压缩文件,这可能会有所帮助。 (不幸的是,主向量数组的压缩效果不佳,因此仅凭此节省可能不够。)
要想在内存中缩减已经训练有素的模型,而又不破坏其某些功能,没有简单的方法。 (有很多困难的方法,但是只有在您确定可以放弃完整模型可以做的事情的情况下……而且还不清楚您是否处于这种情况。)
影响模型大小的主要因素是唯一单词的数量和唯一文档标签的数量。
在训练之前指定一个较大的min_count
将丢弃更多的低频词–而且,非常低频的词通常反而会损害模型,因此这种修整通常可以同时改善三点:更快的培训,更小的模型和更高质量的下游任务结果。
如果您使用的是普通整数doc-tag,则该模型将需要从0到最大数字的所有doc-tag整数的矢量空间。因此,即使您只训练了2个文档,如果它们具有999998
和999999
的纯正文档标签,它仍然需要为100万个标签分配(并保存)垃圾向量,0到999,999。因此,在某些情况下,由于此原因,人们的内存/磁盘使用率比预期的要高-并且使用从0
开始的连续ID或切换到基于字符串的doc-tag都会大大减小大小。 (但是,同样,必须在训练之前选择它。)