AWS和Facebook合作推出PyTorch模型服务框架TorchServe:可让模型快速投入生产

近日,Facebook和AWS合作推出了PyTorch模型服务库TorchServe,强强联手剑指Google TensorFlow。

PyTorch是当下最火的深度学习开源库之一,可以帮助开发者和研究人员更轻松地构建和训练模型。即便有了PyTorch,在生产中部署和管理模型仍然是机器学习的一大难题,包括构建定制的预测API,对其进行缩放以及保证其安全等问题。

简化模型部署过程的一种方法是使用模型服务器,即专门设计用于在生产中提供机器学习预测的现成的Web应用程序。模型服务器可轻松加载一个或多个模型,并自动创建由可伸缩Web服务器支持的预测API。它们还能够根据预测请求运行预处理和后处理代码。最后一个要点是,模型服务器还提供了一些在生产中至关重要的功能,例如日志记录、监视和安全。目前比较受欢迎的模型服务器包括TensorFlow Serving和Multi Model Server。

今天,我非常高兴地宣布TorchServe——PyTorch模型服务库,能在不编写自定义代码的情况下轻松地大规模部署训练好的PyTorch模型。

TorchServe概述

TorchServe是由AWS和Facebook合作开发的PyTorch模型服务库,是PyTorch开源项目的一部分。

项目地址:https://github.com/pytorch/serve

借助TorchServe,PyTorch用户可以更快地将其模型应用于生产,而无需编写自定义代码:除了提供低延迟预测API之外,TorchServe还为一些最常见的应用程序嵌入了默认处理程序,例如目标检测和文本分类。此外,TorchServe包括多模型服务、用于A / B测试的模型版本控制、监视指标以及用于应用程序集成的RESTful端点。如你所料,TorchServe支持任何机器学习环境,包括Amazon SageMaker、容器服务和Amazon Elastic Compute Cloud(EC2)。一些客户已经在体验TorchServe的优越性了。

丰田研究院高级开发有限公司(TRI-AD)正在为丰田汽车公司开发自动驾驶软件。TRI-AD机器学习工具负责人Yusuke Yachide称:

我们在不断优化和改进计算机视觉模型,这对于践行TRI-AD以人为本,安全出行的自动驾驶使命至关重要。我们的模型是通过AWS上的PyTorch进行训练的,但是直到现在,PyTorch仍缺乏模型服务框架。因此,我们花费了大量的技术成本来创建和维护用于将PyTorch模型部署到丰田车辆和云服务器车队的软件。有了TorchServe,我们现在拥有了高性能、轻量级的模型服务器,该服务器由AWS和PyTorch社区支持和维护。

Matroid是计算机视觉软件的制造商,该软件可检测视频镜头中的目标和事件。Matroid公司创始人兼首席执行官Reza Zadeh表示:

我们在AWS和本地环境上使用PyTorch在短时间内很快开发出了大量的机器学习模型。使用自定义模型服务器部署模型,需要将模型转换为其他格式,既费时又麻烦。TorchServe允许我们使用单个可服务文件简化模型部署,该文件也可作为真实情况的唯一来源,并且易于共享和管理。

下面,我就来展示下如何安装 TorchServe以及如何加载一个在Amazon Elastic Compute Cloud (EC2)上预先训练好的模型。

TorchServe的安装

首先,我启动了一个基于CPU 的 Amazon Elastic Compute Cloud(EC2)instance运行深度学习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 instance,则需要一个额外的程序包。

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模型Zoo中下载预训练好的模型。在现实生活中,你可以使用自己的模型。

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

接下来,我需要将模型打包到模型文件夹中。模型文件夹是一个ZIP文件,其中存储了所有模型构件,即模型本身(densitynet161-8d451a50.pth)、用于加载状态机库(张量与层匹配)的Python脚本以及你可能需要的任何其他文件。在这里,我介绍一个名为index_to_name.json的文件,该文件能将类标识符映射到类名上。该文件将应用于负责预测逻辑的内置的image_classifier处理程序上。其他内置处理程序也可用其他文件实现(object_detector、text_classifier、image_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

还是在同一台计算机上,我抓取一张图像并将其轻松发送到TorchServe上,以使用HTTP POST请求进行本地服务。请要特别注意URL的格式,包括要使用的模型的名称。

curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
curl -X POSThttp://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创建一个名为 config.properties(默认名称)的配置文件。该文件定义了要加载的模型,并设置了远程服务。在这里,我将服务器绑定到所有公共IP地址,你也可以根据需要将其限制为特定的地址。由于这是在 EC2 instance上运行的,因此我需要确保在安全组中打开了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,所以我将来展示下如何进行设置。

为HTTPS配置TorchServe

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

原文链接:

https://aws.amazon.com/cn/blogs/aws/announcing-torchserve-an-open-source-model-server-for-pytorch/

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/L2sWHydu5e97c3XPjiUO
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券