AWS NoCredentials в обучении - PullRequest
       8

AWS NoCredentials в обучении

0 голосов
/ 07 октября 2018

Я пытаюсь запустить пример кода для Amazon Sagemaker на локальном графическом процессоре.Я скопировал код из записной книжки 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.Сценарий не выполняется на m.fit в контейнере Docker со следующей ошибкой:

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 передаваться как переменные среды?

Я обновил sagemaker до версии после прочтения Использование boto3в режиме установки локально? , но это никак не отразилось.Я проверил учетные данные, которые извлекаются в сеансе 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

Где профиль sagemaker-test имеет AmazonSageMakerFullAccess в консоли управления IAM.

.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.26 и botocore-1.12.26), что, по-видимому, решило проблему.Я не смог найти никакой документации по этому вопросу с boto3==1.9.18.Если бы кто-нибудь мог помочь мне понять, в чем проблема с boto3, я бы с радостью пометил их ответ как правильный.

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Локальный режим SageMaker предназначен для сбора любых учетных данных, доступных в сеансе boto3, и передачи их в контейнер докера в качестве переменных среды.

Однако используемая вами версия sagemaker sdk (1.11.1 и более ранние) будет игнорировать учетные данные, если они содержат токен, поскольку обычно это указывает на недолговечные учетные данные, которые долго не будут действительнымиДостаточно, чтобы завершить учебное задание или использовать конечную точку.

Если вы используете временные учетные данные, попробуйте заменить их постоянными или запустить из экземпляра ec2 (или записной книжки SageMaker!), который имеет соответствующий экземплярРоль назначена.

Кроме того, обработка учетных данных sagemaker sdk изменена в v1.11.2 и более поздних версиях - временные учетные данные будут переданы в контейнеры локального режима, но с предупреждением.Таким образом, вы можете просто перейти на более новую версию и повторить попытку (pip install -U sagemaker).

Кроме того, попробуйте обновить boto3, может измениться, поэтому попробуйте использовать последнюю версию.

0 голосов
/ 07 октября 2018

Я предполагаю, что используемая вами библиотека имеет boto3 в своей основе.boto3 сообщает , что вам доступно несколько методов аутентификации .

  • Передача учетных данных в качестве параметров в методе boto.client ()
  • Передача учетных данныхв качестве параметров при создании объекта Session
  • Переменные среды
  • Общий файл учетных данных (~ / .aws / credentials)
  • Файл конфигурации AWS (~ / .aws / config)
  • Предположим, поставщик роли
  • Файл конфигурации Boto2 (/etc/boto.cfg и ~ / .boto)
  • Служба метаданных экземпляра на экземпляре Amazon EC2, для которого настроена роль IAM.

Но похоже, что у песочницы Docker нет доступа к вашему ~/.aws/credentials.conf файлу, поэтому я рассмотрю другие варианты, которые могут быть вам доступны.Поскольку я не знаком с докером, я не могу дать вам гарантированное решение для вашего сценария.

0 голосов
/ 10 октября 2018

Я только что подтвердил, что его пример работает на моей машине локально.Убедитесь, что используемая роль имеет разрешение на использование сегментов с именем, начинающимся с sagemaker.Sagemaker по умолчанию создает сегменты с префиксом sagemaker.

0 голосов
/ 07 октября 2018

Похоже, у вас есть учетные данные, настроенные на вашем хосте на ~/.aws/credentials, но вы пытаетесь получить к ним доступ в док-контейнере, работающем на хосте.

Кажется, что самое простое решение - монтирование ваших учетных данных awsна контейнере в ожидаемом месте.Вы, кажется, используете изображение sagemaker-mxnet:1.1.0-gpu-py2, которое использует пользователя root.Исходя из этого, если вы обновите тома в своем файле docker-compose для algo-1-1DUU4, включив в него:

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

, это сменит ваши учетные данные на пользователя root в вашем контейнере, так что ваш pythonскрипт должен иметь к ним доступ.

...