Используйте неиспользованный потенциал вычислительной мощности вашего компьютера в программировании машинного обучения.

Это был 2004 год, и я устроился на свою первую работу после того, как закончил инженерное дело. Я всегда хотел сосредоточиться на программировании и принес свой первый рабочий стол, чтобы изучить продвинутый C++. Да, вы правильно прочитали — НАСТОЛЬНЫЙ СТОЛ, так как ноутбук в те времена был супердорогим и недосягаемым для меня. Я до сих пор помню, что это был одноядерный процессор Intel® Celeron® D 341.

Время и технологии сильно изменились, и в 2023 году я использую Mac book air 2020 года выпуска с четырехъядерным процессором Intel® i5.

В четвертом квартале 2019 года Intel выпустила процессор i9–10980XE Extreme Edition с 18 ядрами, а более мощный процессор Intel® Xeon® W-3175X имеет 28 ядер.

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

В этой статье я покажу, как время обучения модели сокращается более чем на 75% за счет использования всех ядер ЦП.

Мы будем использовать fetch_openml для получения данных Oil_spill, доступных в OpenML, и RandomForestClassifier для обучения модели. Время, необходимое для обучения модели машинного обучения с различными конфигурациями ядра ЦП, отображается с использованием библиотеки Matplotlib.

from sklearn.datasets import fetch_openml
from sklearn.ensemble import RandomForestClassifier
from time import time
from matplotlib import pyplot as plt

Из OpenML набор данных oil_spill импортировал независимую переменную в X pandas Dataframe и целевое значение в y Dataframe.

X,y= fetch_openml(name="oil_spill",
return_X_y=True,as_frame=True)

Список «timetaken» объявляется для хранения времени, прошедшего для обучения каждой модели с различными конфигурациями ЦП. В этом примере мы начнем обучение модели машинного обучения с использованием одного ядра и перейдем к четырем ядрам. Количество ядер указано в списке «n_cores» для итеративного выполнения этой задачи.

timetaken = []
n_cores = [1, 2, 3, 4]

В классификаторе случайного леса Sklean в аргументе «n_jobs» мы можем указать количество одновременных заданий, которые будут выполняться параллельно во время обучения модели, использования модели для предсказания и возврата пути решения в лесу. Значением по умолчанию параметра «n_jobs» является одно задание, и на этапе первоначального выбора модели и анализа отладка выполняется раньше с помощью одного процесса/потока. При выполнении различных действий в рабочем процессе машинного обучения, от очистки данных до точной настройки гиперпараметров, можно пропустить изменение значения «n_jobs» по умолчанию для запуска параллельных задач на разных ядрах ЦП во время обучения модели в реальном времени или использования модели. для предсказания.

В приведенном ниже коде модель обучается в итерации с использованием одного ядра/задания до четырехъядерного/задания, а время, затраченное на обучение, записывается в список «затраченное время».

for n in n_cores:
    start = time()
    model = RandomForestClassifier(n_estimators=1500,
                                   random_state=42, n_jobs=n)
    model.fit(X, y)
    end = time()
    elapsedtime = end - start
    timetaken.append(elapsedtime)

Давайте нарисуем диаграмму с количеством ядер по оси X и временем, затраченным на обучение модели с различными ядрами по оси Y.

plt.locator_params(axis="x", integer=True)
plt.xlabel("Number of CPU Cores")
plt.ylabel("Time Taken (in seconds)")
plt.plot(n_cores, timetaken)
plt.show()

Мы видим, что затраченное время резко сократилось с чуть более пяти секунд до почти одной секунды, поскольку количество одновременных заданий выполняется на нескольких ядрах во время обучения модели.

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

Совет. Если мы укажем параметр «n_jobs» как «-1», то все доступные ядра в машине используются для запуска нескольких параллельных заданий. При значении n_jobs «-2» одно ядро ​​остается свободным, а все остальные ядра используются для запуска параллельных заданий.