Многопроцессорная Scikit-Learn

Я получил linearsvc, работающий против тренировочного набора и тестового набора, используяload_file Метод, который я пытаюсь заставить его работать на многопроцессорной среде.

Как я могу получить многопроцессорную работу наLinearSVC().fit() LinearSVC().predict()? Я еще не очень знаком с типами scikit-learn.

Я также думаю о разделении семплов на несколько массивов, но я не знаком с массивами numpy и структурами данных scikit-learn.

Делая это, вам будет легче поместить в multiprocessing.pool (), при этом разбить сэмплы на куски, обучить их и объединить обученные наборы позже, сработает ли это?

РЕДАКТИРОВАТЬ: Вот мой сценарий:

скажем, у нас есть 1 миллион файлов в обучающем семпле, когда мы хотим распределить обработку Tfidfvectorizer на несколько процессоров, мы должны разделить эти семплы (для моего случая это будет только две категории, поэтому, скажем, 500000 семплов для обучения) , Мой сервер имеет 24 ядра с 48 ГБ, поэтому я хочу разбить каждую тему на количество кусков 1000000/24 и обработать на них Tfidfvectorizer. Таким образом, я бы сделал тестирование набора образцов, а также SVC.fit () и решил (). Имеет ли это смысл?

Благодарю.

PS: Пожалуйста, не закрывайте это.

 Qnan25 окт. 2012 г., 17:59
Понимаю. Вы упомянули только тестирование, поэтому я был удивлен. Как только модель обучена, решение может быть принято для каждого образца в тестовом наборе независимо, так что это хорошо распараллеливается. Однако обучение - это совсем другое - распараллеливание обучения SVM отнюдь не тривиально, и, насколько мне известно, scikit-learn не делает этого.реализовать это.
 ogrisel26 окт. 2012 г., 11:20
Tfidfvectorizer не распараллеливается в случае центральной лексики. Нам либо нужен общий словарь (например, с помощью сервера redis в кластере), либо мы реализуемHashVectorizer это еще не существует.
 Phyo Arkar Lwin25 окт. 2012 г., 14:32
Что делать, если я собираюсь сделать это на 21 миллион документов? Это займет много времени?
 Qnan25 окт. 2012 г., 15:37
Я неЯ думаю, я понял твой вопрос. Образцыявляются независимый. Почему вы должны что-то комбинировать?
 Phyo Arkar Lwin25 окт. 2012 г., 16:49
скажем, у нас есть 1 миллион файлов в обучающем семпле, когда мы хотим распределить обработку Tfidfvectorizer на несколько процессоров, мы должны разделить эти семплы (для моего случая это будет только две категории, поэтому, скажем, 500000 семплов для обучения) , Мой сервер имеет 24 ядра с 48 ГБ, поэтому я хочу разбить каждую тему на количество кусков 1000000/24 и обработать на них Tfidfvectorizer. Таким образом, я бы сделал тестирование набора образцов, а также SVC.fit () и решил (). Имеет ли это смысл?
 Phyo Arkar Lwin25 окт. 2012 г., 16:50
поэтому для этих разделений выборок мне нужно рекомбинировать в конце многопроцессорной обработки, чтобы вернуться к тренировочным наборам.
 John Peter Thompson Garcés27 дек. 2012 г., 23:20
Каков статус хеширующего векторизатора? Я также хотел бы иметь возможность использовать joblib.Parallel для векторизации.
 Phyo Arkar Lwin25 окт. 2012 г., 14:39
Я тоже думаю о разных сэмплах, можно ли объединить разные сэмплы после разделения их для каждого процесса?
 Qnan25 окт. 2012 г., 14:16
Поправь меня, если яЯ не прав, но SVM обычно нене займет много времени, чтобы принять решение. Возможно, имеет смысл выполнить параллельное декодирование для разных выборок, а не распараллеливать декодирование для одной выборки.
 Phyo Arkar Lwin03 апр. 2013 г., 19:53
Я вижу некоторый запрос на 14.0 github относительно параллели. У меня нету нас еще не было возможности проверить это, потому что мы уже находимся в разработке с использованием 13.0

Ответы на вопрос(2)

Решение Вопроса

Я думаю, что использование SGDClassifier вместо LinearSVC для такого рода данных было бы хорошей идеей, поскольку это намного быстрее. Для векторизации я предлагаю вам посмотреть вхэш-трансформер PR.

