【问题标题】:FastText .bin file cannot fit in memory, even though I have enough RAMFastText .bin 文件无法放入内存,即使我有足够的 RAM
【发布时间】:2019-10-16 07:10:25
【问题描述】:

我正在尝试加载一个具有 .bin 文件形式的 FastText 预训练模型。 .bin 文件的大小为 2.8GB,我有 8GB RAM 和 8GB 交换文件。不幸的是,模型开始加载并占用了将近 15GB,然后它因以下错误而中断:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

通过观察系统监视器,我可以看到 RAM 和 swap 都被完全占用了,所以我认为它会因为内存不足而中断。

我正在尝试使用 Gensim 包装器为 FastText 加载文件

from gensim.models.wrappers import FastText model = FastText.load_fasttext_format('../model/java_ftskip_dim100_ws5')


我的问题如下:

1) 有没有办法让这个模型适合我系统的当前内存?

2) 是否可以减小此模型的尺寸?我尝试使用以下代码进行量化

./fasttext quantize -output java_ftskip_dim100_ws5 -input unused_argument.txt

我收到以下错误:

terminate called after throwing an instance of 'std::invalid_argument' what(): For now we only support quantization of supervised models Aborted (core dumped)

非常感谢您的帮助!

【问题讨论】:

    标签: python gensim fasttext


    【解决方案1】:

    预计会出现超出磁盘大小的扩展——尤其是当您开始执行most_similar() 之类的操作时。但是,如果你真的因为仅仅运行 2 行来加载模型而遇到了这个错误,那么可能还有其他问题。

    您可能想在最新的 gensim 中尝试非wrappers gensim FastText 实现 - from gensim.models import FastText,以防您使用的版本出现额外的内存问题。

    (您可能还想检查使用原始编译的 Facebook FastText 实现是否可以加载文件,并显示类似的内存使用情况。)

    我不知道有任何直接的方法可以缩小现有的 FastText 模型。 (如果您使用自己的数据训练模型,则有许多预训练初始化选项可能会导致模型更小。但这些限制对于已训练的模型没有意义。)

    如您所见,Facebook 仅对监督模型实施了“量化”技巧——即使该转换可以应用于更多模式,支持的 gensim 代码也需要额外更新才能理解更改后的模型.

    如果您可以加载一次,在完整的(非wrappers)gensim 实现中,将所有包含的向量截断为较低维度以显着节省 RAM,然后重新保存模型可能是切实可行的。但考虑到这些已经只是 100 维向量,这可能会在表现力上花费很多。

    【讨论】:

    • 我尝试使用最新版本和您建议的型号,效果很好。我现在记忆力没有任何问题。非常感谢您的帮助!:)
    【解决方案2】:

    在 Facebook 的原始 fastText 库中,模型量化仅支持监督(分类器)模型。但是,我创建了一个包 compress-fasttext,它是 gensim 的包装器。它可以使用剪枝和乘积量化将 fastText 模型压缩几个数量级,而下游任务的质量损失可以忽略不计。

    您将需要一台具有大 RAM 的机器来压缩模型,然后您可以在任何需要的地方使用压缩版本。 This post 举例说明了如何使用 compress-fasttext 压缩模型并使用它们的小版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多