大规模服务PyTorch Lightning模型的残缺指南。
纵观机器学习畛域,次要趋势之一是专一于将软件工程原理利用于机器学习的我的项目激增。 例如,Cortex再现了部署无服务器性能但具备推理管道的体验。相似地,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 Trainer是一个形象样板训练代码(思考训练和验证步骤)的类,它具备内置的save_checkpoint()函数,该函数会将您的模型另存为.ckpt文件。要将模型保留为检查点,只需将以下代码增加到训练脚本中:
当初,在咱们开始为该检查点提供服务之前,须要留神的是,尽管我始终说“ PyTorch Lightning模型”,但PyTorch Lightning是PyTorch的包装器-我的项目的README字面意思是“ PyTorch Lightning只是有组织的PyTorch。” 因而,导出的模型是一般的PyTorch模型,能够相应地应用。
有了保留的检查点,咱们能够在Cortex中轻松地为模型提供服务。如果您不相熟Cortex,能够 在这里疾速相熟一下,然而Cortex部署过程的简略概述是:
- 咱们应用Python为咱们的模型编写了一个预测API
- 咱们在YAML中定义咱们的API根底构造和行为
- 咱们应用CLI中的命令部署API
咱们的预测API将应用Cortex的Python Predictor类定义一个init()函数来初始化咱们的API并加载模型,并应用一个define()函数在查问时提供预测:
很简略 咱们从训练代码中从新调整了一些代码的用处,增加了一些推理逻辑,仅此而已。须要留神的一件事是,如果将模型上传到S3(举荐),则须要增加一些逻辑来拜访它。
接下来,咱们在YAML中配置基础架构:
再次,简略。咱们给咱们的API起个名字,通知Cortex咱们的预测API在哪里,并调配一些CPU。
接下来,咱们部署它:
请留神,咱们还能够部署到集群,由Cortex减速和治理:
在所有部署中,Cortex都会容器化咱们的API并将其公开为Web服务。通过云部署,Cortex能够配置负载平衡,主动扩大,监督,更新和许多其余基础架构性能。
就是这样!当初,咱们有一个实时Web API,可依据要求提供模型预测。
2.导出到ONNX并通过ONNX运行时进行投放
当初,咱们曾经部署了一个一般的PyTorch检查点,让事件简单一些。
PyTorch Lightning最近增加了一个不便的形象,用于将模型导出到ONNX(以前,您能够应用PyTorch的内置转换性能,只管它们须要更多样板)。要将模型导出到ONNX,只需将以下代码增加到您的训练脚本中:
请留神,您的输出样本应模拟理论模型输出的形态。
导出ONNX模型后,就能够应用Cortex的ONNX Predictor为其提供服务。代码基本上看起来是雷同的,并且过程是雷同的。例如,这是一个ONNX预测API:
基本上一样。惟一的区别是,咱们不是通过间接初始化模型,而是通过onnx_client拜访该数据,这是Cortex为服务于咱们的模型而启动的ONNX运行时容器。
咱们的YAML看起来也很类似:
我在此处增加了一个监督标记,目标只是为了显示配置的简便水平,并且有一些ONNX特定字段,但其余方面都是雷同的YAML。
最初,咱们应用与之前雷同的$ cortex deploy命令进行部署,并且咱们的ONNX API已启用。
3.应用Torchscript的JIT编译器进行序列化
对于最终部署,咱们将把PyTorch Lightning模型导出到Torchscript并应用PyTorch的JIT编译器提供服务。要导出模型,只需将其增加到您的训练脚本中:
用于此目标的Python API与原始PyTorch示例简直雷同:
YAML放弃与以前雷同,并且CLI命令当然是统一的。如果需要的话,咱们实际上能够更新咱们以前的PyTorch API来应用新模型,只需将新的旧的dictor.py脚本替换为新的脚本,而后再次运行$ cortex部署:
Cortex在此处主动执行滚动更新,在该更新中,新的API会被启动,而后与旧的API替换,从而防止了模型更新之间的任何停机工夫。
这就是全副。当初,您曾经具备用于实时推理的齐全可操作的预测API,可依据Torchscript模型提供预测。
那么,您应该应用哪种办法?
不言而喻的问题是哪种办法成果最好。事实是,这里没有简略的答案,因为这取决于您的模型。
对于BERT和GPT-2等Transformer模型,ONNX能够提供令人难以置信的优化(咱们测得的CPU吞吐量进步了40倍 )。对于其余模型,Torchscript的性能可能比香草PyTorch更好-只管这也带有一些正告,因为并非所有模型都洁净地导出到Torchscript。
侥幸的是,应用任何选项进行部署都很容易,您能够并行测试所有这三个选项,并查看哪种形式最适宜您的特定API。
如果你喜爱本文的话,欢送点赞转发!谢谢。
看完别走还有惊喜!
我精心整顿了计算机/Python/机器学习/深度学习相干的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。