Как избежать перезагрузки модели ML каждый раз, когда я вызываю скрипт python? - PullRequest
2 голосов
/ 05 апреля 2020

У меня есть два файла, file1.py, которые имеют размер модели ML 1 ГБ, и file2.py, который вызывает метод get_vec() из файла file1 и получает векторы взамен. ML model загружается каждый раз, когда вызывается метод file1 get_ve c (). Здесь требуется много времени (около 10 секунд) для загрузки модели с диска.

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

Пример кода выглядит следующим образом:

# File1.py

import spacy
nlp = spacy.load('model')

def get_vec(post):
    doc = nlp(post)
    return doc.vector

File2.py

from File1 import get_vec

df['vec'] = df['text'].apply(lambda x: get_vec(x))

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

Обновление 1:

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

import spacy
import redis

nlp = spacy.load('en_core_web_lg')
r = redis.Redis(host = 'localhost', port = 6379, db = 0)
r.set('nlp', nlp)

Выдает ошибку

DataError: Invalid input of type: 'English'. Convert to a bytes, string, int or float first.

Кажется, type(nlp) равен English() и его необходимо конвертировать в подходящий формат. Поэтому я попытался использовать рассол, чтобы преобразовать его. Но опять же, pickle отнимает много времени на кодирование и декодирование. Есть ли способ сохранить это в Redis?

Кто-нибудь может подсказать мне, как я могу сделать это быстрее? Спасибо.

Ответы [ 5 ]

2 голосов
/ 06 апреля 2020

Вот как это сделать

Шаг 1) создайте функцию в python и загрузите вашу модель в эту функцию

model=None
def load_model():

    global model
    model = ResNet50(weights="imagenet")

, если вы внимательно наблюдаете за первой назначенной мне переменной model Нет. Затем внутри функции load_model я загрузил модель.

Также я убедился, что переменная model сделана глобальной, чтобы к ней можно было получить доступ извне этой функции. Интуиция здесь - мы загружаем объект модели в глобальную переменную. Так что мы можем получить доступ к этой переменной в любом месте кода.

Теперь, когда у нас есть готовые инструменты (т. Е. Мы можем получить доступ к модели из любого места в этом коде), мы можем заморозить эту модель в оперативной памяти вашего компьютера. Это делается:

if __name__ == "__main__":
    print(("* Loading Keras model and Flask starting server..."
        "please wait until server has fully started"))
    load_model()
    app.run()

Теперь, что такое использование модели замораживания в оперативной памяти без ее использования. Поэтому, чтобы использовать его, я использую запрос POST в flask

@app.route("/predict", methods=["POST"])
def predict():

    if flask.request.method == "POST":

            output=model.predict(data)  #what you want to do with frozen model goes here

Так что, используя этот трюк, вы можете заморозить модель в ОЗУ, получить к ней доступ с помощью глобальной переменной. а затем используйте его в своем коде.

1 голос
/ 06 апреля 2020

Если весь ваш синтаксис правильный, то это не должно загружать модель более одного раза. (Только в конструкторе класса ml)

# File1.py

import spacy
class ml:
   def __init__(self, model_path):
       self.nlp = spacy.load(model_path) # 'model'
   def get_vec(self, post):
       return self.nlp(post).vector


# File2.py

from File1 import ml

my_ml = ml('model') # pass model path

df['vec'] = df['text'].apply(lambda x: my_ml.get_vec(x))

1 голос
/ 06 апреля 2020

Использование Flask. Посмотрите, как этот пользователь пытался реализовать здесь: Простое Flask приложение, использующее spaCy NLP, периодически зависает

Отправьте данные фрейма данных на ваш Flask через HTTP-запрос. Или вы можете сохранить как файл и отправить файл на сервер.

Просто загрузите модель в глобальную переменную и используйте переменную в коде приложения.

0 голосов
/ 06 апреля 2020

Ваша проблема мне не ясна. nlp = spacy.load('model') эта строка выполняется только один раз в данном коде во время импорта. Поскольку каждый вызов get_vec не загружает модель, даже если для вызова get_vec требуется 10-12 секунд на вызов, в вашем случае ничего не поделаешь.

0 голосов
/ 06 апреля 2020

Сохраните модель после обучения.
И начните использовать python в качестве языка объектно-ориентированного программирования, а не языка сценариев.

...