大规模服务 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”,点击下方菜单即可获取网盘链接。