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

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

调整自己的推理容器

如果没有亚马逊 SageMaker 预构建的推理容器足以满足您的情况,并且您想使用自己的 Docker 容器,请使用SageMaker 推理工具包调整你的容器以使用 SageMaker 托管。调整容器以使其使用 SageMaker 托管,在一个或多个 Python 脚本文件中创建推理代码和 Dockerfile那会导入推理工具包。

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

有关 Jupyter 笔记本的示例,该笔记本显示了使用 SageMaker 推理工具包,请参阅亚马逊 SageMaker 使用自己的算法容器多模型终端节点.

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

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

model_fn 函数

有默认的实现model_fn函数,命名为default_model_fn,在 SageMaker PyTorch 和 MxNet 推理工具包。默认实现会加载使用 torchscript 保存的模型(格式).pt要么.pth. 如果模型需要自定义方法来加载,或者要在加载模型时执行额外的步骤,则必须实现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 函数

这些区域有: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)

预测_fn 函数

这些区域有: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(data)

output_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. 以下是可以添加到 Dockerfile 中以复制模型处理程序并指定入口点的行的示例。有关推理容器的 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 脚本构建容器并将其上传至您的 Amazon ECR 存储库。Amazonaccount.

注意

SageMaker 托管支持使用存储在 Amazon 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-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # 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 使用自己的算法容器多模型终端节点.