【问题标题】:How to optimize memory footprint of Stanza models如何优化 Stanza 模型的内存占用
【发布时间】:2020-08-30 13:10:28
【问题描述】:

我正在使用 Stanza 从多种语言的文档中获取标记、引理和标签,用于语言学习应用程序。这意味着我需要为不同的语言存储和加载许多 Stanza(默认)模型。

我现在的主要问题是,如果我想加载所有这些模型,内存需求对我的资源来说太多了。我目前在 AWS 上部署了一个运行 Stanza NLP 的 Web API。 我希望将我的基础架构成本保持在最低水平。

一种可能的解决方案是在我需要运行脚本时一次加载一个模型。我想这意味着每次将模型加载到内存中都会有一些额外的开销。

我尝试的另一件事是使用我真正需要的处理器,这会减少内存占用,但不会减少那么多。

我尝试在 Github 和 Google 上查看未解决和已关闭的问题,但没有找到太多。

还有哪些其他可能的解决方案?

【问题讨论】:

  • 明确一点,您想在移动设备上运行 Stanza 管道并让模型适合内存吗?您的目标是 iOS 还是 Android?
  • 嘿@StanfordNLPHelp 可能我说“app”误导了你:) 我的错!它是一个网络应用程序。我的代码在 Python 脚本中运行。

标签: nlp stanford-nlp stanza


【解决方案1】:

底线是语言的模型在执行期间必须在内存中,因此您需要通过某种方式使模型更小或允许将模型存储在磁盘上。我可以提供一些使模型更小的建议,但请注意,使模型更小可能会导致精度降低。

您可以检查语言请求的百分比细分,并将经常请求的语言存储在内存中,并且仅针对稀有的语言请求进入磁盘。

减少模型大小最直接的影响策略是缩小词汇量。有可能您可以将词汇量削减得更小,但仍能获得相似的准确性。我们在这方面做了一些优化,但可能会有更多的机会减少模型尺寸。

您可以尝试使用较小的模型大小和词嵌入,但可能只会出现小幅准确度下降,我们还没有真正积极地尝试不同的模型大小来查看您损失了多少准确度。这意味着重新训练模型,只需将嵌入大小和模型大小参数设置得更小。

我对此知之甚少,但有一种策略是用你的大精确模型标记一堆数据,然后训练一个较小的模型来模仿大模型。我相信这就是所谓的“知识蒸馏”。

在类似的方向上,你可以用 Stanza 标记一堆数据,然后训练一个 CoreNLP 模型(我认为它的内存占用会更小)。

总而言之,我认为最简单的做法是重新训练具有较小词汇量的模型。我们我认为它目前有 250,000 个单词,减少到 10,000 或 50,000 个会减小模型大小,但可能不会对准确性造成太大影响。

不幸的是,我认为没有什么神奇的选项可以解决这个问题,你必须重新训练模型,看看你愿意牺牲什么样的准确度来降低内存占用。

【讨论】:

  • 是否可以使用 mmap 加载模型?这将加快加载速度并最大限度地减少内存使用量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多