Кажется, что параллельный код запускает один и тот же ввод на разных ядрах одновременно - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в параллельной обработке в Python.Мне удалось запустить мой код параллельно, однако, у меня все еще есть сомнения, сделал ли я это наиболее эффективным способом.Сначала я разделяю свои данные, как показано ниже:

gbm_param_combs = get_cartesian_prod(gbm_params)
random.Random(23).shuffle(gbm_param_combs)
gbm_param_combs = gbm_param_combs[501:506]

for counter, param in enumerate(gbm_param_combs):
    param['counter'] = int(counter)

gbm_df0 = np.array_split(gbm_param_combs,5)[0]
gbm_df1 = np.array_split(gbm_param_combs,5)[1]
gbm_df2 = np.array_split(gbm_param_combs,5)[2]
gbm_df3 = np.array_split(gbm_param_combs,5)[3]
gbm_df4 = np.array_split(gbm_param_combs,5)[4]

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

def finalFold(params, feats_final, target, h2o_train, h2o_test, fold, pd_scores_final):

    h2o_train = h2o.H2OFrame(h2o_train)
    h2o_test = h2o.H2OFrame(h2o_test)

    scores = []
    random_state = 123

        for param in params:

            counter = param.get('counter')
            param = {k:v for k, v in param.items() if k not in ('counter')}

            print('parameter combination: ', param)
            print('COUNTER: ', counter)


            #define model and fit
            gbm = H2OGradientBoostingEstimator(stopping_rounds = 5,
                                                   stopping_metric = 'rmse',
                                                   stopping_tolerance = 1e-4,
                                                   seed = random_state,
                                                   **param)

            print('GBM TRAINING STARTS....')
            gbm.train(x = feats_final,
                          y = target,
                          training_frame = h2o_train)


            score = gbm.model_performance(h2o_test).r2()

            pd_scores_final = pd_scores_final.append({'fold': int(fold),
                                                      'score': score,
                                                      'corr' : 0.0,
                                                      'param_idx': int(counter)},
                                                     ignore_index=True)
    return pd_scores_final

Наконец, я вызываю эту функцию со звездообразным изображением, как показано ниже:

p = mp.Pool(processes=5)

.....

for fold, (train_index, test_index) in enumerate(kfolds.split(pd_data)):

    .....
    argsGBM = [(gbm_df0, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM), 
            (gbm_df1, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM), 
            (gbm_df2, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
            (gbm_df3, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
            (gbm_df4, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM)]

    pool_results3 = p.starmap(finalFold, argsGBM)

    for k in range(0,len(pool_results3)):
        if k ==0:
            pd_scores_final_GBM = pd.DataFrame(pool_results3[k])
        else:
            pd_scores_final_GBM = pd.concat([pd_scores_final_GBM,pd.DataFrame(pool_results3[k])], axis=0, ignore_index=True)

Однако я вижу, чторезультаты в отдельных частях pool_results3 идентичны.То есть:

enter image description here

enter image description here

Что не так с кодом?

...