Spacy на GAE / стандарт / секунда / Python превышает память самого большого экземпляра - PullRequest
2 голосов
/ 18 марта 2019

Я использую GAE некоторое время без проблем. Единственное недавнее изменение заключается в том, что я добавил Spacy вместе с моделью, которую я обучал.

Когда я запускаю локально с dev_appserver, приложение потребляет около 153 МБ. После развертывания я получаю ошибки превышения памяти. Даже с экземпляром F4_1G я превышаю память:

Превышено ограничение жесткой памяти в 1228 МБ и 1280 МБ после обслуживания всего 0 запросов. Рассмотрите возможность установки большего экземпляра класса в app.yaml.

Развертывание работает, если я импортирую Spacy и не загружаю свою модель (у экземпляра около 200 МБ), поэтому сам Spacy не проблема, но когда я загружаю свою модель с spacy.load(), тогда объем памяти превышает предел. Обратите внимание, что это происходит еще до того, как я использую свою модель Spacy, поэтому простая загрузка модели вызывает проблему.

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

Похоже, что другие смогли запустить Spacy на движке приложения . Есть идеи, что я могу делать не так?

1 Ответ

4 голосов
/ 19 марта 2019

Мне удалось найти решение. Я загружал свою модель в переменную уровня модуля, поэтому при импорте модуля модель загружалась.

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

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

Вот пример того, чего не следует делать:

import spacy

nlp = spacy.load('my_model')

def process_text(text):
    return nlp(text)

Вместо этого сделайте это:

import spacy

nlp = None

def process_text(text):
    if nlp is None:
        nlp = spacy.load('my_model')
    return nlp(text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...