培训中的AWS NoCredentials

时间:2018-10-07 02:32:13

标签: python python-2.7 amazon-web-services amazon-s3 amazon-sagemaker

我正在尝试在本地GPU上为Amazon Sagemaker运行example code。我已将代码从Jupyter笔记本复制到以下Python脚本:

import boto3
import subprocess
import sagemaker
from sagemaker.mxnet import MXNet
from mxnet import gluon
from sagemaker import get_execution_role
import os

sagemaker_session = sagemaker.Session()
instance_type = 'local'
if subprocess.call('nvidia-smi') == 0:
    # Set type to GPU if one is present
    instance_type = 'local_gpu'
# role = get_execution_role()

gluon.data.vision.MNIST('./data/train', train=True)
gluon.data.vision.MNIST('./data/test', train=False)

# successfully connects and uploads data
inputs = sagemaker_session.upload_data(path='data', key_prefix='data/mnist')

hyperparameters = {
    'batch_size': 100,
    'epochs': 20,
    'learning_rate': 0.1,
    'momentum': 0.9,
    'log_interval': 100
}

m = MXNet("mnist.py",
          role=role,
          train_instance_count=1,
          train_instance_type=instance_type,
          framework_version="1.1.0",
          hyperparameters=hyperparameters)

# fails in Docker container
m.fit(inputs)
predictor = m.deploy(initial_instance_count=1, instance_type=instance_type)
m.delete_endpoint()

其中引用的mnist.py文件与Github上指定的完全相同。该脚本在Docker容器中的m.fit上失败,出现以下错误:

algo-1-1DUU4_1  | Downloading s3://<S3-BUCKET>/sagemaker-mxnet-2018-10-07-00-47-10-435/source/sourcedir.tar.gz to /tmp/script.tar.gz
algo-1-1DUU4_1  | 2018-10-07 00:47:29,219 ERROR - container_support.training - uncaught exception during training: Unable to locate credentials
algo-1-1DUU4_1  | Traceback (most recent call last):
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/container_support/training.py", line 36, in start
algo-1-1DUU4_1  |     fw.train()
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/mxnet_container/train.py", line 169, in train
algo-1-1DUU4_1  |     mxnet_env.download_user_module()
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/container_support/environment.py", line 89, in download_user_module
algo-1-1DUU4_1  |     cs.download_s3_resource(self.user_script_archive, tmp)
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/container_support/utils.py", line 37, in download_s3_resource
algo-1-1DUU4_1  |     script_bucket.download_file(script_key_name, target)
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 246, in bucket_download_file
algo-1-1DUU4_1  |     ExtraArgs=ExtraArgs, Callback=Callback, Config=Config)
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 172, in download_file
algo-1-1DUU4_1  |     extra_args=ExtraArgs, callback=Callback)
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 307, in download_file
algo-1-1DUU4_1  |     future.result()
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 73, in result
algo-1-1DUU4_1  |     return self._coordinator.result()
algo-1-1DUU4_1  |   File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 233, in result
algo-1-1DUU4_1  |     raise self._exception
algo-1-1DUU4_1  | NoCredentialsError: Unable to locate credentials

我很困惑我可以在容器外部对S3进行身份验证(以加载训练/测试数据),但不能在Docker容器中进行身份验证。因此,我猜想问题与将AWS凭证传递给Docker容器有关。这是生成的Docker-compose文件:

networks:
  sagemaker-local:
    name: sagemaker-local
services:
  algo-1-1DUU4:
    command: train
    environment:
    - AWS_REGION=us-west-2
    - TRAINING_JOB_NAME=sagemaker-mxnet-2018-10-07-00-47-10-435
    image: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sagemaker-mxnet:1.1.0-gpu-py2
    networks:
      sagemaker-local:
        aliases:
        - algo-1-1DUU4
    stdin_open: true
    tty: true
    volumes:
    - /tmp/tmpSkaR3x/algo-1-1DUU4/input:/opt/ml/input
    - /tmp/tmpSkaR3x/algo-1-1DUU4/output:/opt/ml/output
    - /tmp/tmpSkaR3x/algo-1-1DUU4/output/data:/opt/ml/output/data
    - /tmp/tmpSkaR3x/model:/opt/ml/model
version: '2.1'

是否应将AWS凭证作为环境变量传递?

在阅读Using boto3 in install local mode?之后,我将sagemaker的安装升级到了,但是没有任何效果。我检查了在Sagemaker会话中(在容器外部)获取的凭据,即使我有~/.aws/config~/.aws/credentials文件,它们还是空白的:

