Как стать автором
Обновить

Патч от Intel для ускорения алгоритмов библиотеки scikit-learn

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров3.5K

Уведомление о возможности ускорить работу появляется при установке scikit-learn, поэтому пишу для тех, кто давно не переустанавливал эту библиотеку.

Подробное описание ускорителя – по ссылке https://intel.github.io/scikit-learn-intelex/

Ниже перечислил важные моменты и результаты испытаний по повышению производительности.

Установка

Устанавливать можно с помощью pip или conda. Важный момент: ускоритель пока не работает с версиями python 3.10 и новее, поэтому лучше ставить в окружение с версией 3.9. Например, так:

conda create -n env python=3.9 scikit-learn-intelex

Сама библиотека scikit-learn при этом устанавливается автоматически.

Работа с GPU поддерживается.

Использование

Предусмотрено несколько вариантов применения «заплатки». Например, при запуске своего приложения без изменения его кода:

python -m sklearnex my_application.py

Второй вариант – подключать ускоритель внутри приложения. В этом случае можно применять и отменять заплатку.

Важно загружать запускать ускоритель до загрузки самой библиотеки:

from sklearnex import patch_sklearn

patch_sklearn()

from sklearn import…

Если нужно отменить, то после отмены снова загружаем sklearn:

sklearnex.unpatch_sklearn()

from sklearn import …

Ограничения

У некоторых алгоритмов есть ограничения на используемые гиперпараметры, но, по-моему, это больших проблем создать не должно. например, у RandomForestClassifier в качестве критерия можно использовать только gini.

Полный список ограничений: https://intel.github.io/scikit-learn-intelex/algorithms.html

Тест на скорость

По информации разработчика возможно ускорение в десятки даже сотни раз (https://intel.github.io/scikit-learn-intelex/acceleration.html).

Для своего теста на скорость взял набор данных (42100 строк, 18 столбцов) по отмене бронирования в гостиницах из соревнования на Kaggle (https://www.kaggle.com/competitions/playground-series-s3e7).

Классификатор – RandomForestClassifier. Подбор гиперпараметров с помощью GridSearchCV.

Метрика – ROC AUC на кросс-валидации (cv=5).

Для корректности сравнения во всех случаях в классификаторе задавал n_jobs=-1, в поиске по сетке n_jobs=1. GPU не использовал.

Сетка гиперпараметров:

{

    'n_estimators': [1500, 2000, 2500],

    'max_depth': [25, 50, 100],

    'min_samples_split': [10, 50, 100],

    'max_features': ['sqrt', None],

    'max_samples': [0.5, 1.0]

}

С ускорителем поиск по сетке завершился за 1 час 33 минуты, после отмены – за 3 ч 35 м, т.е. ускорение «всего» в 2,3 раза, что, впрочем, тоже весьма неплохо.

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

Оптимальные гиперпараметры при поиске с ускорителем:

{'max_depth': 50,

 'max_features': 'sqrt',

 'max_samples': 1.0,

 'min_samples_split': 50,

 'n_estimators': 2500}

ROC AUC = 0.8910274241736913

Без ускорителя:

{'max_depth': 25,

 'max_features': 'sqrt',

 'max_samples': 1.0,

 'min_samples_split': 50,

 'n_estimators': 2000}

ROC AUC = 0.89091409276935

Попробовал также просто обучение классификатора RandomForestClassifier без поиска по сетке – выигрыш еще меньше: с ускорителем 11,2 с, без него 18,1 с.

Ноутбук со сравнением выложен по ссылке.

Теги:
Хабы:
Всего голосов 10: ↑10 и ↓0+10
Комментарии7

Публикации

Истории

Работа

Data Scientist
83 вакансии

Ближайшие события