内容导读
TorchServe 自 2020 年 4 月推出至今,经历了 2 年多的发展,变得愈发成熟和稳定,本文将对 TorchServe 进行全面介绍。
TorchServe 是 PyTorch 中将模型部署到生产环境的首选解决方案。它是一个性能良好且可扩展的工具,用 HTTP 或 HTTPS API 封装模型。
TorchServe 的前端是用 Java 实现的,可以处理多种任务,包括为部署模型分配 workers、负责客户端和服务器之间通信等。其 Python 后端主要负责处理 inference service。
图一:TorchServe performance Tuning 流程总览
此外,它还支持 AB 测试、dynamic batching、logging 和 metrics 的多种 model serving 及 versioning,4 个公开 API 包括:
* Inference API:监听 8080 端口,默认情况下可通过 localhost 访问,可以在 TorchServe configuration 中进行配置,并支持从模型中获取 predictions。
* Explanation API:在 hood 下使用 Captum 提供正在部署的模型的说明,并 监听 8080 端口。
* Management API:允许注册或取消注册并描述模型。它还允许用户增加或减少部署模型的 workers 的数量。
* Metrics API:在默认情况下监听 8082 端口,使用户可以监测正在部署的模型。
TorchServe 通过支持 batch inference 及部署模型的多个 workers,使得用户得以扩展模型部署并处理峰值流量。这种扩展可通过 Management API 及 configuration file 中的设置来完成。此外,Metrics API 可以通过默认及自定义 metrics 来监测模型部署。
其他高级设置,如接收请求的队列长度、a batch of inputs 的最大等待时长以及其他属性,都可以通过 config file(启动时可以传递到 TorchServe)进行配置。
1、安装 TorchServe、model archiver 及其它依赖
2、选择一个合适的默认 handler(如图像分类等)或创建一个自定义 handler
3、使用 Torcharchive 将 model artifacts 和 handler 打包成一个 .mar 文件,并将其放入 model store
4、开始部署模型
5、运行推理
TorchServe 项目地址:
https://github.com/pytorch/serve/blob/master/README.md#install-torchserve-and-torch-model-archiver
TorchServe 后端使用一个 handler 来加载模型、预处理接收到的数据、运行推理和对 response 进行 post process。TorchServe 中的 handler 是一个 Python script,所有模型初始化、预处理、推理和 post process 逻辑都包含在其中。
TorchServe 还提供了一个开箱即用的 handler,可用于图像分类、分割、目标检测和文本分类等应用程序。此外,它还支持自定义 handler,以防默认 handler 不支持当下的 case。
自定义 handler 提供了很大的灵活性,这可能使 TorchServe 成为一个多框架服务工具。自定义的 handler 允许以自定义逻辑来初始化一个模型,也能让这个模型从其他框架(如 ONNX)加载模型。
TorchServe 处理程序由四个主要函数组成,functions、initialize、inference 和 preprocess,每个函数返回一个列表。
下面的代码片段是自定义 handler 的示例。自定义 handler 继承了 TorchServe 中的 BaseHandler,可以覆盖任何主函数。该示例演示了如何用 handler 加载 Detectron2 模型,解决 figure detection 问题。该模型已经被导出至 Torchscript,并使用 mod.half() 运行 FP16 推理。
将模型部署到生产环境中,需要重点监测其能力表现。TorchServe 定期收集系统级 metrics,并允许添加自定义 metrics。
系统级 metrics 包括 CPU 利用率、主机上可用及已用的磁盘空间和内存,以及不同响应代码的请求数量(例如 200-300、400-500 和 500 以上)。自定义 metrics 可以添加到 Custom Metrics API。
Custom Metrics API:
https://github.com/pytorch/serve/blob/master/docs/metrics.md#custom-metrics-api
TorchServe 将这两组 metrics 记录到不同的 log file 中。默认情况下,metrics 收集在:
系统 metrics: log _ directory/ts _ metrics. log
自定义 metrics:log directory/model _ metrics. log
TorchServe 的 Metrics API,默认情况下监听端口 8082,并允许用户查询和监控收集到的 metrics。默认的 metrics endpoint 返回 Prometheus formatted metrics。可以用 curl 请求查询 metrics,或者将 Prometheus Server 指向 endpoint,并将 Grafana 用于 Dashboard。
用 curl 请求查询 metrics:
curl http://127.0.0.1:8082/metrics
用 mtail 将 logged metrics导出到 Prometheus 的示例:https://github.com/google/mtail
通过在 Bashboard 中跟踪这些 metrics,可以监视在离线 Benchmark 运行期间,偶尔出现或难以发现的 performance regressions。
以上就是关于 TorchServe 的全部介绍。在下一节中,我们将借助一个具体案例,讲解影响部署模型到生产环境中的具体因素,以及如何用 TorchServe 对 Animated Drawings APP 进行调优。