详解 PyTorch Lightning模型部署到生产服务中
作者:ronghuaiyang 发布时间:2021-10-23 01:17:25
导读
一篇用PyTorch Lighting提供模型服务的完全指南。
纵观机器学习领域,一个主要趋势是专注于将软件工程原理应用于机器学习的项目。例如,Cortex重新创造了部署serverless功能的体验,但使用了推理管道。类似地,DVC实现了现代版本控制和CI/CD管道,但是是针对ML的。\
PyTorch Lightning也有类似的理念,只适用于训练。这些框架为PyTorch提供了一个Python包装器,让数据科学家和工程师可以编写干净、易于管理和性能训练的代码。
作为构建整个部署平台的人,部分原因是我们讨厌编写样板文件,我们是PyTorch Lightning的忠实粉丝。本着这种精神,我整理了这篇将PyTorch Lightning模型部署到生产中的指南。在此过程中,我们将了解一些用于导出PyTorch Lightning模型并将其包含在推理管道中的不同选项。
使用PyTorch Lightning模型进行推理的各种方法
有三种方法导出用于PyTorch Lightning模型进行服务:
保存模型为PyTorch检查点
将模型转换为ONNX
导出模型到Torchscript
我们可以用Cortex来对这三种进行服务。
1. 直接打包部署PyTorch Lightning模型
从最简单的方法开始,让我们部署一个不需要任何转换步骤的PyTorch Lightning模型。
PyTorch Lightning训练器是一个抽象了样板训练代码(想想训练和验证步骤)的类,它有一个内置的save_checkpoint()函数,可以将模型保存为.ckpt文件。要将你的模型保存为一个检查点,只需将以下代码添加到你的训练脚本中:
现在,在我们开始服务这个检查点之前,重要的是要注意,当我一直说“PyTorch Lightning模型”时,PyTorch Lightning是PyTorch的一个封装 —— 项目的自述文件字面上说“PyTorch Lightning只是有组织的PyTorch”。因此,导出的模型是一个正常的PyTorch模型,可以相应地提供服务。
有了保存好的检查点,我们就可以轻松地在Cortex中使用该模型。关于Cortex的部署过程的简单概述如下:
我们用Python为我们的模型编写了一个预测API
我们在YAML中定义api的基础结构和行为
我们通过CLI命令来部署API
我们的预测API将使用Cortex的Python Predictor类来定义一个init()函数来初始化我们的API并加载模型,以及一个predict()函数来在查询时提供预测:
import torch
import pytorch_lightning as pl
import MyModel from training_code
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class PythonPredictor:
def __init__(self, config):
self.device = "cpu"
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
self.model = MyModel.load_from_checkpoint(checkpoint_path="./model.ckpt")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.model(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
很简单。我们从训练代码中重新定义了一些代码,添加了一些推理逻辑,就是这样。需要注意的一点是,如果你将模型上传到S3(推荐),你需要添加一些访问它的逻辑。
接下来,我们在YAML中配置基础的设置:
- name: acceptability-analyzer
kind: RealtimeAPI
predictor:
type: python
path: predictor.py
compute:
cpu: 1
同样也很简单。我们给API一个名称,告诉Cortex我们的预测API在哪里,并分配CPU。
接下来,我们部署它:
注意,我们也可以将其部署到一个集群中,并由Cortex进行管理:
在所有的部署中,Cortex将我们的API打包并将其作为web的服务公开。通过云部署,Cortex可以配置负载平衡、自动扩展、监控、更新和许多其他基础设施功能。
现在,我们有了一个实时的web API,可以通过请求用模型进行预测。
2. 导出为ONNX并通过ONNX Runtime进行服务
现在我们已经部署了一个普通的PyTorch检查点,让我们把事情复杂化一点。
PyTorch Lightning最近添加了一个方便的抽象,用于将模型导出到ONNX(以前,你可以使用PyTorch的内置转换函数,尽管它们需要更多的样板文件)。要将模型导出到ONNX,只需将以下代码添加到训练脚本中:
注意,输入样本应该模拟实际模型输入的形状。
一旦你导出了ONNX模型,你就可以使用Cortex的ONNX Predictor来服务它。代码基本上是一样的,过程也是一样的。例如,这是一个ONNX预测API:
import pytorch_lightning as pl
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class ONNXPredictor:
def __init__(self, onnx_client, config):
self.device = "cpu"
self.client = onnx_client
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.client.predict(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
基本上是一样的。唯一的区别是,我们不是直接初始化模型,而是通过onnx_client访问它,这是一个ONNX运行时容器,Cortex为我们的模型提供服务。
我们的YAML看起来也很相似:
- name: acceptability-analyzer
kind: RealtimeAPI
predictor:
type: onnx
path: predictor.py
model_path: s3://your-bucket/model.onnx
monitoring:
model_type: classification
‍我在这里添加了一个监视标志,只是为了说明配置它是多么容易,并且有一些ONNX特定的字段,但除此之外是相同的YAML。
最后,我们使用与之前相同的$ cortex deploy命令进行部署,我们的ONNX API也是可用的。
3. 使用 Torchscript’s JIT compiler序列化
对于最后的部署,我们把PyTorch Lightning模型导出到Torchscript,并使用PyTorch的JIT编译器提供服务。要导出模型,只需将此添加到你的训练脚本:
这个的Python API与普通的PyTorch示例几乎相同:
import torch
from torch import jit
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class PythonPredictor:
def __init__(self, config):
self.device = "cpu"
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
self.model = jit.load("model.ts")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.model(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
YAML与以前一样,CLI命令当然是一致的。如果我们愿意,我们可以通过简单地用新的脚本替换旧的predictor.py脚本来更新之前的PyTorch API,并再次运行$ cortex deploy:
在这里,Cortex会自动执行滚动更新,即启动一个新的API,然后与旧API进行交换,从而防止模型更新之间的停机时间。
就是这样。现在,你有了一个用于实时推断的完全可操作的预测API,从Torchscript模型提供预测。
那么,你会用哪种方法呢?
这里明显的问题是哪种方法性能最好。事实上,这里没有一个简单的答案,因为它取决于你的模型。
对于BERT和GPT-2这样的Transformer模型,ONNX可以提供令人难以置信的优化(我们测量了cpu吞吐量有40倍提高)。对于其他模型,Torchscript可能比vanilla PyTorch表现得更好 —— 尽管这也带来了一些警告,因为并不是所有的模型都清晰地导出到Torchscript。
幸运的是,使用任何选项都可以很容易地进行部署,因此可以并行测试这三种方法,看看哪种最适合你的特定API.‍
英文原文:towardsdatascience.com/how-to-depl…
来源:https://juejin.cn/post/7144899265381269512
猜你喜欢
- 不过有一个简单的执行cmd命令方法: SQL> host net user User accounts for \\PC-ATQHJ4
- 在文章《用CSS实现柱状图(Bar Graph)的方法总结与比较(三)》中我强调说不同浏览器对于相同元素的默认样式并不一致,这也是为什么我们
- 写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题像这样:令人十分难受啊!#--------------------------
- SQL Server数据库涉及到的数据仓库概念:1.多维数据集:多维数据集是联机分析处理 (OLAP) 中的主要对象,是一项可对数据仓库中的
- 写一个爬虫首先就是学会设置请求头header,这样才可以伪装成浏览器。下面小编我就来给大家简单分析一下python3怎样构建一个爬虫的请求头
- 本文实例讲述了PHP函数extension_loaded()用法。分享给大家供大家参考。具体分析如下:extension_loaded —
- Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了
- 随机背景--当你每次进入该页面时,从已指定的图片文件夹中,随机选取一个图片作为背景显示。这里介绍的方法是用ASP+CSS来实现的。 &nbs
- 级联样式表在13年前被引入,而且被广泛使用的CSS 2.1 标准在11年前被创建,显然我们现在已经与当年相差千里了。相当了不起的是期间网站开
- 熟悉SQL的人都知道,完成同一个任务,SQL可能有多种写法,但不同写法的查询性能可能会有天壤之别,本文列举出五个查询优化的方法,当然,优化的
- 忽然想起一个CSS的特性,写一段代码玩玩:<style type="text/css">body {font
- 简介使用百度深度学习框架paddlepaddle对人像图片进行自动化抠图安装根据PaddlePaddle官网命令安装如pip install
- 利用pygame实现了简易版飞机大战。源代码如下:# -*- coding:utf-8 -*-import pygameimport sys
- 利用Python将多份excel表格整理成一份表格,抛弃过去逐份打开复制粘贴的方式。直接附上代码:import xlrd import xl
- 一开始都是先去《英雄联盟》官网找到英雄及皮肤图片的网址:URL = r'https://lol.qq.com/data/info-h
- <SCRIPT language=vbscript event=BeforeInitialBind(i
- Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼、富有朝气。但也许你还没有发现并应用它的一些更高级的功能吧
- 导言Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式。除此之外,内容也是足够灵活的,可以是图像、内嵌
- SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可
- aspjpeg组件官方下载地址:http://www.persits.com/说明: 1、aspjpeg能对图片水印进行透明度调整