AWS SageMaker PyTorch: нет модуля с именем 'sagemaker' - PullRequest
0 голосов
/ 08 февраля 2020

Я развернул модель PyTorch на AWS с SageMaker, и я пытаюсь отправить запрос на тестирование сервиса. Тем не менее, я получил очень расплывчатое сообщение об ошибке «ни один модуль с именем sagemaker». Я пытался выполнить поиск в Интернете, но не могу найти сообщения о похожих сообщениях.

Код моего клиента:

import numpy as np
from sagemaker.pytorch.model import PyTorchPredictor

ENDPOINT = '<endpoint name>'

predictor = PyTorchPredictor(ENDPOINT)
predictor.predict(np.random.random_sample([1, 3, 224, 224]).tobytes())

Подробное сообщение об ошибке:

Traceback (most recent call last):
  File "client.py", line 7, in <module>
    predictor.predict(np.random.random_sample([1, 3, 224, 224]).tobytes())
  File "/Users/jiashenc/Env/py3/lib/python3.7/site-packages/sagemaker/predictor.py", line 110, in predict
    response = self.sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
  File "/Users/jiashenc/Env/py3/lib/python3.7/site-packages/botocore/client.py", line 276, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/jiashenc/Env/py3/lib/python3.7/site-packages/botocore/client.py", line 586, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.ModelError: An error occurred (ModelError) when calling the InvokeEndpoint operation: Received server error (500) from model with message "No module named 'sagemaker'". See https://us-east-2.console.aws.amazon.com/cloudwatch/home?region=us-east-2#logEventViewer:group=/aws/sagemaker/Endpoints/<endpoint name> in account xxxxxxxxxxxxxx for more information.

Эта ошибка поскольку я объединяю и обслуживающий сценарий, и мой сценарий развертывания, см. ниже

import os
import torch
import numpy as np
from sagemaker.pytorch.model import PyTorchModel
from torch import cuda
from torchvision.models import resnet50


def model_fn(model_dir):
    device = torch.device('cuda' if cuda.is_available() else 'cpu')
    model = resnet50()
    with open(os.path.join(model_dir, 'model.pth'), 'rb') as f:
        model.load_state_dict(torch.load(f, map_location=device))
    return model.to(device)

def predict_fn(input_data, model):
    device = torch.device('cuda' if cuda.is_available() else 'cpu')
    model.eval()
    with torch.no_grad():
        return model(input_data.to(device))


if __name__ == '__main__':
    pytorch_model = PyTorchModel(model_data='s3://<bucket name>/resnet50/model.tar.gz',
                                    entry_point='serve.py', role='jiashenC-sagemaker',
                                    py_version='py3', framework_version='1.3.1')
    predictor = pytorch_model.deploy(instance_type='ml.t2.medium', initial_instance_count=1)
    print(predictor.predict(np.random.random_sample([1, 3, 224, 224]).astype(np.float32)))

Причина root - 4-я строка в моем коде. Он пытается импортировать sagemaker, который является недоступной библиотекой.

1 Ответ

1 голос
/ 08 февраля 2020

(редактировать 2/9/2020 с дополнительными фрагментами кода)

Ваш код обслуживания пытается использовать модуль sagemaker для внутреннего использования. Модуль sagemaker (также называемый SageMaker Python SDK , один из многочисленных оркестровочных SDK для SageMaker) предназначен не для использования в модельных контейнерах, а вместо моделей для управления их активностью ( поезд, развертывание, байесовский тюнинг и др. c). В вашем конкретном примере c вы не должны включать код развертывания и модели кода вызова для кода сервера, поскольку на самом деле это действия, которые будут выполняться извне сервера для организации его жизненного цикла и взаимодействия с ним. Для развертывания модели с контейнером Sagemaker Pytorch ваш сценарий точки входа просто должен содержать требуемую функцию model_fn для десериализации модели и, необязательно, input_fn, predict_fn и output_fn соответственно для предварительной обработки, вывода и постобработка ( подробно описано в документации здесь ). Эта логика c прекрасна :): вам больше ничего не нужно для развертывания готового к работе сервера глубокого обучения! (MMS в случае Pytorch и M XNet, Flask + Gunicorn в случае sklearn).

Итак, ваш код должен быть разделен следующим образом:

скрипт entry_point serve.py, который содержит код обслуживания модели и выглядит следующим образом:

import os

import numpy as np
import torch
from torch import cuda
from torchvision.models import resnet50

def model_fn(model_dir):
    # TODO instantiate a model from its artifact stored in model_dir
    return model

def predict_fn(input_data, model):
    # TODO apply model to the input_data, return result of interest
    return result

и некоторый код оркестрации для создания экземпляра объекта модели SageMaker, развертывания его на сервере и запроса к нему. Он запускается из выбранной вами среды оркестровки, которая может быть ноутбуком SageMaker, вашим ноутбуком, функцией AWS Lambda, оператором Apache Airflow и т. Д. c - и с SDK на ваш выбор; для этого не нужно использовать python.

import numpy as np
from sagemaker.pytorch.model import PyTorchModel

pytorch_model = PyTorchModel(
    model_data='s3://<bucket name>/resnet50/model.tar.gz',
    entry_point='serve.py',
    role='jiashenC-sagemaker',
    py_version='py3',
    framework_version='1.3.1')

predictor = pytorch_model.deploy(instance_type='ml.t2.medium', initial_instance_count=1)

print(predictor.predict(np.random.random_sample([1, 3, 224, 224]).astype(np.float32)))
...