Для многопроцессорной обработки: вы можете распределить наборы данных по ядрам, сделатьpartial_fit, получить векторы весов, усреднить их, распределить их по оценкам, сделать частичную подгонку снова.

Проведение параллельного градиентного спуска является областью активного исследования, поэтому там нет готового решения.

Сколько классов у вас есть данные? Для каждого класса будет обучаться отдельный (автоматически). Если у вас почти столько же классов, сколько ядер, может быть лучше и намного проще сделать один класс на ядро, указавn_jobs в SGDClassifier.

 Phyo Arkar Lwin26 окт. 2012 г., 16:55
Там будет только 3 класса. SGDClassifer так же точен, как и LinearSVC? Я проверю это вокруг.

Для линейных моделей (,,LinearSVCSGDClassifierPerceptron...) вы можете разделять свои данные на части, обучать независимые модели для каждого блока и строить совокупную линейную модель (например,SGDClasifierвклеивая в него средние значенияcoef_ а такжеintercept_ в качестве атрибутов.predict метод , ,LinearSVCSGDClassifierPerceptron вычислить ту же функцию (линейное прогнозирование с использованием точечного произведения сintercept_ Порог и Один против Всей поддержки мультикласса), поэтому конкретный класс модели, который вы используете для хранения среднего коэффициента, не важен.

Однако, как уже говорилось ранее, сложная задача заключается в распараллеливании извлечения функций, и текущее scikit-learn (версия 0.12) не позволяет легко это сделать.

редактировать: scikit-learn 0.13+ теперь имеет векторизатор хэширования, который не содержит состояний.

 ogrisel02 нояб. 2012 г., 21:23
Пожалуйста, используйтеjoblib.Parallel а не многопроцессорные циклы напрямую (см., например, другое использование в исходном коде scikit-learn). AFAIK, мы пытались распараллелить такие внутренние циклы, но накладные расходы не делают это интересным на этом уровне.
 ogrisel31 окт. 2012 г., 16:25
 Phyo Arkar Lwin31 окт. 2012 г., 16:14
Ic, если я хочу внести свой вклад, с чего мне начать?
 ogrisel27 окт. 2012 г., 18:23
Да, это известное ограничение scikit-learn. Эффективное распараллеливание извлечения текстовых объектов с использованием векторизатора хеширования занимает первое место в моем личном списке приоритетов, но сейчас у меня есть еще более высокие приоритеты :)
 Phyo Arkar Lwin01 нояб. 2012 г., 17:31
Большое спасибо . Я буду смотреть в него. На самом деле я также заглянул в Count Vectorizer и увидел несколько мест, где может работать мультипроцессор. Я уже думаю о том, чтобы поместить в некоторые циклы стандартный python multiprocessing.pool (). такие как: _word_ngrams (), _char_wb_ngrams () методы даже без использования хеширующего векторизатора
 Phyo Arkar Lwin06 нояб. 2012 г., 16:17
Я буду смотреть в него. К вашему сведению, у меня есть вопрос по извлечению функций из каждого файла (я хочу показать 10 лучших терминов из каждого файла в наборе тестовых данных):stackoverflow.com/q/13181409/200044
 Phyo Arkar Lwin06 нояб. 2012 г., 16:01
я с, у меня нет опыта работы joblib. Параллельно и не уверен насчет его производительности (и стабильности).
 Phyo Arkar Lwin26 окт. 2012 г., 16:59
Спасибо человек, я посмотрю проверить это. так что Tfidfvectorizer еще не парализуем, не так ли? и извлечение функций занимает больше всего времени на наших тестах.
 ogrisel31 окт. 2012 г., 16:24
Если вы хотите добавить векторизатор хэширования текста, вам сначала нужно ознакомиться с существующимCountVectorizer реализация путем чтения его исходного кода и исходного кода связанных файлов. Тогда прочитайте следующую статьюКилиан Вайнбергер, Анирбан Дасгупта, Джон Лэнгфорд, Алекс Смола, Джош Аттенберг, Хеширование функций для крупномасштабного многозадачного обучения, ICML 2009, тогда посмотрите на этозапрос на вывод хэш-трансформатора это тесно связано, но не векторизация хэширования текста.

Ваш ответ на вопрос