您今天与之交互的许多服务都依赖于机器学习(ML)。从在线搜索和产品推荐到语音识别和语言翻译,这些服务都需要ML模型来进行预测。随着ML进入更多服务领域,您将面临以下挑战:获得辛勤工作的结果,并快速可靠地将模型部署到生产环境。随着使用这些服务的人数的增加,确保这些模型同时安全可靠地向数百万用户提供低延迟预测变得更具挑战性。

开发人员使用许多不同的开源框架进行模型开发。在过去的几年中,PyTorch已成为许多开发基于ML的应用程序的研究人员,开发人员和数据科学家的首选深度学习框架。他们更喜欢PyTorch,因为它具有简单的Python语言实现和训练模型的方式,以及能够在渴望和图形模式之间无缝切换的能力。但是,到目前为止,在大规模生产中使用PyTorch模型并不是一种简单且受本地支持的方法。

AWS很高兴分享TorchServe的实验版本,TorchServe是PyTorch的开源模型服务库。

AWS与Facebook合作开发了TorchServe。AWS和Facebook将与更广泛的PyTorch社区一起维护并继续为TorchServe做出贡献。由于超过83%的基于云的PyTorch项目都在AWS上进行,我们很高兴推出TorchServe,以解决部署PyTorch模型的难题。借助TorchServe,您可以使用TorchScript在急切或图形模式下部署PyTorch模型,同时提供多个模型,用于A / B测试的版本生产模型,动态加载和卸载模型,以及监视详细的日志和可自定义的指标。

TorchServe易于使用。它带有一个方便的CLI,可以在本地部署,并且可以轻松打包到容器中,并可以通过Amazon SageMaker或Amazon EKS进行横向扩展。使用针对常见问题(例如图像分类,对象检测,图像分割和文本分类)的默认处理程序,您只需部署几行代码即可进行部署-无需再为初始化,预处理和后处理编写冗长的服务处理程序。TorchServe是开源的,这意味着它是完全开放的并可扩展的,可以满足您的部署需求。

这篇文章深入研究了TorchServe,其主要特性和功能以及如何使用它。它提供了代码示例来说明其优势和关键概念,还显示了使用TorchServe和Amazon SageMaker扩展PyTorch推理的示例。

pytorch SE模块 pytorch serving_自定义

在TorchServe发行之前,如果您想服务PyTorch模型,则必须开发自己的模型服务解决方案。您必须为模型开发自定义处理程序,开发模型服务器,构建自己的Docker容器,弄清楚如何使其能够通过网络访问并将其与集群编排系统集成,等等。

使用TorchServe,您可以立即使用许多功能。它为您提供了充分的灵活性,可以大规模有效地部署经过训练的PyTorch模型,而不必为流行模型编写自定义处理程序。您只需几行代码就可以从训练有素的模型到生产部署。

TorchServe入门

TorchServe入门很容易。这篇文章在运行深度学习AMI的c5.xlarge Amazon EC2实例上测试了示例。您也可以在本地笔记本电脑或台式机上尝试这些步骤。有关启动Amazon EC2实例的说明,请参阅《Amazon EC2入门》。

要安装TorchServe,请按照GitHub上的说明进行操作。建议使用Conda或其他虚拟环境来管理依赖项。安装TorchServe之后,您可以通过完成以下步骤来部署第一个模型:

下载TorchServe存储库以访问示例。运行以下代码:

mkdir torchserve-examples
cd torchserve-examples
git clone https://github.com/pytorch/serve.git
  1. 从官方PyTorch模型库下载DenseNet图像分类模型。运行以下代码:
wget https://download.pytorch.org/models/densenet161-8d451a50.pth
  1. 将模型从PyTorch转换为TorchServe格式。 TorchServe使用扩展名为.mar的模型存档格式。.mar文件使用state_dict(将每个图层映射到其参数张量的字典对象)打包模型检查点或模型定义文件。您可以torch-model-archiver在TorchServe中使用该工具来创建.mar文件。您无需创建自定义处理程序,只需指定即可--handler image_classifier,它会自动为您设置处理程序。现在您已经拥有.mar文件,请使用TorchServe托管它。运行以下代码:
torch-model-archiver --model-name densenet161 \
--version 1.0 --model-file serve/examples/image_classifier/densenet_161/model.py \
--serialized-file densenet161-8d451a50.pth \
--extra-files serve/examples/image_classifier/index_to_name.json \
--handler image_classifier
ls *.mar

您收到以下输出:

densenet161.mar serve
  1. 主持模型。运行以下代码:
mkdir model_store
mv densenet161.mar model_store/
torchserve --start --model-store model_store --models densenet161=densenet161.mar
  1. 通过在同一主机上打开另一个终端并运行以下代码来测试TorchServe(您可以使用tmux来管理多个会话):
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
curl -X POST http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg

