TorchServe 详解:5 步将模型部署到生产环境

2023-11-14

内容导读:TorchServe 自 2020 年 4 月推出至今,经历了 2 年多的发展,变得愈发成熟和稳定,本文将对 TorchServe 进行全面介绍。

本文首发自微信公众号:PyTorch开发者社区

更多应用 PyTorch 进行实际模型部署实践,访问 openbayes.com 获取

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)进行配置。

用 TorchServe 部署模型的步骤包括:

1、安装 TorchServe、model archiver 及其它依赖

2、选择一个合适的默认 handler(如图像分类等)或创建一个自定义 handler

3、使用 Torcharchive 将 model artifacts 和 handler 打包成一个 .mar 文件,并将其放入 model store

4、开始部署模型

5、运行推理

TorchServe 项目地址

TorchServe 重点概念之 Handler

TorchServe 后端使用一个 handler 来加载模型、预处理接收到的数据、运行推理和对 response 进行 post process。TorchServe 中的 handler 是一个 Python script,所有模型初始化、预处理、推理和 post process 逻辑都包含在其中。

TorchServe 还提供了一个开箱即用的 handler,可用于图像分类、分割、目标检测和文本分类等应用程序。此外,它还支持自定义 handler,以防默认 handler 不支持当下的 case。

自定义 handler 提供了很大的灵活性,这可能使 TorchServe 成为一个多框架服务工具。自定义的 handler 允许以自定义逻辑来初始化一个模型,也能让这个模型从其他框架(如 ONNX)加载模型。

TorchServe 处理程序由四个主要函数组成,functionsinitializeinference 和 preprocess,每个函数返回一个列表。

下面的代码片段是自定义 handler 的示例。自定义 handler 继承了 TorchServe 中的 BaseHandler,可以覆盖任何主函数。该示例演示了如何用 handler 加载 Detectron2 模型,解决 figure detection 问题。该模型已经被导出至 Torchscript,并使用  mod.half() 运行 FP16 推理。

TorchServe 重点概念之 Metrics

将模型部署到生产环境中,需要重点监测其能力表现。TorchServe 定期收集系统级 metrics,并允许添加自定义 metrics。

系统级 metrics 包括 CPU 利用率、主机上可用及已用的磁盘空间和内存,以及不同响应代码的请求数量(例如 200-300、400-500 和 500 以上)。自定义 metrics 可以添加到 Custom Metrics API。

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 的示例

通过在 Bashboard 中跟踪这些 metrics,可以监视在离线 Benchmark 运行期间,偶尔出现或难以发现的 performance regressions。

What's Next

以上就是关于 TorchServe 的全部介绍。在下一节中,我们将借助一个具体案例,讲解影响部署模型到生产环境中的具体因素,以及如何用 TorchServe 对 Animated Drawings APP 进行调优。

获取更多学习资料和实践教程,欢迎关注公众号:PyTorch 开发者社区。观看教程实践,可访问 openbayes.com 实际操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TorchServe 详解:5 步将模型部署到生产环境 的相关文章

  • 从 Django 调用 Postgres SQL 存储过程

    我正在开发一个带有 Postgresql 数据库的 Django 项目 我编写了一个可以在 Postgres 上完美运行的存储过程 现在我想从 Django 1 5 调用该存储过程 我已经编写了代码 但它提示错误 CREATE FUNCTI
  • TensorFlow:带有轴选项的 bincount

    在 TensorFlow 中 我可以使用 tf bincount 获取数组中每个元素的计数 x tf placeholder tf int32 None freq tf bincount x tf Session run freq feed
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • 在Python中如何获取字典的部分视图?

    是否有可能获得部分视图dict在Python中类似于pandasdf tail df head 说你有很长一段时间dict 而您只想检查某些元素 开头 结尾等 dict 就像是 dict head 3 To see the first 3
  • 无故运行测试时 PyCharm 抛出“AttributeError: 'module' object has no attribute”

    因此 我有一个 Django REST Framework 项目 有一天它无法在 PyCharm 中运行测试 从命令行我可以使用它们来运行它们paver or the manage py直接地 曾经有一段时间 当我们没有在文件顶部导入类的超
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • Alembic:如何迁移模型中的自定义类型?

    My User模型是 class User UserMixin db Model tablename users noinspection PyShadowingBuiltins uuid Column uuid GUID default
  • PyTorch:如何批量进行推理(并行推理)

    如何在PyTorch中批量进行推理 如何并行进行推理以加快这部分代码的速度 我从进行推理的标准方法开始 with torch no grad for inputs labels in dataloader predict inputs in
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • Python、subprocess、call()、check_call 和 returncode 来查找命令是否存在

    我已经弄清楚如何使用 call 让我的 python 脚本运行命令 import subprocess mycommandline lumberjack sleep all night work all day subprocess cal
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • GradientTape 根据损失函数是否被 tf.function 修饰给出不同的梯度

    我发现计算的梯度取决于 tf function 装饰器的相互作用 如下所示 首先 我为二元分类创建一些合成数据 tf random set seed 42 np random seed 42 x tf random normal 2 1 y
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • tkinter:打开一个带有按钮提示的新窗口[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 用户如何按下 tkinter GUI 中的按钮来打开新窗口 我只需要非常简单的解决方案 如果代码也能被解释那就太好了 这

随机推荐