#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 НАСТОЛЬКО ПЛОХА, что заставляет меня задаться вопросом, почему я плачу за такую услугу.