{'_token': None, '_time_fetcher': <function _local_now at 0x7f4dbbe75230>, '_access_key': None, '_frozen_credentials': None, '_refresh_using': <bound method AssumeRoleCredentialFetcher.fetch_credentials of <botocore.credentials.AssumeRoleCredentialFetcher object at 0x7f4d2de48bd0>>, '_secret_key': None, '_expiry_time': None, 'method': 'assume-role', '_refresh_lock': <thread.lock object at 0x7f4d9f2aafd0>}

我是AWS的新手,所以我不知道如何诊断与AWS凭证有关的问题。我的.aws/config文件具有以下信息(带有占位符值):

[default]
output = json
region = us-west-2
role_arn = arn:aws:iam::123456789012:role/SageMakers
source_profile = sagemaker-test

[profile sagemaker-test]
output = json
region = us-west-2

IAM管理控制台中sagemaker-test配置文件中有AmazonSageMakerFullAccess的位置。

.aws/credentials文件具有以下信息(以占位符值表示):

[default]
aws_access_key_id = 1234567890
aws_secret_access_key = zyxwvutsrqponmlkjihgfedcba
[sagemaker-test]
aws_access_key_id = 0987654321
aws_secret_access_key = abcdefghijklmopqrstuvwxyz

最后,这些是pip freeze中适用库的版本:

awscli==1.16.19
boto==2.48.0
boto3==1.9.18
botocore==1.12.18
docker==3.5.0
docker-compose==1.22.0
mxnet-cu91==1.1.0.post0
sagemaker==1.11.1

如果我遗漏了任何相关信息,请告诉我,谢谢您能提供的任何帮助/反馈。

更新:谢谢大家的帮助!在尝试一些建议的修复程序时,我注意到boto3已过时,并对其进行了更新(分别更新为boto3-1.9.26botocore-1.12.26),似乎可以解决该问题。我找不到关于boto3==1.9.18的任何文档。如果有人可以帮助我了解boto3的问题,那么我很乐意将他们的回答标记为正确。

4 个答案:

答案 0 :(得分:1)

我刚刚确认他的示例可以在本地计算机上运行。请确保您正在使用的角色有权使用名称以sagemaker开头的存储桶。 Sagemaker默认情况下会创建带有sagemaker前缀的存储桶。

答案 1 :(得分:1)

SageMaker本地模式旨在获取boto3会话中可用的所有凭据,并将它们作为环境变量传递到docker容器中。

但是,如果您使用的sagemaker sdk版本(1.11.1和更早版本)包含令牌,则会忽略该凭据,因为这通常表示存在时间很短的凭据将不能长期有效。培训工作以完成任务或有用的目标。

如果您使用的是临时凭证,请尝试用永久凭证替换它们,或者从分配了适当实例角色的ec2实例(或SageMaker笔记本!)中运行。

此外,sagemaker sdk对凭据的处理在v1.11.2及更高版本中已更改-临时凭据将传递到本地模式容器,但带有警告消息。因此,您可以升级到较新的版本,然后重试(pip install -U sagemaker)。

此外,尝试升级boto3可能会更改,因此请尝试使用最新版本。

答案 2 :(得分:0)

您似乎已在~/.aws/credentials的主机上配置了凭据,但正尝试在主机上运行的docker容器上访问它们。

最简单的解决方案似乎是将aws凭证安装在预期位置的容器上。您似乎正在使用sagemaker-mxnet:1.1.0-gpu-py2图像,该图像似乎是使用root用户的。基于此,如果您更新docker-compose文件中的卷以使algo-1-1DUU4包括:

volumes:
  ...
  ~/.aws/:/root/.aws/

这会将您的凭据安装到容器中的root用户上,以便您的python脚本应该能够访问它们。

答案 3 :(得分:0)

我假设您正在使用的库的核心为boto3boto3建议that there are several methods of authentication供您使用。

  • 在boto.client()方法中将凭据作为参数传递
  • 在创建会话对象时将凭据作为参数传递
  • 环境变量
  • 共享的凭据文件(〜/ .aws / credentials)
  • AWS配置文件(〜/ .aws / config)
  • 承担角色提供者
  • Boto2配置文件(/etc/boto.cfg和〜/ .boto)
  • 已配置IAM角色的Amazon EC2实例上的实例元数据服务。

但这听起来像是docker沙箱无法访问您的~/.aws/credentials.conf文件,因此我考虑了其他可能可用的选项。由于我不熟悉docker,因此无法为您提供适合您情况的可靠解决方案。