Как оптимизировать объем памяти, занимаемый моделями Stanza

Я использую Stanza для получения токенов, лемм и тегов из документов на нескольких языках для целей приложения для изучения языков. Это означает, что мне нужно хранить и загружать множество моделей Stanza (по умолчанию) для разных языков.

Моя основная проблема сейчас заключается в том, что если я хочу загрузить все эти модели, требования к памяти слишком высоки для моих ресурсов. В настоящее время я развертываю веб-API под управлением Stanza NLP на AWS. Я хочу свести затраты на инфраструктуру к минимуму.

Одно из возможных решений - загружать по одной модели за раз, когда мне нужно запустить сценарий. Я предполагаю, что это означает, что каждый раз будут возникать дополнительные накладные расходы, чтобы загрузить модель в память.

Еще я попробовал использовать только те процессоры, которые мне действительно нужны, что уменьшило объем памяти, но не намного.

Я пробовал искать открытые и закрытые проблемы на Github и Google, но ничего не нашел.

Какие еще есть возможные решения?

1 ответ

Решение

Суть в том, что модель языка должна находиться в памяти во время выполнения, поэтому тем или иным способом вам нужно уменьшить модель или разрешить хранение моделей на диске. Я могу предложить несколько предложений по уменьшению размеров моделей, но имейте в виду, что уменьшение размера вашей модели, вероятно, приведет к снижению точности.

Вы можете проверить процентное соотношение языковых запросов и сохранить часто запрашиваемые языки в памяти и переходить на диск только для более редких языковых запросов.

Самая незамедлительная стратегия уменьшения размера модели - сокращение словарного запаса. Возможно, вы могли бы сократить словарный запас еще меньше и при этом добиться такой же точности. Мы проделали некоторую оптимизацию в этом направлении, но может быть больше возможностей уменьшить размер модели.

Вы можете поэкспериментировать с меньшим размером модели и встраиванием слов и получить лишь небольшое снижение точности, мы не очень активно экспериментировали с разными размерами моделей, чтобы увидеть, насколько вы теряете точность. Это означало бы переобучение модели и просто уменьшение размера внедрения и параметров размера модели.

Я мало что знаю об этом, но есть стратегия пометки кучи данных с помощью вашей большой точной модели, а затем обучение меньшей модели для имитации большой модели. Я считаю, что это называется "дистилляцией знаний".

В том же направлении вы можете пометить кучу данных с помощью Stanza, а затем обучить модель CoreNLP (которая, как я думаю, будет иметь меньший объем памяти).

Таким образом, я думаю, что проще всего было бы переобучить модель с меньшим объемом словарного запаса. Я думаю, что в настоящее время он содержит 250000 слов, и сокращение до 10000 или 50000 уменьшит размер модели, но не может сильно повлиять на точность.

К сожалению, я не думаю, что есть волшебный вариант, который вы можете выбрать, который просто решит эту проблему, вам придется переобучать модели и посмотреть, какой точностью вы готовы пожертвовать ради меньшего объема памяти.

Другие вопросы по тегам