Ошибка сценария обучения Amazon Sagemaker: AlgorithmError: ExecuteUserScriptError: Command "/ сценарий miniconda3 / bin / python -m - баланс функций - PullRequest
0 голосов
/ 10 января 2020

Когда я тренирую модель локально с помощью файла script.py, кажется, что все работает нормально. Но когда я создаю оценщик из sagemaker.sklearn.estimator.SKlearn, моя учебная работа каждый раз терпит неудачу. Вот учебный сценарий, а также аргументы, которые я передаю при создании оценщика. Любое понимание того, что не так с учебным сценарием, было бы полезно (почти наверняка проблема в этом есть).

    %%writefile script.py

    import argparse
    import os
    import numpy as np
    import pandas as pd
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.externals import joblib
    from sklearn.impute import SimpleImputer




# inference functions ---------------
def model_fn(model_dir):
    clf = joblib.load(os.path.join(model_dir, "model.joblib"))
    return clf



if __name__ =='__main__':

    print('extracting arguments')
    parser = argparse.ArgumentParser()

    # hyperparameters sent by the client are passed as command-line arguments to the script.
    # to simplify the demo we don't use all sklearn RandomForest hyperparameters
    parser.add_argument('--n-estimators', type=int, default=10)
    parser.add_argument('--min-samples-leaf', type=int, default=3)

    # Data, model, and output directories
    parser.add_argument('--model-dir', type=str, default=os.environ.get('SM_MODEL_DIR'))
    parser.add_argument('--train', type=str, default=os.environ.get('SM_CHANNEL_TRAIN'))
    parser.add_argument('--test', type=str, default=os.environ.get('SM_CHANNEL_TEST'))
    parser.add_argument('--train-file', type=str, default=os.environ.get('train'))
    parser.add_argument('--test-file', type=str, default=os.environ.get('test'))
    parser.add_argument('--features', type=str)
    parser.add_argument('--target', type=str) # in this script we ask user to explicitly name the target

    args, _ = parser.parse_known_args()

    print('reading data')
    print(args)
    train_df = pd.read_csv(os.path.join(args.train, args.train_file))
    test_df = pd.read_csv(os.path.join(args.test, args.test_file))

    #dropping rows with NaN's
    #train_df = train_df.dropna()
    #test_df = test_df.dropna()

    print('building training and testing datasets')
    X_train = train_df[args.features.split()]
    X_test = test_df[args.features.split()]
    y_train = train_df[args.target]
    y_test = test_df[args.target]

    print(X_train)
    print(y_train)

    # train
    print('training model')
    model = RandomForestRegressor(
        n_estimators=args.n_estimators,
        min_samples_leaf=args.min_samples_leaf,
        n_jobs=-1)

    model.fit(X_train, y_train)

    # print abs error
    print('validating model')
    abs_err = np.abs(model.predict(X_test) - y_test)

    # print couple perf metrics
    for q in [10, 50, 90]:
        print('AE-at-' + str(q) + 'th-percentile: '
              + str(np.percentile(a=abs_err, q=q)))

    # persist model
    path = os.path.join(args.model_dir, "model.joblib")
    joblib.dump(model, path)
    print('model persisted at ' + path)
    print(args.min_samples_leaf)

Тогда вот моя местная учебная работа, которая, кажется, работает над этим сценарием:

! python script.py --n-estimators 500 \
                  --min-samples-leaf 2 \
                  --model-dir /home/ec2-user/SageMaker \
                  --train 's3://ee-random-forest/data/' \
                  --test 's3://ee-random-forest/data/' \
                  --train-file 'ee_60_train.csv' \
                  --test-file 'ee_60_test.csv' \
                  --features 'balance estimatedvalue homeequitypercentage hhsize owned_mortage rented households nonfamilyhhper households_estimate_medianincome pop within15m BK NS S' \
                  --target target

И вот где я создаю оценщик SKlearn, для которого учебная работа всегда терпит неудачу:

from sagemaker.sklearn.estimator import SKLearn

sklearn_estimator = SKLearn(
    entry_point='script.py',
    role = get_execution_role(),
    train_instance_count=1,
    train_instance_type='ml.c5.xlarge',
    framework_version='0.20.0',
    metric_definitions=[
        {'Name': 'median-AE',
         'Regex': "AE-at-50th-percentile: ([0-9.]+).*$"}],
    hyperparameters = {'n-estimators': 500,
                       'min-samples-leaf': 3,
                       'features': 'balance estimatedvalue homeequitypercentage hhsize owned_mortage rented households nonfamilyhhper households_estimate_medianincome pop within15m BK NS S',
                      'target': 'target'})

# launch training job, with asynchronous call
sklearn_estimator.fit({'train':trainpath, 'test': testpath}, wait=False)

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...