AWS Учебный скрипт SageMaker: как передать пользовательские параметры - PullRequest
0 голосов
/ 08 января 2020

Я обучаю классификатор с помощью Scikit-learn с помощью SageMaker Python SDK.
Весь процесс состоит из трех последовательных этапов:

  1. работа по настройке гиперпараметров с использованием данных обучения и проверки устанавливает
  2. тренировочную работу с лучшими гиперпараметрами, основанными на 1. и весь набор данных (обучение + проверка с 1.)
  3. тренировка откалиброванной модели с предоставленной моделью "prefit" от 2. и дополнительный набор данных для калибровки.

Причина, по которой мне нужно разделить процесс, заключается в сохранении некалиброванной модели, созданной на шаге 2.

Для каждого из на этом шаге я готовлю учебный сценарий, как описано в: https://sagemaker.readthedocs.io/en/stable/using_sklearn.html#prepare -a-scikit-learn-training-script

Три сценария очень похожи, и во избежание избыточности кода мне бы хотелось использовать один сценарий с дополнительными логиками c внутри для трех ситуаций. Точнее, я хотел бы передать дополнительные пользовательские параметры в методы .fit объектов sagemaker.tuner.HyperparameterTuner и sagemaker.sklearn.estimator.SKLearn, чтобы иметь возможность воздействовать на logi c в сценарии в зависимости от использования (фаза 1. , 2 или 3).

Я уже пытался взломать SM_CHANNEL_XXX
parser.add_argument('--myparam', type=str, default=os.environ.get('SM_CHANNEL_MYPRAM')) при вызове .fit(inputs={'train': ..., 'test': ..., 'myparam': myvalue}), но ожидал действительный s3 URI.

Любая идея о том, как передать дополнительные пользовательские параметры в учебные сценарии?

1 Ответ

0 голосов
/ 09 января 2020

Вы можете передавать гиперпараметры не в методе подгонки, а сразу после шага при создании оценщика. Пример в документации будет выглядеть следующим образом:

sklearn_estimator = SKLearn('sklearn-train.py',
                        train_instance_type='ml.m4.xlarge',
                        framework_version='0.20.0',
                        hyperparameters = {'epochs': 20, 'batch-size': 64, 'learning- 
rate': 0.1})
sklearn_estimator.fit({'train': 's3://my-data-bucket/path/to/my/training/data',
                    'test': 's3://my-data-bucket/path/to/my/test/data'})

Вот как вы переносите свои параметры (из вашей записной книжки) в учебный скрипт для доступа через parser.add_argument. Если у вас есть только один скрипт, вы можете обрабатывать свои логики c внутри скрипта. Но это не добавляет пользовательских параметров в метод .fit файла sagemaker.tuner.HyperparameterTuner.

Я использую следующую последовательность для оптимизации параметров в сценарии, а затем применяю лучший параметр (используя также только один обучающий сценарий). ). Может быть, вы примените это к вашему делу. Вы должны иметь возможность сохранять промежуточные модели с помощью joblib.dump в вашем скрипте:

param_grid = [{'vect__ngram_range': [(1, 1)],
           'vect__stop_words': [stop, None],
           'clf__penalty': ['l1', 'l2'],
           'clf__C': [1.0, 10.0, 100.0]},
          {'vect__ngram_range': [(1, 1)],
           'vect__stop_words': [stop, None],
           'vect__use_idf':[False],
           'vect__norm':[None],
           'clf__penalty': ['l1', 'l2'],
           'clf__C': [1.0, 10.0, 100.0]},
          ]

lr_tfidf = Pipeline([('vect', tfidf),
                 ('clf', LogisticRegression(random_state=0))])

gs_lr_tfidf = GridSearchCV(lr_tfidf, param_grid,
                       scoring='accuracy',
                       cv=5,
                       verbose=1,
                       n_jobs=-1)


gs_lr_tfidf.fit(X_train, y_train)
...