您收到以下输出:

[
 {
 "tiger_cat": 0.4693356156349182
 },
 {
 "tabby": 0.46338796615600586
 },
 {
 "Egyptian_cat": 0.06456131488084793
 },
 {
 "lynx": 0.0012828155886381865
 },
 {
 "plastic_bag": 0.00023323005007114261
 }
]

具有默认处理程序的标准模型的零代码更改部署

许多深度学习用例属于以下类别之一:图像分类,对象检测,图像分割和文本分类。如果您正在使用这些应用程序之一,则可以像上一节中所述那样零代码更改地进行部署。您无需从eager转换为TorchScript,反之亦然,也无需编写服务处理程序进行初始化,预处理和后处理。

TorchServetorch-model-archiver工具可以自动检测和处理PyTorch的不同表示形式(热切模式和TorchScript)。对于TorchVision,TorchText和TorchAudio等程序包支持的常见模型,torch-model-archiver使用默认处理程序进行初始化,预处理和后处理。如果您具有自定义模型或想要引入自定义逻辑以扩展默认处理程序,则仍可以编写自定义处理程序。

有关受支持的默认处理程序的完整列表,请参见GitHub repo。有关编写自己的自定义处理程序的说明,请参见GitHub repo。

托管多个模型并扩展工作人员

TorchServe提供了一个管理API,用于列出已注册的模型,将新模型注册到现有服务器,取消注册当前模型,增加或减少每个模型的工作人员数量,描述模型的状态,添加版本以及设置默认版本。Management API正在端口8081上侦听,并且默认情况下只能从localhost访问,但是您可以更改默认行为。

要注册新模型,请完成以下步骤:

  1. 使用以下代码下载新模型:
wget https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
torch-model-archiver --model-name fastrcnn --version 1.0 \
--model-file serve/examples/object_detector/fast-rcnn/model.py \
--serialized-file fasterrcnn_resnet50_fpn_coco-258fb6c6.pth \
--handler object_detector \
--extra-files serve/examples/object_detector/index_to_name.json
mv fastrcnn.mar model_store/
  1. 使用以下代码注册新模型:
curl -X POST "http://localhost:8081/models?url=fastrcnn.mar"

您收到以下输出:

{
 "status": "Model \"fastrcnn\" registered"
}

您还可以使用以下代码查询已注册模型的列表:

curl "http://localhost:8081/models"

您收到以下输出:

{
    "models": [
        {
            "modelName": "densenet161",
            "modelUrl": "densenet161.mar"
        },
        {
            "modelName": "fastrcnn",
            "modelUrl": "fastrcnn.mar"
        }
    ]
}
  1. 缩放模型工人。没有为新模型分配工人,因此请使用以下代码设置最小工人数:
curl -v -X PUT "http://localhost:8081/models/fastrcnn?min_worker=2"
curl "http://localhost:8081/models/fastrcnn"

您收到以下输出:

[
  {
    "modelName": "fastrcnn",
    "modelVersion": "1.0",
    "modelUrl": "fastrcnn.mar",
    "runtime": "python",
    "minWorkers": 2,
    "maxWorkers": 2,
    "batchSize": 1,
    "maxBatchDelay": 100,
…
…

如果您的模型托管在具有许多核心的CPU上,例如具有96个vCPU的c5.24xlarge EC2实例,则可以使用上述方法轻松扩展线程数。

  1. 使用以下代码注销模型:
curl -X DELETE http://localhost:8081/models/fastrcnn/
  1. 要对模型进行版本控制,请在调用时torch-model-archiver,将版本号传递给--version请参见以下代码:
torch-model-archiver --model-name fastrcnn --version 1.0 ...

运行批次预测(或批次推断)

对于某些应用程序,您可能需要分批运行推理。如果您有一个庞大的数据集,并希望离线生成推理,则将数据集分成大批并进行处理在计算上会更有效。在某些实时的用例中,您可以拥有更宽容的延迟预算,您可以分批处理多个请求并提供结果,并提高资源利用率并减少流程中的运营支出。批处理的另一个用例是在训练新模型之前用其他模型预处理训练数据。

TorchServe本机支持批量推理。有关运行TorchServe批处理推断的说明,请参见GitHub repo。

记录和指标

TorchServe使您可以轻松访问完全可自定义的日志和指标。默认情况下,TorchServe将日志消息打印到stderr和stout。TorchServe使用log4j,您可以通过修改log4j属性来自定义日志记录。

TorchServe也收集系统级的指标,如CPUUtilization,DiskUtilization在默认情况下,和其他人。您还可以使用指标API指定自定义指标。以下屏幕快照显示了从TorchServe请求推理时的默认日志输出。

pytorch SE模块 pytorch serving_深度学习_02

使用TorchServe和Amazon SageMaker的大规模PyTorch部署