首页 > 解决方案 > 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-************ “它在其中保存了模型工件。我如何强制它将工件保存在给定的存储桶中。

标签: pythonamazon-web-servicesscikit-learn

解决方案


估计器只应在未指定 output_path 时创建存储桶:

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)

训练作业在不创建任何额外存储桶的情况下运行并完成。我能够在我现有的存储桶中找到经过训练的模型。

有时很难跟踪 Jupyter Notebook 中实际运行的代码,您是否在修改后重新运行了创建 SKLearn 对象的单元格?


推荐阅读