FastText .bin 文件无法放入内存,即使我有足够的内存

FastText .bin file cannot fit in memory, even though I have enough RAM

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

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

通过观察系统监视器,可以看到RAM和swap都被占满了,所以我认为是内存不足导致的。

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

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)

非常感谢您的帮助!

一些超出磁盘大小的扩展是预期的——尤其是当你开始执行像 most_similar() 这样的操作时。但是,如果你真的从 运行 中得到了错误,仅仅 2 行来加载模型,那么其他地方可能是错误的。

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

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

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

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

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

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

您将需要一台具有大内存的机器来压缩模型,然后您可以在任何地方使用压缩版本。 此 post 给出了如何使用 compress-fasttext 压缩模型并使用它们的小版本的示例。