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

问题描述

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

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

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

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

我尝试查看Github和Google上的未解决和未解决的问题,但是发现不多。

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

解决方法

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

您可以检查语言请求的细分百分比,然后将常见请求的语言存储在内存中,而仅将磁盘用于罕见的语言请求。

减小模型大小的最直接的影响策略是缩小词汇量。您有可能将词汇量切得更小,而获得的准确度仍然差不多。我们已经在这方面做了一些优化,但是可能会有更多的机会来缩小模型尺寸。

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

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

在类似的方向上,您可以使用Stanza标记一堆数据,然后训练CoreNLP模型(我认为该模型的内存占用量较小)。

总而言之,我认为最简单的方法是重新训练词汇量较小的模型。我认为目前它有25万个字,将其减少到10,000或50,000将减小模型的大小,但可能不会严重影响准确性。

不幸的是,我认为没有一个可以解决这个问题的神奇选择,您必须重新训练模型,并查看为降低内存占用空间而愿意牺牲的精度。