Внутри ИИ

Используйте многоядерность для повышения производительности в Scikit-Learn

Объем доступных данных растет в геометрической прогрессии с развитием Интернета вещей, датчиков и возможностей хранения.

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

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

Scikit-learn не поддерживает графический процессор, такой как Keras или TensorFlow, но мы можем использовать многоядерный процессор для параллельного выполнения нескольких задач.

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

В этой статье мы будем использовать набор данных «Вулканы», чтобы понять процесс параллельного выполнения задач в Sckit-learn.

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

В приведенном ниже коде набор данных «вулканы» извлекается из openml.

X,y= fetch_openml(name="volcanoesb3",version=1,
return_X_y=True,as_frame=True)

Время, затраченное на обучение каждой модели, будет сохранено в списке «затраченное время». У меня четырехъядерный ноутбук, поэтому я буду тренировать модель машинного обучения с максимум четырьмя ядрами. Если у вас восьмиядерный или более ядер, вы можете указать «n_cores» до восьми или более ядер.

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

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

Мы можем указать количество заданий, которые будут запускаться параллельно с параметром «n_jobs» в RandomForestClassifier. В случае, если мы хотим использовать все доступные ядра, мы можем указать «n_jobs» как «-1».

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)

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

plt.plot(n_cores, timetaken)
plt.show()

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

Обучение модели с одноядерным процессором заняло около 22 секунд, и оно упало до прибл. ~ 11 секунд с тремя ядрами.

Заключение и вывод

Объем доступных данных растет в геометрической прогрессии с развитием Интернета вещей, датчиков и возможностей хранения.

GPU и TPU - это своего рода спасители для ускорения обработки и повышения производительности алгоритмов машинного обучения.

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

Даже с четырехъядерными и восьмиядерными ноутбуками мы можем значительно сократить время обработки машинного обучения.

Вы можете узнать больше о Линейная регрессия в Python: Sklearn vs Excel