亚马逊AWS官方博客

宣布推出 TorchServe – 适用于 PyTorch 的开源模型服务器

PyTorch 是最受欢迎的开源深度学习库之一。开发人员和研究人员钟爱其在构建和训练模型方面提供的灵活性。然而,这只是它的诸多优点之一。在生产中部署和管理模型通常是机器学习过程中最困难的部分,这项工作包括构建定制的预测 API,对其进行扩展,并加以保护等等。

简化模型部署过程的一种方法是使用模型服务器,即专门设计用于在生产中提供机器学习预测的现成的 Web 应用程序。模型服务器可轻松加载一个或多个模型,并自动创建由可扩展 Web 服务器提供支持的预测 API。模型服务器还可以根据预测请求运行代码预处理和后处理。最后同样重要的一点是,模型服务器还提供对生产至关重要的功能,例如日志记录、监控和安全性等。广为使用的模型服务器有 TensorFlow ServingMulti Model Server

今天,我非常荣幸地宣布推出 TorchServe,这是一个 PyTorch 模型服务库,可使大规模部署经过训练的 PyTorch 更加轻松,不需要编写自定义代码。

隆重推出 TorchServe

TorchServe 由 AWS 和 Facebook 合作推出,并作为 PyTorch 开源项目的一部分提供。如果您对如何启动该项目感兴趣,可以阅读 Github 上的初始 RFC

通过 TorchServe,PyTorch 现在可以更快地将其模型投入生产,而无需编写自定义代码:除了提供低延迟预测 API 之外,TorchServe 还为诸如对象检测和文本分类等常用应用程序嵌入了默认处理程序。此外,TorchServe 还包括多模型服务、A/B 测试模型版本控制、监控指标以及用于集成应用程序的 RESTful 终端节点。不负众望,TorchServe 支持任何机器学习环境,包括 Amazon SageMaker、容器服务和 Amazon Elastic Compute Cloud (EC2)

一些客户已经在享受 TorchServe 带来的好处了。

Toyota Research Institute Advanced Development, Inc. (TRI-AD) 正在为 Toyota Motor Corporation 开发自动驾驶软件。TRI-AD 的机器学习工具负责人 Yusuke Yachide 说:“我们不断优化和改进计算机视觉模型,这一点非常重要,因为 TRI-AD 的使命是通过自动驾驶实现所有人的安全出行。我们的模型 在 AWS 上通过 PyTorch 进行训练,但此前 PyTorch 一直缺少一个模型服务框架。因此,我们不得不投入大量工程资源来创建和维护软件,以便将 PyTorch 模型部署到我们的车队和云服务器。有了 TorchServe,我们现在拥有了高性能的轻量级模型服务器,该服务器由 AWS 和 PyTorch 社区正式提供支持和维护。”

Matroid 是计算机视觉软件的制造商,其软件产品可检测视频镜头中的对象和事件。Matroid Inc. 的创始人兼首席执行官 Reza Zadeh 说:“我们在 AWS 和本地环境上使用 PyTorch 开发的机器学习模型数量迅速增长。使用自定义模型服务器部署模型时,服务器需要将模型转换为其他格式,这既费时又麻烦。TorchServe 让我们能够使用单个可服务文件简化模型部署,该文件同时也将作为真实情况的单一来源,因此易于共享和管理。”

下面,我将为大家演示如何安装 TorchServe,以及如何在 Amazon Elastic Compute Cloud (EC2) 上加载预训练过的模型。您可以按照文档中的说明尝试其他环境。

安装 TorchServe

首先,启动一个基于 CPU 的 Amazon Elastic Compute Cloud (EC2) 实例,运行 Deep Learning AMI(Ubuntu 版本)。此 AMI 预先安装了我需要的若干依赖项,这可以加快设置速度。当然,您可以使用任何其他 AMI 来代替。

TorchServe 由 Java 实现,因此需要最新版本的 OpenJDK 来运行。

sudo apt install openjdk-11-jdk

接下来,为 TorchServe 创建一个新 Conda 环境并激活。这样做可使我的 Python 软件包保持整洁(使用 virtualenv 也能得到类似的效果)。

conda create -n torchserve

source activate torchserve

接下来安装 TorchServe 的依赖项。

pip install sentencepiece       # not available as a Conda package

