1

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

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

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

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

我尝试在 Github 和 Google 上查看开放和封闭的问题,但没有找到太多。

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

4

1 回答 1

1

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

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

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

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

我对此了解不多,但有一种策略是用你的大准确模型标记一堆数据,然后训练一个较小的模型来模仿大模型。我相信这被称为“知识蒸馏”。

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

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

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

于 2020-08-30T05:10:28.800 回答