自适应您自己的推理容器 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自适应您自己的推理容器

如果 Amazon SageMaker 预构建的推理容器都不足以满足您的情况,并且您希望使用自己的 Docker 容器,请使用SageMaker 推理工具包来调整您的容器以使用 SageMaker 托管。要调整容器以使用 SageMaker 托管,请在一个或多个 Python 脚本文件中创建推断代码和 Dockerfile,它导入推理工具包。

推断代码包括推理处理程序、处理程序服务和入口点。在此示例中,它们存储为三个独立的 Python 文件。所有这三个 Python 文件都必须位于与 Dockerfile 位于同一目录中。

有关显示使用 SageMaker 推理工具包扩展容器的完整示例的 Jupyter 笔记本示例的示例,请参阅Amazon SageMaker 多模型终端节点使用您自己的算法容器.

第 1 步:创建推理处理程序

SageMaker 推理工具包是在多模型服务器 (MMS) 上构建的。MMS 需要使用一个 Python 脚本,它实施一些函数以加载模型、预处理输入数据、从模型中获得结果以及在模型处理程序中处理输出数据。

模型 Fn 函数

这些区域有:model_fn函数负责加载模型。它需要一个model_dir参数,该参数指定模型的存储位置。如何加载模型取决于您正在使用的框架。没有默认实现model_fnfunction. 你必须自己实现它。以下简单示例是一个实施model_fn函数来加载 PyTorch 模型:

def model_fn(self, model_dir): import torch logger.info('model_fn') device = "cuda" if torch.cuda.is_available() else "cpu" with open(os.path.join(model_dir, 'model.pth'), 'rb') as f: model = torch.jit.load(f) return model.to(device)

输入函数

这些区域有:input_fn函数负责反序列化输入数据,以便它可以传递给模型。它将输入数据和内容类型作为参数,并返回反序列化的数据。SageMaker 推理工具包提供了用于反序列化以下内容类型的默认实现:

  • JSON

  • CSV

  • NumPy 数组

  • NPZ

如果模型需要不同的内容类型,或者希望在将输入数据发送到模型之前预处理输入数据,则必须实现input_fnfunction. 以下示例是一个简单的实施input_fnfunction.

from sagemaker_inference import content_types, decoder def input_fn(self, input_data, content_type): """A default input_fn that can handle JSON, CSV and NPZ formats. Args: input_data: the request payload serialized in the content_type format content_type: the request content_type Returns: input_data deserialized into torch.FloatTensor or torch.cuda.FloatTensor depending if cuda is available. """ return decoder.decode(input_data, content_type)

预测函数

这些区域有:predict_fn函数负责从模型中获取预测值。它接受模型和从input_fn作为参数,并返回预测值。没有默认实现predict_fn. 你必须自己实现它。以下是一个简单的实施predict_fn函数,用于 PyTorch 模型。

def predict_fn(self, data, model): """A default predict_fn for PyTorch. Calls a model on data deserialized in input_fn. Runs prediction on GPU if cuda is available. Args: data: input data (torch.Tensor) for prediction deserialized by input_fn model: PyTorch model loaded in memory by model_fn Returns: a prediction """ return model(input_data)

输出 Fn 函数

这些区域有:output_fn函数负责序列化predict_fn函数返回为预测值。SageMaker 推理工具包实现了默认的output_fn函数,用于序列化 Numpy 数组,JSON 和 CSV。如果您的模型输出任何其他内容类型,或者您希望在将数据发送给用户之前执行其他后期处理,则必须实现您自己的output_fnfunction. 下面显示了一个简单的output_fn函数,用于 PyTorch 模型。

from sagemaker_inference import encoder def output_fn(self, prediction, accept): """A default output_fn for PyTorch. Serializes predictions from predict_fn to JSON, CSV or NPY format. Args: prediction: a prediction result from predict_fn accept: type which the output data needs to be serialized Returns: output data serialized """ return encoder.encode(prediction, accept)

第 2 步:实现处理程序服务

处理程序服务由模型服务器执行。处理程序服务实现initializehandle方法。这些区域有:initialize方法在模型服务器启动时被调用,handle方法对发送给模型服务器的所有传入推理请求进行调用。有关更多信息,请参阅 。自定义服务在多模型服务器文档中。以下是 PyTorch 模型服务器的处理程序服务示例。

from sagemaker_inference.default_handler_service import DefaultHandlerService from sagemaker_inference.transformer import Transformer from sagemaker_pytorch_serving_container.default_inference_handler import DefaultPytorchInferenceHandler class HandlerService(DefaultHandlerService): """Handler service that is executed by the model server. Determines specific default inference handlers to use based on model being used. This class extends ``DefaultHandlerService``, which define the following: - The ``handle`` method is invoked for all incoming inference requests to the model server. - The ``initialize`` method is invoked at model server start up. Based on: https://github.com/awslabs/mxnet-model-server/blob/master/docs/custom_service.md """ def __init__(self): transformer = Transformer(default_inference_handler=DefaultPytorchInferenceHandler()) super(HandlerService, self).__init__(transformer=transformer)

第 3 步:实施入口点

入口点通过调用处理程序服务启动模型服务器。您可以在 Dockerfile 中指定入口点的位置。以下是入口点示例。

from sagemaker_inference import model_server model_server.start_model_server(handler_service=HANDLER_SERVICE)

第 4 步:编写 Dockerfile

在您的Dockerfile,请从步骤 2 中复制模型处理程序,并将上一步中的 Python 文件指定为入口点。Dockerfile. 以下是您可以添加到 Docker 文件中以复制模型处理程序并指定入口点的行示例。有关推理容器的 Dockerfile 的完整示例,请参阅Dockerfile.

# Copy the default custom service file to handle incoming data and inference requests COPY model_handler.py /home/model-server/model_handler.py # Define an entrypoint script for the docker image ENTRYPOINT ["python", "/usr/local/bin/entrypoint.py"]

第 5 步:构建和注册您的容器

现在,您可以构建容器并在 Amazon Elastic Container Registry (Amazon ECR) 中注册容器。示例笔记本中的以下 Shell 脚本构建容器,并将其上传到Amazonaccount.

注意

SageMaker 托管支持使用存储在亚马逊 ECR 以外的存储库中的推理容器。有关信息,请参阅 对实时推理容器使用私有 Docker 注册表

以下 shell 脚本显示了如何构建和注册容器。

%%sh # The name of our algorithm algorithm_name=demo-sagemaker-multimodel cd container account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null # Get the login command from ECR and execute it directly $(aws ecr get-login --region ${region} --no-include-email) # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -q -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}

现在,您可以使用此容器在 SageMaker 中部署终端节点。有关如何在 SageMaker 中部署终端节点的示例,请参阅将模型部署到 SageMaker 托管服务中.