我正在研究AWS SageMaker笔记本示例,当我玩"带Scikit学习和线性学习器的推理管道"时,我在适合SKLearn模型时遇到了问题。
示例中的代码为:
from sagemaker.sklearn.estimator import SKLearn
script_path = 'sklearn_abalone_featurizer.py'
sklearn_preprocessor = SKLearn(
entry_point=script_path,
role=role,
train_instance_type="ml.c4.xlarge",
sagemaker_session=sagemaker_session)
sklearn_preprocessor.fit({'train': train_input})
当我运行这个时,我得到一个错误:
ClientError:调用CreateBucket操作:拒绝访问
所以我将sklearn_processor更改为:
sklearn_preprocessor = SKLearn(
output_path='s3://{}/{}/model'.format(s3_bucket, prefix),
entry_point=script_path,
role=role,
train_instance_type="ml.c4.xlarge",
sagemaker_session=sagemaker_session)
其中s3_bucket是我的bucket的名称,前缀是进入它的路径
但是,SKLearn仍然希望创建一个bucket,即使它已经存在。当我使用相同的output_path拟合AWS的模型时,它工作得很好。有没有一种方法可以在不更改授权策略的情况下解决这个问题?
编辑:我编辑了我的笔记本实例的角色,训练可以运行,但它确实创建了一个bucket"信息:sagemaker:Created S3 bucket:sagemaker-eu-west-1-************",它在其中保存了模型工件。我如何才能强制它将工件保存在给定的bucket中。
估计器只应在未指定output_path时创建bucket:
https://github.com/aws/sagemaker-python-sdk/blob/ab1f7587bf1c35a54549cc676c273dea356301e4/src/sagemaker/estimator.py#L199
我也无法复制这个。我在AWS SageMaker上启动了一个托管笔记本实例,复制到示例笔记本上进行了相同的修改:
from sagemaker.sklearn.estimator import SKLearn
script_path = 'sklearn_abalone_featurizer.py'
sklearn_preprocessor = SKLearn(
entry_point=script_path,
output_path='s3://<my_bucket>/',
role=role,
train_instance_type="ml.c4.xlarge",
sagemaker_session=sagemaker_session)
培训作业在不创建任何附加bucket的情况下运行并完成。我能够在我现有的水桶里找到经过训练的模型。
有时很难跟踪Jupyter笔记本中实际运行的代码,您是否在修改后重新运行了创建SKLearn对象的单元格?