如何优化 Stanza 模型的内存占用

How to optimize memory footprint of Stanza models

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

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

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

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

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

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

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

您可以检查语言请求的百分比细目分类,并将经常请求的语言存储在内存中,只为较少的语言请求转到磁盘。

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

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

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

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

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

不幸的是,我不认为有一个神奇的选项可以 select 来解决这个问题,你将不得不重新训练模型,看看你愿意为更低的精度牺牲什么样的精度内存占用。