本文全面介绍了如何大规模部署PyTorch Lightning模型。

【51CTO.com快译】纵观机器学习范畴,一大趋势是侧生于将软件工程原理运用于机器学习的项目数量激增。比如说,Cortex再现了布置无服务器函数的体会,不过凭借推理管道。与之相仿,DVC完成了现代版别操控和CI/CD管道,但面向机器学习。

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第1张

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文件。要将模型另存为检查点,只需将该代码增加到练习脚本中:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第2张

图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()函数在查询时进行猜测:

  1. importtorch
  2. importpytorch_lightningaspl
  3. importMyModelfromtraining_code
  4. fromtransformersimport(
  5. AutoModelForSequenceClassification,
  6. AutoConfig,
  7. AutoTokenizer
  8. )
  9. classPythonPredictor:
  10. def__init__(self,config):
  11. self.device="cpu"
  12. self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")
  13. self.model=MyModel.load_from_checkpoint(checkpoint_path="./model.ckpt")
  14. defpredict(self,payload):
  15. inputs=self.tokenizer.encode_plus(payload["text"],return_tensors="pt")
  16. predictions=self.model(**inputs)[0]
  17. if(predictions[0]>predictions[1]):
  18. return{"class":"unacceptable"}
  19. else:
  20. return{"class":"acceptable"}

很简略。咱们运用练习代码改变了一些代码的用处,并增添了一点推理逻辑。要注意的一点是,假如您将模型上传到了S3(引荐),要增加拜访模型的一些逻辑。

下一步,咱们运用YAML装备根底架构:

  1. -name:acceptability-analyzer
  2. kind:RealtimeAPI
  3. predictor:
  4. type:python
  5. path:predictor.py
  6. compute:
  7. cpu:1

相同很简略。咱们为API取名,告知Cortex咱们的猜测AI是哪个,并分配一些CPU资源。

接下来,咱们布置它:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第3张

请注意:咱们还能够布置到由Cortex发动并办理的集群上:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第4张

图3

针对一切布置,Cortex都会对咱们的API进行容器化处理,并将其揭露为Web服务。针对云布置,Cortex装备负载均衡、主动扩展、监测、更新和其他许多根底架构功用。

便是这样!现在咱们有一个实践的Web API可根据要求处理模型猜测。

2.经过ONNX Runtime导出到ONNX并布置

咱们现已布置了一个一般的PyTorch检查点,无妨让情况复杂一些。

PyTorch Lightning最近增加了一个便利的笼统,用于将模型导出到ONNX(曾经您能够运用PyTorch内置的转化函数,不过它们需求多一点的样板代码)。要将模型导出到ONNX,只需将该代码增加到练习脚本中:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第5张

图4

请注意,输入样本应仿照实践模型输入的形状。

一旦您导出了ONNX模型,能够运用Cortex的ONNX Predictor来布置。代码基本上看起来相同,进程相同。比如说,这是一个ONNX猜测API:

  1. importpytorch_lightningaspl
  2. fromtransformersimport(
  3. AutoModelForSequenceClassification,
  4. AutoConfig,
  5. AutoTokenizer
  6. )
  7. classONNXPredictor:
  8. def__init__(self,onnx_client,config):
  9. self.device="cpu"
  10. self.client=onnx_client
  11. self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")
  12. defpredict(self,payload):
  13. inputs=self.tokenizer.encode_plus(payload["text"],return_tensors="pt")
  14. predictions=self.client.predict(**inputs)[0]
  15. if(predictions[0]>predictions[1]):
  16. return{"class":"unacceptable"}
  17. else:
  18. return{"class":"acceptable"}
  19. viewrawpredictor.pyhostedwithbyGitHub

基本上相同。仅有的区别是,不是直接初始化模型,咱们经过onnx_client来拜访它,这是Cortex为布置咱们的模型而发动的ONNX Runtime容器。

咱们的YAML看起来也很类似:

  1. -name:acceptability-analyzer
  2. kind:RealtimeAPI
  3. predictor:
  4. type:onnx
  5. path:predictor.py
  6. model_path:s3://your-bucket/model.onnx
  7. monitoring:
  8. model_type:classification
  9. viewrawcortex.yamlhostedwithbyGitHub

我在这儿增加了监测标志,只为了标明装备有多简略;有一些ONNX特有的字段,不过除此之外是相同的YAML。

最终,咱们运用与之前相同的$ cortex deploy指令来布置,咱们的ONNX API处于活泼状况。

3. 运用Torchscript的JIT编译器来初始化

至于最终的布置,咱们将把PyTorch Lightning模型导出到Torchscript,并运用PyTorch的 JIT编译器来布置。要导出模型,只需将这部分增加到练习脚本中:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第6张

图5

这方面的Python API与一般PyTorch示例相同:

  1. importtorch
  2. fromtorchimportjit
  3. fromtransformersimport(
  4. AutoModelForSequenceClassification,
  5. AutoConfig,
  6. AutoTokenizer
  7. )
  8. classPythonPredictor:
  9. def__init__(self,config):
  10. self.device="cpu"
  11. self.tokenizer=AutoTokenizer.from_pretrained("albert-base-v2")
  12. self.model=jit.load("model.ts")
  13. defpredict(self,payload):
  14. inputs=self.tokenizer.encode_plus(payload["text"],return_tensors="pt")
  15. predictions=self.model(**inputs)[0]
  16. if(predictions[0]>predictions[1]):
  17. return{"class":"unacceptable"}
  18. else:
  19. return{"class":"acceptable"}
  20. viewrawpredictor.pyhostedwithbyGitHub

YAML与之前相同,当然CLI指令是共同的。假如咱们想要,能够实践上更新之前的PyTorch API以运用新模型,只需把旧的predictor.py脚本换成新脚本,并再次运转$ cortex deploy:

 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型) 机器学习 技术 科学 第7张

图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】

转载请说明出处
知优网 » 如何将PyTorch Lightning模型布置到出产环境?(pytorch lightning 保存模型)

发表评论

您需要后才能发表评论