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 压缩模型并使用它们的小版本的示例。
我正在尝试加载一个具有 .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 压缩模型并使用它们的小版本的示例。