Этот вопрос относится к параллельной обучающей модели регрессии lightGBM на всех машинах блоков данных / AWS кластер . Но я показываю больше кода и подробностей плзу новые вопросы. Итак, создали новый.
Я пытаюсь запустить LightGBM для обучения модели машинного обучения на кластерах AWS / EC2 с помощью блоков данных. Общий объем данных составляет 1 ГБ (для обучения и тестирования). Общий размер объекта составляет около 18.
Я использую поиск по сетке для поиска лучших гиперпараметров для модели loightgbm.
Мой python3 код (просто покажите соответствующий):
import lightgbm as lgb
from sklearn.model_selection import ShuffleSplit, train_test_split, GridSearchCV
params = {'objective': 'regression_l1',
'boosting_type': 'goss',
'metric': 'l1',
'max_depth' : -1 , # it is also set as 6, 8, 14, 20, 30
'num_leaves': 8000,
'learning_rate' : 0.01,
'bagging_fraction': 1.0,
'bagging_freq': 1,
'lambda_l1': 2.0,
'lambda_l2': 2.0
}
gbm_regressor = lgb.LGBMRegressor(objective=params['objective'],
num_leaves=params['num_leaves'],
boosting_type=params['boosting_type'],
metric=params['metric'],
bagging_fraction=params['bagging_fraction'],
bagging_freq=params['bagging_freq'],
learning_rate=params['learning_rate'],
lambda_l1=params['lambda_l1'],
lambda_l2=params['lambda_l2'],
warm_start=True,
random_state=17,
verbose=1,
device='cpu',
silent = False)
grid_params = {
'n_estimators' : [1000] # [2000, 4000],
}
cv = ShuffleSplit(n_splits=10, train_size= 0.7, test_size=0.3)
gbm = GridSearchCV(estimator=gbm_regressor, param_grid = grid_params, cv=cv, scoring=['neg_mean_absolute_error'], n_jobs=DRIVER_CORES, refit = 'neg_mean_absolute_error')
# this fitting cost a long time !!!
gbm.fit(X=X_train, y=y_train) # the total data size for traing and test is around 1 GB and 18 features.
Настройка моего кластера:
driver : c4.8xlarge (36 cores, 60GB memory)
1 master, 1 worker: r4.xlarge (4 cores, 30 GB)
После отправки задания в кластер оно запускается только на драйвере. Он использовал все процессоры независимо от того, сколько параллельных заданий я выполнял, установив n_jobs (8, 16, 32) на узле драйвера.
For n_jobs = 8, it cost 17 minutes to get the gbm.fit(X=X_train, y=y_train) done.
For n_jobs = 16, it cost 65 minutes to get the gbm.fit(X=X_train, y=y_train) done.
For n_jobs = 32, it cost around 200 minutes to get the gbm.fit(X=X_train, y=y_train) done.
Мои вопросы:
Я запустил тот же код на своем ноутбуке MacBook Pro с 8 ядрами и 16 ГБ памяти для случая "n_jobs = 8" и оставил все остальные параметры такими же, как на AWS. Время его работы составляет около 10 минут, что на AWS / EC2 быстрее, чем 17 минут (c4.8xlarge (36 ядер, 60 ГБ памяти)). Как это могло произойти?
Почему больше параллельных заданий (n_jobs) (все выполняются на узле драйвера), тем дольше время подбора модели lightGBM?
Размер модели невелик, размер обучающих данных мал, а модель LighGBM оптимизирована с помощью функции "goss". Почему обучение заняло так много времени?
Я нарисовал кривую обучения для набора данных обучения и тестирования, которые показывают, что для меньших итераций (<150) ошибки теста меньше ошибки обучения , </p>
Как это могло произойти?
Почему на узле драйвера используется 30 ГБ, хотя общий размер данных составляет 1 ГБ, а n_jobs = 8?
Если для одного набора данных создано 8 копий, почему используется 30 ГБ?