#python #multithreading #xgboost #scikit-optimize #bayesian-deep-learning
Вопрос:
У меня есть очень большой набор данных (7 миллионов строк, 54 объекта), который я хотел бы использовать для регрессионной модели XGBoost
. Чтобы обучить наилучшую возможную модель, я хочу использовать BayesSearchCV
from scikit-optimize
для многократного выполнения подгонки для различных комбинаций гиперпараметров, пока не будет найден наилучший набор.
Для данного набора гиперпараметров XGBoost
обучение модели занимает очень много времени, поэтому, чтобы найти лучшие гиперпараметры, не тратя дни на каждую перестановку обучающих сгибов, гиперпараметров и т. Д., Я хочу выполнить многопоточность XGBoost
и BayesSearchCV
. Соответствующая часть моего кода выглядит так:
xgb_pipe = Pipeline([('clf', XGBRegressor(random_state = 42, objective='reg:squarederror', n_jobs = 1))])
xgb_fit_params = {'clf__early_stopping_rounds': 5, 'clf__eval_metric': 'mae', 'clf__eval_set': [[X_val.values, y_val.values]]}
xgb_kfold = KFold(n_splits = 5, random_state = 42)
xgb_unsm_cv = BayesSearchCV(xgb_pipe, xgb_params, cv = xgb_kfold, n_jobs = 2, n_points = 1, n_iter = 15, random_state = 42, verbose = 4, scoring = 'neg_mean_absolute_error', fit_params = xgb_fit_params)
xgb_unsm_cv.fit(X_train.values, y_train.values)
Тем не менее, я обнаружил n_jobs > 1
, что при BayesSearchCV
вызове происходит сбой подгонки, и я получаю следующую ошибку:
TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.
The exit codes of the workers are {SIGKILL(-9)}
Эта ошибка сохраняется всякий раз, когда я использую более 1 потока в BayesSearchCV
вызове, и не зависит от предоставляемой мной памяти.
Является ли это какой-то фундаментальной несовместимостью между XGBoost
и scikit-optimize
, или оба пакета могут быть каким-то образом вынуждены работать вместе? Без какого-либо способа многопоточной оптимизации я боюсь, что подгонка моей модели займет недели. Что я могу сделать, чтобы это исправить?
Комментарии:
1. Вам действительно нужно многопоточное выполнение обоих циклов?
2. @Дмитрий: Я думаю, что мне это очень нужно. Многопоточность вызова XGBoost означает, что модель обучается за 4 часа вместо 23 — у меня много данных — в то время как я понимаю, что для поиска оптимального набора параметров в байесовской оптимизации требуется не менее 20 итераций. Как еще это можно сделать?
3. Ну, разве он не использует все доступные процессоры за эти 4 часа? Я не слишком хорошо знаком с этими конкретными библиотеками, но кажется необычным, что вам нужно многопоточно выполнять внутреннюю задачу, а затем также многопоточно выполнять внешнюю.
4. @Dimitry: XGBoost использует все доступные процессоры, только если n_jobs = -1. Я надеялся, что байесовская оптимизация позволит одновременно оценить несколько возможных точек в пространстве параметров, установив n_jobs > 1, чтобы быстрее найти оптимальный набор.
Ответ №1:
Я не думаю, что ошибка как-то связана с несовместимостью библиотек. Скорее всего, поскольку вы запрашиваете две разные многопоточные операции, у вас заканчивается память, поскольку ваша программа пытается поместить полный набор данных в вашу оперативную память не один раз, а дважды для нескольких экземпляров (в зависимости от потоков).
TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.
The exit codes of the workers are {SIGKILL(-9)}
Ошибка сегментации относится к ошибке, при которой в системе закончилась доступная память.
Обратите внимание, что XGBoost-это зверь, жаждущий оперативной памяти, соединение его с другой многопоточной операцией неизбежно потребует затрат(и лично я не рекомендую использовать машины с ежедневными драйверами).
Наиболее жизнеспособным решением было бы, вероятно, использовать TPU Google или какой-либо другой облачный сервис (остерегайтесь затрат) или использовать какой-либо метод для уменьшения размера набора данных для обработки с использованием некоторых статистических методов, подобных тем, которые упоминаются в этой статье kaggle notebook и Data Science StackExchange.
Идея заключается в том, что либо вы увеличиваете аппаратное обеспечение (денежные затраты), идете в лоб с помощью БайесианКВ с одним потоком (затраты времени), либо уменьшаете размер данных, используя любую технику, которая вам больше подходит.
Наконец, ответ по-прежнему заключается в том, что библиотеки, вероятно, совместимы, просто данные слишком велики для доступной оперативной памяти.