本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
调整自己的推理容器
如果没有亚马逊 SageMaker 预构建的推理容器足以满足您的情况,并且您想使用自己的 Docker 容器,请使用SageMaker 推理工具包
推理代码包括推理处理程序、处理程序服务和入口点。在此示例中,它们存储为三个独立的 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_fn
function. 以下简单示例显示了一个实施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_fn
function. 以下示例显示的是一个简单实施的input_fn
function.
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_fn
function. 下面显示了一个简单的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 步:实现处理程序服务
处理程序服务由模型服务器执行。处理程序服务实现initialize
和handle
方法。这些区域有:initialize
方法在模型服务器启动时被调用,而handle
方法将针对发送给模型服务器的所有传入推理请求调用。有关更多信息,请参阅 。自定义服务
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 使用自己的算法容器多模型终端节点