Как ускорить обучение модели XGBoost

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

Введение

Алгоритмы повышения градиента широко используются в обучении под наблюдением. Несмотря на то, что они сильны, их тренировка может занять много времени. Экстремальное повышение градиента или  XGBoost – это реализация с открытым исходным кодом повышения градиента, разработанная для скорости и производительности. Однако даже обучение XGBoost иногда может быть медленным.

Есть несколько подходов к ускорению этого процесса, например:

В этой статье мы рассмотрим преимущества и недостатки каждого подхода, а также расскажем, с чего начать.

Изменение алгоритма построения дерева

Параметр XGBoost  tree_method позволяет указать, какой алгоритм построения дерева вы хотите использовать. Выбор соответствующего алгоритма построения дерева ( exact,  approx,  hist,  gpu_hist,  auto) для вашей проблемы может помочь вам произвести модель быстрее. Теперь рассмотрим алгоритмы.

exact

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

approx

Хотя алгоритм exact точен, он неэффективен, когда данные не полностью помещаются в память. Метод approx использует набросок квантилей и градиентные гистограммы.

hist

Метод дерева аппроксимации, используемый в  LightGBM,  с небольшими отличиями в реализации из  approx. (использует некоторые улучшения производительности, такие как кеширование бункеров)

gpu_hist

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

auto

Это значение параметра по умолчанию. В зависимости от размера набора данных XGBoost выберет «самый быстрый метод». Для небольших наборов данных будет использоваться точное (exact) значение. Для больших наборов данных будет использоваться приблизительно (approx). Обратите внимание, что hist и gpu_hist не рассматриваются в этом эвристическом подходе, хотя часто они работают быстрее.

Если вы запустите этот код , вы увидите, как запуск моделей с использованием gpu_hist может сэкономить много времени. На относительно небольшом наборе данных (100000 строк, 1000 функций) на моем компьютере переход с hist на gpu_hist сократил время обучения примерно в 2 раза.

Использование облачных вычислений

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

Последний раздел был посвящен в основном выбору более эффективных алгоритмов, чтобы лучше использовать доступные вычислительные ресурсы. Однако иногда доступных вычислительных ресурсов недостаточно, и вам просто нужно больше. Например, MacBook, показанный на изображении ниже, имеет только 4 ядра и 16 ГБ памяти. Кроме того, он работает на MacOS, для которой на момент написания этой статьи XGBoost не поддерживает GPU.Фигура
В рамках этой статьи вы можете думать о MacBook, как об одном узле с 4 ядрами.

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

Если вы хотите попробовать ускорить свое обучение в облаке, ниже представлен обзор шагов из  статьи Джейсона Браунли  о том, как обучить модель XGBoost на экземпляре AWS EC2:

1. Настройте учетную запись AWS (при необходимости).

2. Запустите экземпляр AWS.

3. Войдите и запустите код.

4. Обучите модель XGBoost.

5. Закройте экземпляр AWS (платите только за экземпляр, когда вы его используете).

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

Распределенное обучение XGBoost с Ray

До сих пор в этом руководстве рассматривалось ускорение обучения за счет изменения алгоритма построения дерева и увеличения вычислительных ресурсов за счет облачных вычислений. Другое решение – распространить обучение модели XGBoost с помощью  XGBoost-Ray,  который использует Ray.

Что такое Ray?

Ray – это быстрая и простая среда распределенного выполнения, которая позволяет легко масштабировать ваши приложения и использовать современные библиотеки машинного обучения. Используя Ray, вы можете взять код Python, который выполняется последовательно и с минимальными изменениями кода преобразовать его в распределенное приложение. 

Фигура
Хотя в этом руководстве рассматривается, как Ray упрощает параллельный код и распространение кода XGBoost, важно отметить, что Ray и его экосистема также упрощают распространение простого кода Python и существующих библиотек, таких как  scikit-learn ,  LightGBM ,  PyTorch и т.д.

Как начать работу с XGBoost-Ray

Чтобы начать работу с XGBoost-Ray,  вам сначала необходимо установить его .

pip install "xgboost_ray"

Поскольку он полностью совместим с основным API XGBoost, все, что вам нужно, – это несколько изменений кода для масштабирования обучения XGBoost с одного компьютера до кластера с сотнями узлов.Фигура
XGBoost-Ray поддерживает обучение с использованием нескольких узлов и графических процессоров. На машине графические процессоры передают градиенты через NCCL2. Между узлами вместо этого используется Rabit.

Как видно из приведенного ниже кода, API очень похож на XGBoost:

from xgboost_ray import RayXGBClassifier, RayParams
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

seed = 42

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=0.25, random_state=42
)

clf = RayXGBClassifier(
    n_jobs=4,  # In XGBoost-Ray, n_jobs sets the number of actors
    random_state=seed)

# scikit-learn API will automatically convert the data
# to RayDMatrix format as needed.
# You can also pass X as a RayDMatrix, in which case
# y will be ignored.

clf.fit(X_train, y_train)

pred_ray = clf.predict(X_test)
print(pred_ray)

pred_proba_ray = clf.predict_proba(X_test)
print(pred_proba_ray)

Приведенный выше код показывает, как мало вам нужно изменить код, чтобы использовать XGBoost-Ray. 
Время обучения для тестов с одним узлом чем меньше, тем лучше. XGBoost-Ray и XGBoost-Dask достигают одинаковой производительности на одном экземпляре AWS m5.4xlarge с 16 ядрами и 64 ГБ памяти.

XGBoost-Ray также эффективен в многоузловых (распределенных) настройках, как показано на изображении ниже.Фигура
Время обучения нескольких узлов для нескольких синтетических наборов данных размером от ~ 400 тыс. До ~ 2 млрд строк. XGBoost-Ray и XGBoost-Spark достигают аналогичной производительности.

Вывод

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

Ответить