当前位置: 首页 > 科技观察

如何将PyTorchLightning模型部署到生产环境中?_0

时间:2023-03-14 21:59:47 科技观察

【.com速译】纵观机器学习领域,一大趋势是软件工程原理应用于机器学习而诞生的项目激增。例如,Cortex重现了部署无服务器功能的体验,但带有推理管道。同样,DVC实现了现代版本控制和CI/CD管道,但面向机器学习。PyTorchLightning具有类似的理念,仅用于训练。该框架为PyTorch提供了一个Python包装器,允许数据科学家和工程师编写干净、可管理和高性能的训练代码。我们构建整个部署平台的部分原因是我们讨厌编写样板代码,所以我们是PyTorchLightning的忠实粉丝。本着这种精神,我写了这篇关于将PyTorchLightning模型部署到生产中的指南。在此过程中,我们将介绍几种不同的方法来导出PyTorchLightning模型以输入推理管道。部署PyTorchLightning模型进行推理的多种方法导出PyTorchLightning模型进行部署的三种方法:将模型保存为PyTorch检查点将模型转换为ONNX将模型导出到Torchscript我们可以使用Cortex满足这三种方式。1.直接打包部署PyTorchLightning模块我们从最简单的方法开始,部署一个PyTorchLightning模型,不需要任何转换步骤。PyTorchLightningTrainer是一个抽象样板训练代码(想想训练和验证步骤)的类,它有一个内置的save_checkpoint()函数,可以将模型保存为.ckpt文件。要将模型保存为检查点,只需将此代码添加到您的训练脚本中:图1现在,在您开始部署此检查点之前,请务必注意,尽管我一直在说“PyTorchLightning模型”,但PyTorchLightning是PyTorch的包装器-该项目的自述文件实际上说“PyTorchLightning只是PyTorch组织的”。因此,导出的模型是一个普通的PyTorch模型,可以进行相应的部署。使用保存的检查点,我们可以轻松地将模型部署到Cortex中。如果你对Cortex不熟悉,你可以在这里快速熟悉它(https://docs.cortex.dev/),但是Cortex部署过程的简单概述如下:我们使用Python编写预测API对于模型我们使用YAML来定义API基础设施和行为我们使用来自CLI的命令来部署API。我们的预测API将使用Cortex的PythonPredictor类来定义init()函数来初始化我们的API并加载模型,并使用predict()函数在查询时进行预测:(self,config):self.device="cpu"self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")self.model=MyModel.load_from_checkpoint(checkpoint_path="./model.ckpt")defpredict(self,有效载荷):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-analyzerkind:RealtimeAPIpredictor:type:pythonpath:predictor.pycompute:cpu:1也很简单。我们为API命名,告诉Cortex我们的预测AI是哪个,并分配一些CPU资源。接下来,我们部署它:注意:我们还可以部署到由Cortex启动和管理的集群:图3对于所有部署,Cortex将容器化我们的API并将其公开为Web服务。对于云部署,Cortex配置负载平衡、自动缩放、监控、更新和许多其他基础设施功能。就是这样!现在我们有了一个实际的WebAPI,可以根据请求处理模型预测。2.通过ONNX运行时导出到ONNX并部署我们现在已经部署了一个正常的PyTorch检查点,让我们把事情变得更复杂一点。PyTorchLightning最近添加了一个方便的抽象,用于将模型导出到ONNX(以前你可以使用PyTorch的内置转换函数,尽管它们需要更多的样板代码)。要将模型导出到ONNX,只需将此代码添加到训练脚本中:图4请注意,输入样本应模仿实际模型输入的形状。导出ONNX模型后,可以使用Cortex的ONNXPredictor对其进行部署。代码基本上看起来是一样的,过程也是一样的。例如,这是一个ONNX预测API:importpytorch_lightningasplfromtransformersimport(AutoModelForSequenceClassification,AutoConfig,AutoTokenizer)v2")defpredict(self,payload):inputs=self.tokenizer.encode_plus(payload["text"],return_tensors="pt")predictions=self.client.predict(**inputs)[0]if(预测[0]>predictions[1]):return{"class":"unacceptable"}else:return{"class":"acceptable"}viewrawpredictor.pyhosted和GitHub的?基本一样,唯一不同的是不是初始化直接访问模型,我们通过onnx_client访问它,它是Cortex开始部署我们模型的ONNXRuntime容器。我们的YAML看起来也很相似:-name:acceptability-analyzerkind:RealtimeAPIpredictor:type:onnxpath:predictor.pymodel_path:s3://your-bucket/model.onnxmonitoring:model_type:classificationviewrawcortex.yamlhostedwith?byGitHub我在这里添加了监控标志,只是为了展示配置是多么容易;有一些特定于ONNX的字段,但除此之外它是相同的YAML。最后,我们使用与之前相同的$cortexdeploy命令进行部署,并激活我们的ONNXAPI。3.使用Torchscript的JIT编译器进行初始化最后的部署,我们将PyTorchLightning模型导出到Torchscript,使用PyTorch的JIT编译器进行部署。要导出模型,只需将这部分添加到训练脚本中:图5PythonAPI的这一方面与普通PyTorch示例相同:importtorchfromtorchiimportjitfromtransformersimport(AutoModelForSequenceClassification,AutoConfig,AutoTokenizer)classPythonPredictor:def__init__(self,config):self。device="cpu"self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")self.model=jit.load("model.ts")defpredict(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"}viewrawpredictor.pyhostedwith?byGitHubYAML和之前一样,当然CLI命令也是一样的。如果我们愿意,我们实际上可以更新以前的PyTorchAPI以使用新模型,只需将旧的predictor.py脚本替换为新脚本,然后再次运行$cortexdeploy:图6Cortex在这里自动执行滚动更新,新的API是创建然后与旧API交换,从而防止模型更新之间的任何停机时间。就是这样。您现在拥有一个用于实时推理的完全可操作的预测API,可以根据Torchscript模型进行预测。那么,您应该使用哪种方法?显而易见的问题是哪种方法最有效。事实上,这里没有简单的答案,这取决于你的模型。对于像BERT和GPT-2这样的Transformer模型,ONNX可以提供出色的优化(我们测得CPU吞吐量增加了40倍)。至于其他模型,Torchscript可能胜过普通的PyTorch,但有一些注意事项,因为并非所有模型都能干净地导出到Torchscript。幸运的是,您可以同时测试所有三种方法,看看哪种方法最适合您的特定API。原标题:HowtodeployPyTorchLightningmodelstoproduction,作者:CalebKaiser