Как исправить медленную производительность на больших наборах данных с помощью spaCy (nlp.pipe) для предварительной обработки - PullRequest
1 голос
/ 30 июня 2019

У меня возникла проблема с spaCy 2.1, из-за которой у меня ушло очень много времени на предварительную обработку некоторых текстов на английском и немецком языках, чтобы я мог использовать их в проекте, связанном с машинным переводом. После краткой очистки с помощью регулярных выражений я использую функцию spaCy nlp.pipe (), чтобы выполнить несколько процессов (лемматизация, пометка каждого слова частями речи и разбиение составных слов на немецком языке [который я разработал сам]), но проблема в том, что это занимает много времени, и мне интересно, есть ли лучший подход, который бы ускорил процесс.

Набор данных, который я использую, очень большой: он состоит из электронных книг Project Gutenberg на английском и немецком языках, а также подборки новостных статей на обоих языках и всей базы данных Википедии для обоих языков. Я выполняю этот код в сетке HPC моего колледжа, где я могу выделить до 40 процессорных ядер и 250 ГБ ОЗУ для каждой работы или выбор графических процессоров NVIDIA вплоть до RTX 2080 Ti. Независимо от того, какую комбинацию я пробую, кажется, что требуется несколько дней, чтобы пройти даже стадию лемматизации для каждого текста.

Я пытался использовать joblib, чтобы ускорить процесс, пытаясь использовать больше ядер, а также использовать многопроцессорность, чтобы сделать то же самое. Ни один из них, похоже, не имеет такого большого эффекта. Я также попытался изменить размер партии безрезультатно.


    clean_en_texts_step1 = [cleaning(doc) for doc in NLP_EN.pipe(en_texts, batch_size=100)]
    clean_en_texts = [tag_pos(doc) for doc in NLP_EN.pipe(clean_en_texts_step1, batch_size=100)]
    clean_de_texts_step1 = [cleaning(doc) for doc in NLP_DE.pipe(de_texts, batch_size=100)]  
    compound_split = [split_compound_pipe(doc) for doc in NLP_DE.pipe(clean_de_texts_step1, batch_size=100)]        
    clean_de_texts = [tag_pos(doc) for doc in NLP_DE.pipe(compound_split, batch_size=100)]

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

1 Ответ

0 голосов
/ 03 июля 2019

Я советую использовать многопроцессорность вверху nlp.pipe, как это представлено здесь https://spacy.io/usage/examples#multi-processing. К сожалению, из-за проблем с GIL и многопоточности в Python устаревание nlp.pipe(n_threads=xxx) n_threads устарело (https://spacy.io/api/language#pipe).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...