【问题标题】:Reduce fastText memory usage for big models减少大型模型的 fastText 内存使用量
【发布时间】:2022-08-23 20:44:47
【问题描述】:

我训练了一个机器学习句子分类模型,除其他特征外,该模型还使用从 7Gb 的预训练 fastText 模型(如these)获得的向量。我使用预训练的 fastText Italian 模型:我使用这个词嵌入只是为了获取一些语义特征来输入有效的 ML 模型。

我基于 fastText 构建了一个简单的 API,它在预测时计算有效 ML 模型所需的向量。在后台,此 API 接收一个字符串作为输入并调用 get_sentence_vector。当 API 启动时,它会将 fastText 模型加载到内存中。

如何减少加载到 RAM 中的 fastText 的内存占用?

约束:

  • 我的模型运行良好,训练既费时又昂贵,所以我不想使用更小的向量重新训练它
  • 我需要 fastText 能力来处理词汇外的单词,所以我不能只使用向量,但我需要完整的模型
  • 我应该减少 RAM 的使用,即使是以降低速度为代价。

目前,我开始尝试compress-fasttext...

请分享您的建议和想法,即使它们不代表完整的解决方案。

  • 您在训练 FastText 时使用了哪些参数,以及哪个 FastText 实现?为 OOV 词生成向量的能力对您来说有多重要?此外,为什么 RAM 大小最小化很重要——因为具有更多 RAM 的系统是不可能的或太昂贵,或者其他速度/性能考虑因素?
  • 谢谢@gojomo!我试图将此信息添加到更新的问题中。一个小补充:根据系统管理员施加的限制,我应该减少 RAM 的使用。
  • 谢谢!因为您需要子词信息,所以一种快速的可能性 - 只使用全词向量,甚至可能将它们缩小到最常用的词子集 - 不可用。 (它可能仍然可以通过丢弃来节省一些空间一些不太常见的词,这可能对整个系统的性能没有太大影响,特别是因为它们仍然会得到 OOV 合成的向量。但它可能需要一些自定义的模型修剪和重新保存代码,并且您希望在一些可重复的评估中检查效果。)
  • 有时人们对 RAM 的关注实际上与加载时间有关,尤其是在某些可能会定期重新加载模型的系统中(在每个请求中,或跨许多服务进程) - 但如果你真的遇到了基于一些固定/共享部署系统,您将不得不缩减使用量——或升级系统。 (考虑到 +8GB RAM 在硬件或云租赁方面都不太贵,在某些时候你可能想为此游说。交叉点,在寻找解决方法上浪费时间比更多硬件成本更高\ 've,可能比第一个假设更接近。)
  • 话虽如此,我不确定我是否能超越compress-fasttext 项目所取得的成就——我没有使用过,但在评估中看起来很有效且很彻底。 (其他可能起作用的临时性事情——丢弃现有模型的一些任意维度,其他矩阵重构为更少维度——该项目可能做得更好。)

标签: python machine-learning optimization nlp fasttext


【解决方案1】:

我的具体问题没有简单的解决方案:如果您使用 fastText 嵌入作为特征提取器,然后您想使用此嵌入的压缩版本,则必须重新训练最终分类器,因为生成的向量有些不同。

无论如何,我想给出一个普遍的答案

fastText 模型缩减

无监督模型(=嵌入)

您正在使用 Facebook 提供的预训练嵌入,或者您以无监督方式训练嵌入。格式化.bin。现在您想减少模型大小/内存消耗。

直截了当的解决方案:

  • compress-fasttext library:将 fastText 词嵌入模型压缩数量级,而不会显着影响其质量;还有几个可用的预训练压缩模型(其他有趣的压缩模型here)。

  • fastText native reduce_model:在这种情况下,您正在减少向量维度(例如从 300 到 100),因此您明显失去了表现力。

如果你有训练数据并且可以执行再训练,你可以使用 floret,一个 fastText fork by explode(Spacy 公司),它使用更紧凑的向量表示。

如果您对 fastText 表示词汇外单词的能力不感兴趣(训练期间未看到的单词),您可以使用 .vec 文件(仅包含向量而不包含模型权重)并仅选择最常见向量的一部分(例如前 200k 个单词/向量)。如果您需要将 .bin 转换为 .vec 的方法,请阅读此answer。 注意:gensim 包完全支持 fastText 嵌入(无监督模式),所以这些操作可以通过这个库来完成(更多细节在这个answer

监督模型

您使用 fastText 训练分类器,生成 .bin 模型。现在您想减少分类器大小/内存消耗。

解决方案是fastText native quantize:使用权重量化和特征选择重新训练模型。使用 retrain 参数,您可以决定是否微调嵌入。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2010-09-12
    • 2020-01-01
    相关资源
    最近更新 更多