python - FastText .bin 文件无法放入内存,即使我有足够的 RAM
问题描述
我正在尝试加载一个具有 .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)
我将衷心感谢您的帮助!
解决方案
超出磁盘大小的扩展是预期的——尤其是当您开始执行诸如most_similar()
. 但是,如果您真的因为仅运行 2 行代码来加载模型而遇到该错误,则可能是其他问题。
您可能想尝试非wrappers
gensimFastText
实现——from gensim.models import FastText
在最新的 gensim 中,以防万一您使用的版本存在额外的内存问题。
(您可能还想检查使用原始编译的 Facebook FastText 实现是否可以加载文件,并显示类似的内存使用情况。)
我不知道有任何直接的方法可以缩小现有的 FastText 模型。(如果您使用自己的数据训练模型,则有许多预训练初始化选项可能会导致模型更小。但这些限制对于已训练的模型没有意义。)
如您所见,Facebook 仅对监督模型实施了“量化”技巧——即使这种转换可以应用于更多模式,支持的 gensim 代码也需要额外的更新才能理解更改后的模型。
如果您可以加载一次,在完整(非wrappers
)gensim 实现中,将所有包含的向量截断为较低维度以显着节省 RAM,然后重新保存模型可能是切实可行的。但考虑到这些已经只是 100 维向量,这可能会在表现力上花费很多。
推荐阅读
- java - Firebase - 获取登录用户的详细信息并在另一个活动中注销用户
- java - 有没有办法禁用 Safari Webdriver Glass Pane
- azure-sql-database - 使用 ADF 如何将 Cosmos DB 的每条记录作为完整的 JSON 单独复制到 Azure SQL 表中的单个列中
- regular-language - 如何证明无限状态自动机可以接受任意语言
- configuration - Svelte3/sapper/rollup 从编译中排除文件模式
- spring-boot - 是否可以在一个控制器类中使用一个@postmapping 获得具有不同字段的多个 pojo 类
- rust - 如何使用 Tokio 编写异步方法?
- python - SKlearn 分类器的诅咒
- parsing - 如何为 select sql 语句编写语法?
- c++ - 在一台 PC 中执行 GUI,在其他 PC 中执行进程