在Sagemaker中使用相同的预处理代码进行训练和推理

时间:2019-11-19 03:47:17

标签: machine-learning amazon-sagemaker amazon-machine-learning

我正在为时间序列数据构建机器学习管道,目标是经常重新训练和更新模型以进行预测。

  • 我已经编写了预处理代码,用于处理时间序列变量并将其转换。

我对如何在训练和推理中使用相同的预处理代码感到困惑?我应该编写lambda函数来预处理数据还是有其他方法

来源调查了

aws sagemaker团队给出的两个示例使用AWS Glue进行ETL转换。

inference_pipeline_sparkml_xgboost_abalone

inference_pipeline_sparkml_blazingtext_dbpedia

我是aws智者的新手,他们试图学习,理解和建立流程。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

以倒退的方式解决问题。

在您的示例中,下面的代码是将2个模型放在一起的推理管道。在这里,我们需要删除sparkml_model并获取我们的sklearn模型。

sm_model = PipelineModel(name=model_name, role=role, models=[sparkml_model, xgb_model])

在放置sklearn模型之前,我们需要SageMaker版本的SKLearn模型。

  

首先使用SageMaker Python库创建SKLearn Estimator。

sklearn_preprocessor = SKLearn(
    entry_point=script_path,
    role=role,
    train_instance_type="ml.c4.xlarge",
    sagemaker_session=sagemaker_session)

script_path-这是python代码,包含所有预处理逻辑或转换逻辑。在下面给出的链接中为“ sklearn_abalone_featurizer.py”。

  

训练SKLearn估算器

sklearn_preprocessor.fit({'train': train_input})
  

从SKLearn估算器创建SageMaker模型,该模型可以放入   推理管道。

sklearn_inference_model = sklearn_preprocessor.create_model()
  

推理PipeLineModel的创建将按如下所示进行修改。

sm_model = PipelineModel(name=model_name, role=role, models=[sklearn_inference_model, xgb_model])

有关更多详细信息,请参见下面的链接。

https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker-python-sdk/scikit_learn_inference_pipeline/Inference%20Pipeline%20with%20Scikit-learn%20and%20Linear%20Learner.ipynb

答案 1 :(得分:0)

我在python脚本中使用管道作为入口点。在第一步中,我正在执行预处理。管道将另存为模型。因此,模型端点最终还包括预处理。详细信息(我使用的是scikit,但对于tensorflow应该相似):

例如,如果您想拨打火车:

from sagemaker.sklearn.estimator import SKLearn

sklearn_estimator = SKLearn(
  entry_point='script.py',
  role = 'xxx',
  train_instance_count=1,
  train_instance_type='ml.c5.xlarge',
  framework_version='0.20.0',
  hyperparameters = {'cross-validation': 5,
                   'scoring': 'accuracy'})

然后您将获得一个入口点脚本。在此脚本('script.py')中,您可以有几个步骤,这些步骤成为最终保存的模型的一部分。例如:

tfidf = TfidfVectorizer(strip_accents=None,
                    lowercase=False,
                    preprocessor=None)

....

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

在训练结束后,您需要通过joblib.dump保存模型。此存储的模型用于创建sagemaker模型和模型端点。当我最终调用predictor.predict(X_test)时,管道的第一步(我的前处理)也将执行并应用于X_test。

Sagemaker支持不同的预处理方式。我只想分享一个相当简单的方案,该方案对我的情况适用。我正在使用GridSearch作为script.py中管道步骤的参数。

相关问题