редактировать
Корпус поезда - это фреймворк данных Spark, который я построил перед этим шагом. Я загрузил его из формата паркета и создал класс «Feed», который передал Gensim lib итератор в корпусе поезда:
class Feed():
def __init__(self, train_data):
self.train_data = train_data
def __iter__(self):
for row in self.train_data.rdd.toLocalIterator():
yield \
gensim.models.doc2vec.TaggedDocument(\
words=[kw.lower() for kw in row["keywords"]] + list(row["tokens_filtered"]),\
tags=[row["id"]])
sdf = spark.read.parquet(save_dirname)
train_corpus = Feed(sdf)
конец править
Я хочу обучить модель Gensim Doc2Vec на ~ 9 миллионах текстовых новостных документов. Вот определение моей модели:
model = gensim.models.doc2vec.Doc2Vec(
workers=8,
vector_size=300,
min_count=50,
epochs=10)
Первый шаг - пополнение словарного запаса:
model.build_vocab(train_corpus)
Это заканчивается через 90 минут. Вот информация о регистрации в конце этого процесса:
INFO:gensim.models.doc2vec:collected 4202859 word types and 8950263 unique tags from a corpus of 8950339 examples and 1565845381 words
INFO:gensim.models.word2vec:Loading a fresh vocabulary
INFO:gensim.models.word2vec:min_count=50 retains 325027 unique words (7% of original 4202859, drops 3877832)
INFO:gensim.models.word2vec:min_count=50 leaves 1546772183 word corpus (98% of original 1565845381, drops 19073198)
INFO:gensim.models.word2vec:deleting the raw counts dictionary of 4202859 items
INFO:gensim.models.word2vec:sample=0.001 downsamples 9 most-common words
INFO:gensim.models.word2vec:downsampling leaves estimated 1536820314 word corpus (99.4% of prior 1546772183)
INFO:gensim.models.base_any2vec:estimated required memory for 325027 words and 300 dimensions: 13472946500 bytes
Затем я обучаю модель с помощью класса итератора в корпусе поезда:
model.train(train_corpus, total_examples=nb_rows, epochs=model.epochs)
Последние журналы тренировок:
INFO:gensim.models.base_any2vec:EPOCH 1 - PROGRESS: at 99.99% examples, 201921 words/s, in_qsize 16, out_qsize 0
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 7 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 6 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 5 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 4 more threads
Но он никогда не заканчивает оставшиеся потоки. Я не впервые сталкиваюсь с этой проблемой, даже при гораздо меньшем составе поездов. Обычно я перезапускаю весь процесс (настройка словарного запаса и обучение модели), и он продолжается.
К настоящему времени, чтобы сэкономить время, я хочу НЕ рассчитывать снова словарь, используя ранее успешно рассчитанный, и просто пытаться снова обучить модель. Есть ли способ сохранить только словарную часть модели, а затем загрузить ее для обучения модели непосредственно в корпусе поезда?