В науке о данных наличие большого количества данных - это и подарок, и проклятие. В то время как наличие большего количества данных обычно означает, что мы получим модель, которая работает лучше, наличие большего количества данных означает, что обучение модели займет больше времени. Ваш компьютер может впечатлять, но в нем нет ничего волшебного. Чем больше вы просите компьютер сделать, тем больше времени это займет. Часто вам нужно учитывать это в своем рабочем процессе. К счастью, есть несколько уловок, которые помогут ускорить этот процесс.

Я надеюсь, что это первая публикация из серии статей, в которых я расскажу о некоторых разработанных способах преодоления проблем, связанных с обработкой больших объемов данных; так что вы можете сократить время, необходимое для перехода от необработанных данных к аналитическим данным. В этих сообщениях я затрону широкий круг тем, от обучающих моделей в облаке с помощью графических процессоров , до распределенных алгоритмов. Я надеюсь, что никого не отпугну, слишком глубоко погрузившись в сорняки. Вместо этого я надеюсь предоставить простые решения, которые помогут ускорить ваш рабочий процесс. Для начала мы упростим задачу, сосредоточив внимание на инструменте, который (вероятно) есть у вас на собственном компьютере: многоядерном процессоре.

Чтобы облегчить обсуждение многоядерной обработки, давайте начнем с аналогии: многозадачность. Так же, как вы можете одновременно играть в игры на своем телефоне, смотреть телевизор и разговаривать с другом; Ваш компьютер также может выполнять несколько разных задач одновременно. Не беспокойтесь о исследованиях, которые показывают, что многозадачность - это то, с чем люди не очень хорошо справляются; потому что ваш компьютер вполне способен выполнять несколько задач одновременно. Хотя у вас только один мозг, которому нужно время, чтобы переключаться между несколькими задачами, мозг вашего компьютера, процессор , часто состоит из нескольких небольших процессоров; каждый из которых может одновременно сосредоточиться на другой задаче. Эти меньшие по размеру процессоры являются ядрами в многоядерной обработке.

Наличие нескольких ядер - это то, что позволяет вашему компьютеру выполнять несколько задач одновременно. При выполнении процесса ваш компьютер определит задачи, которые могут выполняться независимо друг от друга, и попытается разделить эти подпроцессы между несколькими ядрами. Таким образом ваш компьютер сможет ускорить обработку. Это то, чем мы воспользуемся, чтобы существенно сократить время, необходимое для обучения наших моделей.

Единственная проблема, с которой мы сталкиваемся, заключается в том, что назначение задач различным ядрам происходит за кулисами, и по умолчанию ваш компьютер будет хранить программу python, которую вы запускаете вместе, на одном ядре. Чтобы обойти это, нам нужно указать нашему компьютеру разделить рабочую нагрузку. Мы сделаем это с помощью параметра n_jobs при создании многих моделей SciKit-Learn.

Устанавливая n_jobs, вы сообщаете SciKit-Learn, сколько ядер вы хотите использовать при запуске модели. По умолчанию njobs равно 1, что означает, что вся обработка будет выполняться на одном ядре. Передавая ему другое целочисленное значение, вы говорите модели использовать это количество ядер. Однако, прежде чем мы приступим к построению каких-либо моделей, давайте проверим, сколько ядер у наших компьютеров. Для этого в macOS откройте терминал и используйте следующую команду.

sysctl -n hw.ncpu

В результате вы узнаете, сколько ядер доступно на вашем компьютере. Для моего компьютера это 8. Теперь, хотя вы можете передать модель njobs=8 для использования всех 8 ядер, но вы часто собираетесь передать значение -1. Это говорит модели использовать все доступные ядра.

Но сколько времени мы сэкономим, перейдя с 1 до 8 ядер?

