Уведомление о возможности ускорить работу появляется при установке 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 с.
Ноутбук со сравнением выложен по ссылке.
Комментарии (7)
Hiten10
00.00.0000 00:00Простите, а можно поподробней, на каком оборудовании этот патч ускоряет работу sklearn, на процессорах интел? Из описания в оригинале тоже ничего такого не нашёл
QtRoS
Когда трогал библиотеку с год назад, возникли странные ошибки во время работы вроде расхождения размерностей или итерирования неподходящих объектов. Интересно, исправлены ли сейчас эти детские болячки...
Mind08 Автор
Я пока не замечал, но только начал использовать. Можно еще проверить требования к алгоритмам (не все значени гиперпараметров допустимы) и к системе: "ARM* architecture is not supported."