conda install psutil pytorch torchvision torchtext -c pytorch

如果要使用 GPU 实例,则需要额外的软件包。

conda install cudatoolkit=10.1

现在依赖项已安装完毕,可以克隆 TorchServe 存储库,然后安装 TorchServe

git clone https://github.com/pytorch/serve.git

cd serve

pip install .

cd model-archiver

pip install .

设置完成,下面开始部署模型!

部署模型

为了演示方便,我将从 PyTorch 模型园随意下载一个预训练过的模型。在实际应用中,您可以使用自己的模型。

wget https://download.pytorch.org/models/densenet161-8d451a50.pth

下面,我需要将该模型封装到一个模型存档中。模型存档包括存储所有模型成品(即模型本身)的 ZIP 文件 (densenet161-8d451a50.pth)、用于加载状态字典的 Python 脚本(将张量与层匹配)以及您可能需要的任何附加文件。这里,我添加了一个名为 index_to_name.json 的文件,它将类标识符映射到类名称。内置的 image_classifier 处理程序将使用该文件,该处理程序负责预测逻辑。TorchServe 中还有其他内置处理程序(object_detectortext_classifierimage_segmenter),您也可以使用自己的处理程序。

torch-model-archiver --model-name densenet161 --version 1.0 \
--model-file examples/image_classifier/densenet_161/model.py \
--serialized-file densenet161-8d451a50.pth \
--extra-files examples/image_classifier/index_to_name.json \
--handler image_classifier

接下来,创建一个目录来存储模型存档,并将刚刚创建的模型存档移动到该目录。

mkdir model_store

mv densenet161.mar model_store/

现在,我可以启动 TorchServe,并将其指向模型存储和想要加载的模型。当然,如果有需要,可以加载几个模型。

torchserve --start --model-store model_store --models densenet161=densenet161.mar

在同一台机器上,使用 HTTP POST 请求抓取一个映像并将其轻松发送到 TorchServe,用于提供本地服务。注意 URL 的格式,其中包含我要使用的模型的名称。

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}
]

然后,使用“stop”命令停止 TorchServe 运行。

torchserve --stop

如您所见,使用默认配置开始使用 TorchServe 非常简单。下面我来演示一下如何设置 TorchServe 提供远程服务。

配置 TorchServe 提供远程服务

我们为 TorchServe 创建一个配置文件,取名为 config.properties(默认名称)。此文件定义要加载的模型,并设置远程服务。这里,我将该服务器与所有公有 IP 地址绑定,但如有需要,您可以将其限制为特定地址。由于该服务器在 EC2 实例上运行,我需要确保在安全组中打开端口 8080 和 8081。

model_store=model_store
load_models=densenet161.mar
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081

现在可以在相同的目录中启动 TorchServe 了,不再需要传递任何命令行参数。

torchserve --start

返回本地机器,现在可以远程调用 TorchServe 并获得相同的结果了。

curl -X POST http://ec2-54-85-61-250.compute-1.amazonaws.com:8080/predictions/densenet161 -T kitten.jpg

大家可能注意到了,我使用的是 HTTP。我猜许多人在生产环境中需要使用 HTTPS,下面我将演示如何进行设置。

配置 TorchServe 使用 HTTPS

TorchServe 可视使用 Java 密钥库或证书。这里我选择后者。

首先,使用 openssl 创建一个证书和一个私有密钥。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

然后,更新配置文件来定义证书和密钥的位置,将 TorchServe 与其默认的安全端口绑定(不要忘记更新安全组)。

model_store=model_store
load_models=densenet161.mar
inference_address=https://0.0.0.0:8443
management_address=https://0.0.0.0:8444
private_key_file=mykey.key
certificate_file=mycert.pem

重新启动 TorchServe,然后就可以使用 HTTPS 调用它了。由于使用了自签名证书,需要将“–insecure”标志传递给 curl

curl --insecure -X POST https://ec2-54-85-61-250.compute-1.amazonaws.com:8443/predictions/densenet161 -T kitten.jpg

TorchServe 还可以进行许多配置,建议阅读此文档了解更多信息!

开始使用

TorchServe 现在可以在 https://github.com/pytorch/serve 获取。

欢迎试用并在 Github 上将您的反馈发给我们。

– Julien