Ray удаленный вызов выполняет метод, а не возвращает идентификатор - PullRequest
0 голосов
/ 01 апреля 2020

Я разрабатываю функцию оптимизации гиперпараметров на основе этой модели Луча: https://ray.readthedocs.io/en/latest/auto_examples/plot_hyperparameter.html.

Метод ниже, execute_single_rs , аналогичен define_hyperparameters метод в этом примере, включая вызов метода моего поезда, trainmodel , который следует.

@ray.remote(num_cpus=4)
def perform_single_rs(srch_num, X_train, X_test, y_train, y_test,
                      model=None, params=None,sample_weights=None, best_model_path=None, data_CNN=None):
    print('Search {0:3d}'.format(srch_num))
    model = create_model_cnn(params)
    best_model, X_train_CNN, X_test_CNN = \
        trainmodel(X_train, X_test, y_train, y_test, model=model,params=params,
                   sample_weights=sample_weights, best_model_path=best_model_path, data_CNN=data_CNN)
    best_model = load_model(best_model_path)
    results = {'best model': best_model,'params':p,
                'X_train_CNN': X_train_CNN, 'X_test_CNN': X_test_CNN}
    return results

def trainmodel(x_train, x_test, y_train, y_test,
                model=None, params=None, best_model_path=None, sample_weights=None,data_CNN=None):
    # Random search code gens params
    if params is None:
        #TODO remove squaring up of train/test from setmodelparams
        x_train_sq,x_test_sq,params = setmodelparams(x_train,x_test)
    else:
        # RS squares up train/test
        x_train_sq = x_train
        x_test_sq = x_test

    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,
                   patience=25, min_delta=0.0001)
    # csv_logger = CSVLogger(os.path.join(OUTPUT_PATH, 'log_training_batch.log'), append=True)
    rlp = ReduceLROnPlateau(monitor='val_loss', factor=0.02, patience=10, verbose=1, mode='min',
                        min_delta=0.001, cooldown=1, min_lr=0.0001)
    mcp = ModelCheckpoint(str(best_model_path), monitor='val_loss', verbose=0,
                      save_best_only=True, save_weights_only=False, mode='min', period=1)
    y_cv = y_test


    history = model.fit(data_CNN['X_train'],
                        y_train,
                        epochs=params['epochs'],
                        verbose=50,
                        batch_size=params['batch_size'], shuffle=True,
                        validation_data=(data_CNN['X_cv'], y_cv),
                        callbacks=[es, mcp, rlp],
                        sample_weight=sample_weights
                        )

    # load best model for return
    return data_CNN['X_train'], data_CNN['X_test']

Однако, когда я вызываю метод, rs_id = perform_single_rs.remote(... trainmodel выполнен и примерка начинается. Почему я не получаю идентификатор объекта Ray, как ожидается при удаленном вызове?

Большое спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020

Когда вы вызываете удаленные вызовы, perform_single_rs будет запланирован и запущен, как только ресурсы станут доступны в вашем кластере Ray. Таким образом, это нормально, что функции вызываются, как только вы запускаете удаленную функцию.

rs_id переменная получит все идентификаторы объекта, которые используются для вызова результата вашего удаленного вызова. Вы можете увидеть, что в списке rs_id есть идентификаторы объектов, вызвав print(rs_id).

...