Многопоточность со вкусом: нужна ли работа? - PullRequest
0 голосов
/ 15 января 2019

В этой части документации упоминается, что nlp.pipe() работает параллельно, и приводится следующий пример:

for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
    pass

После этого приводится еще один, более длинный пример, который использует joblib. Я не совсем понимаю отношения между ними. Как я понимаю из документации, если я просто хочу распараллелить токенизацию многих документов, будет работать описанный выше простой цикл for, и мне не придется использовать joblib, верно?

Мой конвейер выглядит так:

nlp = spacy.load('en', disable=['parser', 'ner', 'textcat'])

Когда мне нужно будет использовать joblib?

1 Ответ

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

На основании ответа в Spacy Github вопросов :

Мы сохранили аргумент n_threads, чтобы не нарушать код людей, но к сожалению, реализация в настоящее время не выпускает GIL, как мы это делали в v1. В v2 модель нейронной сети более сложный и более подверженный изменениям, поэтому мы его не реализовали в Cython. Мы могли бы позже.

В v2.1.0 (вы можете получить альфа, установив spacy-nightly, умножение матриц теперь однопоточное. Это делает его безопасным для запустить несколько процессов для конвейера, так что мы можем посмотреть на выполнение что внутри. Тем временем, аргумент n_threads сидит простаивает ... Что я согласен, сбивает с толку, но удаляя его и ломая обратная совместимость кажется хуже.

Итак, подведем итог: n_threads не работает в v2.1. Сейчас я использую Spacy с joblib для чтения набора данных в мини-пакетах.

Spacy выпустил пример для этого: Многопроцессорная обработка Spacy , и она отлично работает.

У меня есть набор данных с почти ~ 4M короткого текста. Без использования примера, который они выпустили, для их анализа потребовалось почти 23 часа, но, используя joblib со spacy, для завершения потребовалось полтора часа!

Чтобы сослаться на читателей этого вопроса в примере Spacy Multiprocessing: Spacy Multiprocessing

...