当前位置: 首页 > 知识库问答 >
问题:

AWS SageMaker-如何加载训练有素的skLearning模型来进行推理?

鲁博赡
2023-03-14

我正在尝试将一个使用sklearn训练的模型部署到endpoint,并将其作为预测的API。我想使用sagemaker的目的就是部署和服务器模型,我已经使用joblib序列化了这个模型,仅此而已。我读过的每个博客和sagemaker python文档都表明,为了在sagemaker中部署,sklearn模型必须在sagemaker上进行培训。

在阅读SageMaker文档时,我了解到SageMaker允许用户加载存储在S3中的序列化模型,如下所示:

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

这是关于参数model\u dir的文档说明:

SageMaker将插入通过save保存的模型文件和子目录所在的目录。模型函数应返回可用于模型服务的模型对象。

这再次意味着必须在sagemaker上进行培训。

那么,有没有一种方法可以指定序列化模型的S3位置,让sagemaker从S3中反序列化(或加载)模型并使用它进行推断?

我在回答我的应用程序时使用了代码,当我试图从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个答案

许华清
2023-03-14

是的,你可以。AWS文档侧重于SageMaker中从培训到部署的端到端,给人的印象是培训必须在SageMaker上完成。AWS文档和示例应明确区分估计器培训、保存和加载模型以及到SageMakerendpoint的部署模型。

您需要创建AWS::SageMaker::Model资源,该资源引用您培训过的“模型”以及更多内容。AWS::SageMaker::Model在CloudFormation文档中,但它只是解释您需要什么AWS资源。

CreateModel API创建SageMaker模型资源。参数指定要使用的docker图像、S3中的模型位置、要使用的IAM角色等。请参阅SageMaker如何加载模型工件。

显然,您需要一个框架,例如ScikitLearn、TensorFlow、PyTorch等,您可以使用这些框架来训练您的模型以获得推论。您需要一个具有框架的docker映像和HTTP前端来响应预测调用。请参阅SageMaker推理工具包和使用SageMaker培训和推理工具包。

建立形象并不容易。因此,AWS提供了称为AWS深度学习容器的预构建图像,可用图像位于Github中。

如果您的框架和版本列在那里,您可以使用它作为图像。否则你需要自己建造。请参见构建用于训练/部署分类器的docker容器。

使用API自己创建SageMaker模型是很难的。因此,AWS SageMaker Python SDK提供了实用程序来为几个框架创建SageMaker模型。有关可用框架,请参阅框架。如果它不存在,您仍然可以使用sagemaker.model.FrameworkModel和Model来加载您训练的模型。对于您的案例,请参阅使用Scikit学习SageMaker Python SDK。

例如,如果使用PyTorch并将模型另存为model。甲状旁腺素。要加载模型和推理代码以从模型中获得预测,您需要创建一个模型。焦油gz文件。模型内部的结构。焦油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"

省省油吧。S3中的gz文件。确保IAM角色可以访问S3存储桶和对象。

请参见创建PyTorchModel对象。在实例化PyTorchModel类时,SageMaker会自动为PyTorch选择AWS深度学习容器映像,该映像适用于framework_version中指定的版本。如果版本的映像不存在,则会失败。AWS中未记录这一点,但需要注意。然后,SageMaker使用S3模型文件位置和AWS深度学习容器图像URL在内部调用CreateModel API。

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.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模型和过程模型输出中获取预测。在此示例中,预测请求在HTTP请求正文中作为JSON发送。

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外部训练的模型

SageMaker团队不断更改实施,文档经常过时。当您确信您确实遵循了文档,但它不起作用时,很可能是过时的文档。在这种情况下,需要向AWS支持部门澄清,或者在Github中打开一个问题。

 类似资料:
  • 问题内容: 我想知道是否有可能保存经过部分训练的Keras模型并在再次加载模型后继续进行训练。 这样做的原因是,将来我将拥有更多的训练数据,并且我不想再次对整个模型进行训练。 我正在使用的功能是: 编辑1:添加了完全正常的示例 对于10个纪元后的第一个数据集,最后一个纪元的损失将为0.0748,精度为0.9863。 保存,删除和重新加载模型后,第二个数据集上训练的模型的损失和准确性分别为0.171

  • 本文向大家介绍pytorch 使用加载训练好的模型做inference,包括了pytorch 使用加载训练好的模型做inference的使用技巧和注意事项,需要的朋友参考一下 前提: 模型参数和结构是分别保存的 1、 构建模型(# load model graph) model = MODEL() 2、加载模型参数(# load model state_dict) (解决RuntimeError:

  • 在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰

  • 在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰

  • 我已经在AWS SageMaker上使用内置算法语义分割训练了一个模型。这个名为model.tar.gz的训练模型存储在S3上。所以我想从S3下载这个文件,然后使用它在我的本地电脑上进行推断,而不使用AWS SageMaker。 以下是三个文件: > :包括网络架构、数据输入和训练的参数。请参阅语义分割超参数。 我的代码: 错误:

  • 我使用的OpenNLP模型如下: 我想把我的数据附加到训练数据集中,这些模型就是在这个数据集中训练的。那么请告诉我从哪里可以得到原始数据集?