У меня есть два файла, 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?
Кто-нибудь может подсказать мне, как я могу сделать это быстрее? Спасибо.