Обучение XGBoost с n_jobs = -1, не использующим все ядра - PullRequest
0 голосов
/ 11 октября 2019

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

Данные:

data_dmatrix = xgb.DMatrix(data=X,label=y, nthread=-1)
dtrain = xgb.DMatrix(X_train, label=y_train, nthread=-1)
dtest = xgb.DMatrix(X_test, label=y_test, nthread=-1)

Модель:

xg_model = XGBRegressor(objective='reg:linear', colsample_bytree= 0.3, learning_rate = 0.2,
                         max_depth = 5, alpha = 10, n_estimators = 100, subsample=0.4, booster = 'gbtree', n_jobs=-1)

а затем, если я буду заниматься модельным обучением с:

xgb.train(
    xg_model.get_xgb_params(),
    dtrain,
    num_boost_round=500,
    evals=[(dtest, "Test")],
    early_stopping_rounds=200)

Это работает нормально, но для запуска xgboost используется только 1 поток. Процессор на 25%. Он игнорирует n_jobs=-1

Но если я сделаю перекрестную проверку с реализацией scikit-learn:

scores = cross_val_score(xg_model, X, y, cv=kfold, n_jobs=-1)

, тогда он использует все ядра. Как заставить xgb.train и xgb.cv использовать все ядра?

1 Ответ

2 голосов
/ 11 октября 2019

Повышение является последовательным алгоритмом, вы можете обучить дерево t+1 только после обучения 1..t. Поэтому для распараллеливания XGBoost «выполняет распараллеливание в пределах одного дерева», как отмечено здесь . С max_depth=5 ваши деревья сравнительно очень малы, поэтому распараллеливание шага построения деревьев не заметно.

cross_val_score однако обучает K различным моделям XGBoost параллельно. Эти модели полностью независимы друг от друга. Исходя из моего опыта, этот вид грубого параллелизма с использованием cross_val_score или GridSearchCV всегда быстрее, чем распараллеливание отдельной модели.

Одна альтернатива - использовать вариант Random Forest: XGBRFClassifier. В отличие от алгоритмов повышения и, как и cross_val_score, случайный лес смущающе параллелен .

...