Как оптимизировать объем памяти, занимаемый моделями Stanza
Я использую Stanza для получения токенов, лемм и тегов из документов на нескольких языках для целей приложения для изучения языков. Это означает, что мне нужно хранить и загружать множество моделей Stanza (по умолчанию) для разных языков.
Моя основная проблема сейчас заключается в том, что если я хочу загрузить все эти модели, требования к памяти слишком высоки для моих ресурсов. В настоящее время я развертываю веб-API под управлением Stanza NLP на AWS. Я хочу свести затраты на инфраструктуру к минимуму.
Одно из возможных решений - загружать по одной модели за раз, когда мне нужно запустить сценарий. Я предполагаю, что это означает, что каждый раз будут возникать дополнительные накладные расходы, чтобы загрузить модель в память.
Еще я попробовал использовать только те процессоры, которые мне действительно нужны, что уменьшило объем памяти, но не намного.
Я пробовал искать открытые и закрытые проблемы на Github и Google, но ничего не нашел.
Какие еще есть возможные решения?
1 ответ
Суть в том, что модель языка должна находиться в памяти во время выполнения, поэтому тем или иным способом вам нужно уменьшить модель или разрешить хранение моделей на диске. Я могу предложить несколько предложений по уменьшению размеров моделей, но имейте в виду, что уменьшение размера вашей модели, вероятно, приведет к снижению точности.
Вы можете проверить процентное соотношение языковых запросов и сохранить часто запрашиваемые языки в памяти и переходить на диск только для более редких языковых запросов.
Самая незамедлительная стратегия уменьшения размера модели - сокращение словарного запаса. Возможно, вы могли бы сократить словарный запас еще меньше и при этом добиться такой же точности. Мы проделали некоторую оптимизацию в этом направлении, но может быть больше возможностей уменьшить размер модели.
Вы можете поэкспериментировать с меньшим размером модели и встраиванием слов и получить лишь небольшое снижение точности, мы не очень активно экспериментировали с разными размерами моделей, чтобы увидеть, насколько вы теряете точность. Это означало бы переобучение модели и просто уменьшение размера внедрения и параметров размера модели.
Я мало что знаю об этом, но есть стратегия пометки кучи данных с помощью вашей большой точной модели, а затем обучение меньшей модели для имитации большой модели. Я считаю, что это называется "дистилляцией знаний".
В том же направлении вы можете пометить кучу данных с помощью Stanza, а затем обучить модель CoreNLP (которая, как я думаю, будет иметь меньший объем памяти).
Таким образом, я думаю, что проще всего было бы переобучить модель с меньшим объемом словарного запаса. Я думаю, что в настоящее время он содержит 250000 слов, и сокращение до 10000 или 50000 уменьшит размер модели, но не может сильно повлиять на точность.
К сожалению, я не думаю, что есть волшебный вариант, который вы можете выбрать, который просто решит эту проблему, вам придется переобучать модели и посмотреть, какой точностью вы готовы пожертвовать ради меньшего объема памяти.