python - AWS Sagemaker 无法适应 SKLearn 模型:调用 CreateBucket 操作时访问被拒绝
问题描述
我正在研究 AWS SageMaker 笔记本示例,当我玩“带有 Scikit-learn 和线性学习器的推理管道”时,我遇到了适合 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操作时发生错误(AccessDenied):访问被拒绝
所以我将 sklearn_preprocessor 更改为:
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 是我的存储桶的名称,前缀是其中的路径。
但是,SKLearn 仍然想要创建一个存储桶,即使它已经存在。当我使用相同的 output_path 拟合 AWS 模型时,它工作正常。有没有办法在不改变授权策略的情况下解决这个问题?
编辑:我编辑了我的笔记本实例的角色,培训可以运行,但它确实创建了一个存储桶“INFO:sagemaker:Created S3 bucket:sagemaker-eu-west-1-************ “它在其中保存了模型工件。我如何强制它将工件保存在给定的存储桶中。
解决方案
估计器只应在未指定 output_path 时创建存储桶:
我也无法重现这一点。我在 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)
训练作业在不创建任何额外存储桶的情况下运行并完成。我能够在我现有的存储桶中找到经过训练的模型。
有时很难跟踪 Jupyter Notebook 中实际运行的代码,您是否在修改后重新运行了创建 SKLearn 对象的单元格?