簡體   English   中英

AWS SageMaker 訓練腳本:如何傳遞自定義用戶參數

[英]AWS SageMaker training script: how to pass custom user parameters

我正在使用 Scikit-learn 和 SageMaker Python SDK 訓練分類器。
整個過程包括三個連續的階段:

  1. 使用訓練和驗證數據集的超參數調整工作
  2. 使用在 1. 中建立的最佳超參數和整個數據集(從 1. 開始的訓練 + 驗證)進行訓練
  3. 使用 2. 提供的“prefit”model 和用於校准的附加數據集訓練校准后的 model。

我需要拆分流程的原因是為了保存在步驟 2 中創建的未校准的 model。

對於這一步中的每一步,我都准備了一個訓練腳本,如下所述: https://sagemaker.readthedocs.io/en/stable/using_sklearn.html#prepare-a-scikit-learn-training-script

這三個腳本非常相似,為了避免代碼冗余,我想在這三種情況下使用一個帶有附加邏輯的腳本。 更准確地說,我想將額外的自定義參數傳遞給sagemaker.tuner.HyperparameterTunersagemaker.sklearn.estimator.SKLearn對象的.fit方法,以便能夠根據使用情況(階段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。

關於如何將額外的自定義參數傳遞給訓練腳本的任何想法?

根據此處看到的 Sagemaker 文檔,您可以通過以下方式將訓練腳本中的超參數作為命令行 arguments 訪問,例如:

parser = argparse.ArgumentParser()
parser.add_argument('--epochs', type=int, default=10)
parser.add_argument('--batch_size', type=int, default=100)
parser.add_argument('--learning_rate', type=float, default=0.1)

您可以不在 fit 方法中傳遞超參數,而是在創建估計器之前直接傳遞超參數。 文檔中的示例是:

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 訪問的方式。 如果您只有一個腳本,您可以在腳本中處理您的邏輯。 但這不會向 sagemaker.tuner.HyperparameterTuner 的 .fit 方法添加自定義參數。

我使用以下序列來優化腳本中的參數,然后應用最佳參數(也僅使用一個訓練腳本)。 也許您將此應用於您的案例。 您應該能夠在腳本中使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM