AWS SageMaker — Как загрузить обученную модель sklearn для вывода?

#amazon-web-services #amazon-s3 #scikit-learn #amazon-sagemaker

#amazon-web-services #amazon-s3 #scikit-learn #amazon-sagemaker

Вопрос:

Я пытаюсь развернуть модель, обученную с помощью sklearn, на конечной точке и использовать ее в качестве API для прогнозирования. Все, для чего я хочу использовать sagemaker, — это развернуть и использовать модель сервера, которую я сериализовал joblib , не более того. каждый прочитанный мной блог и документация sagemaker по python показали, что модель sklearn должна была быть обучена на sagemaker для развертывания в sagemaker.

Когда я просматривал документацию SageMaker, я узнал, что sagemaker позволяет пользователям загружать сериализованную модель, хранящуюся в S3, как показано ниже:

 def model_fn(model_dir):
    clf = joblib.load(os.path.join(model_dir, "model.joblib"))
    return clf
 

И это то, что говорится в документации об аргументе model_dir :

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

Это снова означает, что обучение должно выполняться на sagemaker.

Итак, есть ли способ, которым я могу просто указать местоположение S3 моей сериализованной модели и попросить sagemaker де-сериализовать (или загрузить) модель из S3 и использовать ее для вывода?

РЕДАКТИРОВАТЬ 1:

Я использовал код в ответе на свое приложение, и при попытке развертывания из ноутбука SageMaker studio я получил ошибку ниже. Я полагаю, что SageMaker кричит, что обучение не проводилось на SageMaker.

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-6662bbae6010> in <module>
      1 predictor = model.deploy(
      2     initial_instance_count=1,
----> 3     instance_type='ml.m4.xlarge'
      4 )

/opt/conda/lib/python3.7/site-packages/sagemaker/estimator.py in deploy(self, initial_instance_count, instance_type, serializer, deserializer, accelerator_type, endpoint_name, use_compiled_model, wait, model_name, kms_key, data_capture_config, tags, **kwargs)
    770         """
    771         removed_kwargs("update_endpoint", kwargs)
--> 772         self._ensure_latest_training_job()
    773         self._ensure_base_job_name()
    774         default_name = name_from_base(self.base_job_name)

/opt/conda/lib/python3.7/site-packages/sagemaker/estimator.py in _ensure_latest_training_job(self, error_message)
   1128         """
   1129         if self.latest_training_job is None:
-> 1130             raise ValueError(error_message)
   1131 
   1132     delete_endpoint = removed_function("delete_endpoint")

ValueError: Estimator is not associated with a training job
 

Мой код:

 import sagemaker
from sagemaker import get_execution_role
# from sagemaker.pytorch import PyTorchModel
from sagemaker.sklearn import SKLearn
from sagemaker.predictor import RealTimePredictor, json_serializer, json_deserializer

sm_role = sagemaker.get_execution_role()  # IAM role to run SageMaker, access S3 and ECR

model_file = "s3://sagemaker-manual-bucket/sm_model_artifacts/model.tar.gz"   # Must be ".tar.gz" suffix

class AnalysisClass(RealTimePredictor):
    def __init__(self, endpoint_name, sagemaker_session):
        super().__init__(
            endpoint_name,
            sagemaker_session=sagemaker_session,
            serializer=json_serializer,
            deserializer=json_deserializer,   # To be able to use JSON serialization
            content_type='application/json'   # To be able to send JSON as HTTP body
        )

model = SKLearn(model_data=model_file,
                entry_point='inference.py',
                name='rf_try_1',
                role=sm_role,
                source_dir='code',
                framework_version='0.20.0',
                instance_count=1,
                instance_type='ml.m4.xlarge',
                predictor_cls=AnalysisClass)
predictor = model.deploy(initial_instance_count=1,
                         instance_type='ml.m4.xlarge')
 

Ответ №1:

Да, вы можете. Документация AWS фокусируется на сквозном процессе от обучения до развертывания в SageMaker, что создает впечатление, что обучение должно проводиться на sagemaker. Документация и примеры AWS должны иметь четкое разделение между обучением в оценщике, сохранением и загрузкой модели и моделью развертывания в конечной точке SageMaker.

Модель SageMaker

Вам необходимо создать ресурс AWS :: SageMaker ::Model, который ссылается на «модель», которую вы обучили, и многое другое. AWS ::SageMaker::Model находится в документе CloudFormation, но он предназначен только для объяснения того, какой ресурс AWS вам нужен.

API CreateModel создает ресурс модели SageMaker. Параметры определяют используемый образ docker, расположение модели в S3, роль IAM для использования и т. Д. Посмотрите, как SageMaker загружает артефакты вашей модели.

Изображение Docker

Очевидно, вам нужна платформа, например, ScikitLearn, TensorFlow, PyTorch и т. Д., Которую вы использовали для обучения своей модели для получения выводов. Вам нужен образ docker, содержащий фреймворк, и интерфейс HTTP для ответа на вызовы прогнозирования. См. раздел Инструментарий для вывода SageMaker и использование наборов инструментов для обучения и вывода SageMaker.

Построить образ непросто. Следовательно, AWS предоставляет готовые изображения, называемые контейнерами глубокого обучения AWS, а доступные изображения находятся в Github.

Если там указана ваша платформа и версия, вы можете использовать ее в качестве изображения. В противном случае вам нужно создавать самостоятельно. См. раздел Создание контейнера docker для обучения / развертывания нашего классификатора.

SageMaker Python SDK для фреймворков

Создать модель SageMaker самостоятельно с помощью API сложно. Следовательно, AWS SageMaker Python SDK предоставляет утилиты для создания моделей SageMaker для нескольких фреймворков. Доступные фреймворки см. в разделе Фреймворки. Если ее там нет, вы все равно сможете использовать sagemaker.model .FrameworkModel и Model для загрузки обученной модели. В вашем случае см. раздел Использование Scikit-learn с помощью SageMaker Python SDK.

model.tar.gz

Например, если вы использовали PyTorch и сохранили модель как model.pth. Чтобы загрузить модель и код вывода для получения прогноза из модели, вам необходимо создать model.tar.gz досье. Структура внутри model.tar.gz это объясняется в Структуре каталогов модели. Если вы используете Windows, остерегайтесь перехода от CRLF к LF. AWS SageMaker работает в среде * NIX. См. раздел Создание структуры каталогов для файлов модели.

 |- model.pth        # model file is inside / directory.
|- code/            # Code artefacts must be inside /code
  |- inference.py   # Your inference code for the framework
  |- requirements.txt  # only for versions 1.3.1 and higher. Name must be "requirements.txt"
 

Сохраните tar.gz файл в S3. Убедитесь в роли IAM для доступа к корзине и объектам S3.

Загрузка модели и получение вывода

См. раздел Создание объекта PyTorchModel. При создании экземпляра класса PyTorchModel SageMaker автоматически выбирает образ контейнера AWS Deep Learning для PyTorch для версии, указанной в framework_version. Если изображение для версии не существует, это означает сбой. Это не было задокументировано в AWS, но об этом нужно знать. Затем SageMaker внутренне вызывает API CreateModel с указанием местоположения файла модели S3 и URL-адреса контейнера для глубокого обучения AWS.

 import sagemaker
from sagemaker import get_execution_role
from sagemaker.pytorch import PyTorchModel
from sagemaker.predictor import RealTimePredictor, json_serializer, json_deserializer

role = sagemaker.get_execution_role()  # IAM role to run SageMaker, access S3 and ECR
model_file = "s3://YOUR_BUCKET/YOUR_FOLDER/model.tar.gz"   # Must be ".tar.gz" suffix


class AnalysisClass(RealTimePredictor):
    def __init__(self, endpoint_name, sagemaker_session):
        super().__init__(
            endpoint_name,
            sagemaker_session=sagemaker_session,
            serializer=json_serializer,
            deserializer=json_deserializer,   # To be able to use JSON serialization
            content_type='application/json'   # To be able to send JSON as HTTP body
        )

model = PyTorchModel(
    model_data=model_file,
    name='YOUR_MODEL_NAME_WHATEVER',
    role=role,
    entry_point='inference.py',
    source_dir='code',              # Location of the inference code
    framework_version='1.5.0',      # Availble AWS Deep Learning PyTorch container version must be specified
    predictor_cls=AnalysisClass     # To specify the HTTP request body format (application/json)
)

predictor = model.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.xlarge'
)

test_data = {"body": "YOUR PREDICTION REQUEST"}
prediction = predictor.predict(test_data)
 

По умолчанию SageMaker использует NumPy в качестве формата сериализации. Чтобы иметь возможность использовать JSON, необходимо указать сериализатор и content_type . Вместо использования класса RealTimePredictor вы можете указать их в predictor .

 predictor.serializer=json_serializer
predictor.predict(test_data)
 

Или

 predictor.serializer=None # As the serializer is None, predictor won't serialize the data
serialized_test_data=json.dumps(test_data) 
predictor.predict(serialized_test_data)
 

Пример кода вывода

Смотрите Ввод модели процесса, получайте прогнозы из модели PyTorch и вывод модели процесса. В этом примере запрос на прогнозирование отправляется в виде JSON в теле HTTP-запроса.

 import os
import sys
import datetime
import json
import torch
import numpy as np

CONTENT_TYPE_JSON = 'application/json'

def model_fn(model_dir):
    # SageMaker automatically load the model.tar.gz from the S3 and 
    # mount the folders inside the docker container. The  'model_dir'
    # points to the root of the extracted tar.gz file.

    model_path = f'{model_dir}/'
    
    # Load the model
    # You can load whatever from the Internet, S3, wherever <--- Answer to your Question
    # NO Need to use the model in tar.gz. You can place a dummy model file.
    ...

    return model


def predict_fn(input_data, model):
    # Do your inference
    ...

def input_fn(serialized_input_data, content_type=CONTENT_TYPE_JSON):
    input_data = json.loads(serialized_input_data)
    return input_data


def output_fn(prediction_output, accept=CONTENT_TYPE_JSON):
    if accept == CONTENT_TYPE_JSON:
        return json.dumps(prediction_output), accept
    raise Exception('Unsupported content type') 
 

Похожие

Примечание

Команда SageMaker постоянно меняет реализации, а документация часто устаревает. Если вы уверены, что следовали документам, и это не работает, вполне вероятно, что устаревшая документация. В таком случае необходимо уточнить в службе поддержки AWS или открыть проблему в Github.

Комментарии:

1. sagemaker по-прежнему не позволяет мне использовать модели sklearn, которые не обучены на sagemaker. sagemaker по-прежнему кричит, что я не обучал модель на sagemaker. проверьте мое редактирование 1.

2. @NaveenKumar, потому что вы используете класс Estimator ( sagemaker.readthedocs.io/en/stable/frameworks/sklearn /… ) вместо модельных классов ( sagemaker.readthedocs.io/en/stable/frameworks/sklearn /… ). Используемый класс должен быть XXXModel .

3. @NaveenKumar, при обнаружении ошибки журнал обычно дает подсказку, в ошибке имя файла класса — «estimator».py, и будьте просто внимательны и подумайте: «Почему estimator ???», а также изучите код в github, чтобы найти возможные причины.

4. Мой плохой, извините @mon.

5. Я просто хочу добавить, что было крайне сложно развернуть модель обучения Scikit с использованием AWS Sagemaker. До сих пор эта запись была самой полезной информацией, которую я смог найти, спасибо @mon… Документация AWS Sagemaker НАСТОЛЬКО ПЛОХА, что заставляет меня задаться вопросом, почему я плачу за такую услугу.