Чтобы оценить экономию времени, которую вы получаете от перехода на многоядерную обработку, я подготовил к этой статье блокнот, который можно найти здесь. Я рекомендую разветвить репо и код вместе с оставшейся частью статьи. Для этой оценки мы построим Случайные классификаторы Форреста, которые будут передавать значения от 1 до 8 для n_jobs. Мы посмотрим на среднее время, необходимое для запуска наборов данных разного размера во всех классификаторах, и посмотрим, как они будут сравниваться.

Мы будем использовать данные банковского маркетинга из Португалии из Репозитория машинного обучения Калифорнийского университета в Ирвине. Однако я уже очистил данные, поэтому сделаю очищенную версию доступной в репо. Однако это не очень большой набор данных, поэтому нам придется сгенерировать больше данных путем начальной загрузки. Для этого напишем простую функцию.

Это сгенерирует для нас выборку размером n. С этими данными нам понадобится способ проверить производительность нашей модели. Мы напишем еще одну быструю функцию для ее запуска, используя функцию cross_validate() из sklearn.

Это вернет среднее время, необходимое для соответствия нашей модели более чем k сгибами. Теперь нам нужна функция для оценки нашей модели. Для этого нам нужно создать экземпляры моделей для каждого из наших значений n_jobs, а также для всех размеров выборки n. Все это делается в следующей функции оценки.

Вместо того, чтобы требовать от вас найти и передать количество ядер вашего компьютера, я использовал функцию

os.cpu_count()

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

Наконец, после того, как мы проведем нашу оценку, нам нужно будет сравнить наши модели. Самый простой способ сделать это - просто построить их график с помощью этой функции.

Я провел оценку до размера выборки 250 000 с длиной шага 10 000. После построения графика преимущества многоядерной обработки сразу стали очевидны.

Просто взглянув на график, мы можем увидеть, что при размере выборки 250 000 с использованием только одного ядра - помните, что это значение по умолчанию - обучение модели занимает в 3 раза больше времени! Столь большую выборку сложно даже назвать «большими данными», но даже здесь разница во времени весьма заметна. Мы также видим, что эта разница растет; поэтому по мере того, как наш набор данных становится больше, экономия времени, которую мы получаем от многоядерной обработки, становится больше. Следует отметить еще несколько интересных моментов.

Поскольку в моделях действительно используется несколько ядер, мы видим, что те, в которых используется меньше ядер, начинают замедляться по мере увеличения размеров выборки. При этом модели работают на 4-8 ядрах, и все они работают примерно одинаково до размера выборки 250 000. Было бы интересно запустить это в течение более длительных периодов времени и посмотреть, где время выполнения моделей начинает расходиться. Что более интересно, так это то, что происходит с меньшими выборками.

Вы были бы прощены, если бы не заметили, что при очень низких значениях n кажется, что одноядерная модель превосходит модели, использующие несколько ядер! Чтобы лучше рассмотреть это, я перезапустил программу, но установил максимальный размер выборки 20 000 с длиной шага 1000. Вот что мы видим.

Только после 13 000 наблюдений многоядерные модели работают быстрее, чем одноядерные. Поскольку распределение подпроцессов по разным ядрам связано с расходами, при небольших размерах выборки не стоит распределять процесс по ядрам. При этом время, которое вы экономите здесь, довольно незначительно, когда дело доходит до обучения ваших моделей. Чаще всего параметр n_jobs позволяет сэкономить значительное время, когда дело доходит до обучения моделей, особенно когда вы работаете с большим объемом данных. Есть пара проблем.

Установка n_jobs=-1 каждый раз при создании экземпляра модели SciKit-Learn - не панацея. Не все модели имеют эту возможность, потому что алгоритмы, на которых они основаны, нельзя разделить между ядрами вашего компьютера. Такие модели, как Support Vector Machines, не имеют подпроцессов, которые можно запускать независимо. Это означает, что вы всегда будете застрять на этой верхней кривой времени выполнения, и по мере увеличения количества наблюдений, которые у вас есть, может потребоваться слишком много времени для выполнения. Однако, если у вас так много данных, возникает другая проблема: вы можете делать со своим компьютером только так много. Чтобы иметь дело с действительно большими данными, нам нужно перейти в облако ...