本文全面介绍了如何大规模部署PyTorch Lightning模型。
【51CTO.com快译】纵观机器学习范畴,一大趋势是侧生于将软件工程原理运用于机器学习的项目数量激增。比如说,Cortex再现了布置无服务器函数的体会,不过凭借推理管道。与之相仿,DVC完成了现代版别操控和CI/CD管道,但面向机器学习。
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 Trainer是笼统样板练习代码(想想练习和验证进程)的一个类,它有内置的save_checkpoint()函数,可将模型另存为.ckpt文件。要将模型另存为检查点,只需将该代码增加到练习脚本中:
图1
现在,开端布置该检查点之前,要特别注意的是,尽管我一直说“PyTorch Lightning模型”,但PyTorch Lightning是PyTorch的包装器——该项意图README实践上写着“PyTorch Lightning仅仅有组织的PyTorch”。因此,导出的模型是一般的PyTorch模型,可相应布置。
有了保存的检查点,咱们能够在Cortex中很轻松地布置模型。假如您不了解Cortex,能够在这儿(https://docs.cortex.dev/)快速了解一下,可是Cortex布置进程的简略概述如下:
- 咱们运用Python为模型编写猜测API
- 咱们运用YAML界说API根底架构和行为
- 咱们从CLI运用指令来布置API
咱们的猜测API将运用Cortex的Python Predictor类来界说init()函数,以初始化咱们的API并加载模型,并运用predict()函数在查询时进行猜测:
- importtorch
- importpytorch_lightningaspl
- importMyModelfromtraining_code
- fromtransformersimport(
- AutoModelForSequenceClassification,
- AutoConfig,
- AutoTokenizer
- )
- classPythonPredictor:
- 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")
- 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"}
很简略。咱们运用练习代码改变了一些代码的用处,并增添了一点推理逻辑。要注意的一点是,假如您将模型上传到了S3(引荐),要增加拜访模型的一些逻辑。
下一步,咱们运用YAML装备根底架构:
- -name:acceptability-analyzer
- kind:RealtimeAPI
- predictor:
- type:python
- path:predictor.py
- compute:
- cpu:1
相同很简略。咱们为API取名,告知Cortex咱们的猜测AI是哪个,并分配一些CPU资源。
接下来,咱们布置它:
请注意:咱们还能够布置到由Cortex发动并办理的集群上:
图3
针对一切布置,Cortex都会对咱们的API进行容器化处理,并将其揭露为Web服务。针对云布置,Cortex装备负载均衡、主动扩展、监测、更新和其他许多根底架构功用。
便是这样!现在咱们有一个实践的Web API可根据要求处理模型猜测。
2.经过ONNX Runtime导出到ONNX并布置
咱们现已布置了一个一般的PyTorch检查点,无妨让情况复杂一些。
PyTorch Lightning最近增加了一个便利的笼统,用于将模型导出到ONNX(曾经您能够运用PyTorch内置的转化函数,不过它们需求多一点的样板代码)。要将模型导出到ONNX,只需将该代码增加到练习脚本中:
图4
请注意,输入样本应仿照实践模型输入的形状。
一旦您导出了ONNX模型,能够运用Cortex的ONNX Predictor来布置。代码基本上看起来相同,进程相同。比如说,这是一个ONNX猜测API:
- importpytorch_lightningaspl
- fromtransformersimport(
- AutoModelForSequenceClassification,
- AutoConfig,
- AutoTokenizer
- )
- classONNXPredictor:
- def__init__(self,onnx_client,config):
- self.device="cpu"
- self.client=onnx_client
- self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")
- defpredict(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"}
- viewrawpredictor.pyhostedwith❤byGitHub
基本上相同。仅有的区别是,不是直接初始化模型,咱们经过onnx_client来拜访它,这是Cortex为布置咱们的模型而发动的ONNX Runtime容器。
咱们的YAML看起来也很类似:
- -name:acceptability-analyzer
- kind:RealtimeAPI
- predictor:
- type:onnx
- path:predictor.py
- model_path:s3://your-bucket/model.onnx
- monitoring:
- model_type:classification
- viewrawcortex.yamlhostedwith❤byGitHub
我在这儿增加了监测标志,只为了标明装备有多简略;有一些ONNX特有的字段,不过除此之外是相同的YAML。
最终,咱们运用与之前相同的$ cortex deploy指令来布置,咱们的ONNX API处于活泼状况。
3. 运用Torchscript的JIT编译器来初始化
至于最终的布置,咱们将把PyTorch Lightning模型导出到Torchscript,并运用PyTorch的 JIT编译器来布置。要导出模型,只需将这部分增加到练习脚本中:
图5
这方面的Python API与一般PyTorch示例相同:
- importtorch
- fromtorchimportjit
- fromtransformersimport(
- 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❤byGitHub
YAML与之前相同,当然CLI指令是共同的。假如咱们想要,能够实践上更新之前的PyTorch API以运用新模型,只需把旧的predictor.py脚本换成新脚本,并再次运转$ cortex deploy:
图6
Cortex在此处主动履行翻滚更新,新的API创立,然后与旧的API交流,因此避免模型更新间歇的任何停机。
便是这样。现在,您已经有了用于实时推理的彻底可操作的猜测API,可从Torchscript模型进行猜测。
那么,您应运用哪种办法?
清楚明了的问题是哪种办法必定最好。事实上,这儿没有简略的答案,这取决于您的模型。
针对BERT和GPT-2之类的Transformer模型,ONNX能够供给超卓的优化(咱们测得CPU上的吞吐量提高了40倍)。至于其他模型,Torchscript的功能或许胜过一般PyTorch,不过也有一些当地要注意,由于并非一切模型都能洁净地导出到Torchscript。
幸亏,您能够并行测验一切这三种办法,看看哪种办法最适合您的特定API。
原文标题:How to deploy PyTorch Lightning models to production,作者:Caleb Kaiser
【51CTO译稿,协作站点转载请注明原文译者和出处为51CTO.com】