如何部署pytorch模型?

https://zhuanlan.zhihu.com/p/344364948添加链接描述
使用 PyTorch 训练好了模型,如何部署到生产环境提供服务呢?

有 Web 开发经验的小伙伴可能首先想到的是用 HTTP 框架(例如 Flask)进行简单的封装,做一个简单的 HTTP 接口来对外提供服务。但既然是生产,那还免不了考虑性能、扩展性、可运维性等因素。另外,做好这个服务还要求开发人员具备良好的 Web 后端开发技术栈。好在 PyTorch 已经给我们提供了一套统一的标准来实现这些,也就是接下来要介绍的开源工具:TorchServe。

https://www.zhihu.com/question/382518226/answer/2273254646添加链接描述


一、背景深度学习在训练好模型中,我们需要进行部署,有一些框架中已经自带部署框架,如TensorFlow中的 TensorFlow serving,paddlepaddle中的 paddle serving等。但是有些框架自带部署能力并不友好,或者如pytorch类框架,直接官方就建议使用python的flask框架。如果你在训练好模型后,想自己基于flask框架部署模型,下文就可以解决该类需求。二、使用方法1.flask服务代码# A机器中某路径下,app.py

# 导入了 Flask 类。该类的实例将会成为我们的 WSGI 应用。
from flask import Flask
from flask import request

# 创建一个flask类的实例。
app = Flask(__name__)
# 第一个参数是应用模块或者包的名称。 __name__ 是一个适用于大多数情况的快捷方式。
# 有了这个参数, Flask才能知道在哪里可以找到模板和静态文件等东西。


# 定义服务请求路径和方式, 使用POST请求
# 使用 route() 装饰器来告诉 Flask 触发函数的URL 。
@app.route("/v1/", methods=["POST"])
# "/v1/" 表示请求服务路径
# "POST" 不同的请求方法, 常见的有 get,post
def example():
    """flask模型预测"""
    text = request.get_json()
    # 测试请求数据内容
    # print(text)
    """
    逻辑书写
    """
    return text2.flask服务部署# A机器中终端执行

# 服务调试
gunicorn -w 1 -b 0.0.0.0:8001 app:app
# -w 代表开启的进程数, 我们只开启一个进程
# -b 服务的IP地址和端口
# app:app 是指执行的主要对象位置, 在app.py中的app对象

# 服务部署
nohup gunicorn -w 1 -b 0.0.0.0:8001 app:app > ./ret.log 2>&1 &
# nohup command & -- 在后台运行
#3.部署好的服务请求# B机器中某路径下,test.py
# 也可在同一台机器中测试

# coding=utf-8

import requests 
import json
import time


url = "http://0.0.0.0:8001/v1/"

data = {
    "id": 1234,
    "data": "这是一条测试数据!"
}

start = time.time()
res = requests.post(url, json=data, timeout=200)
end = time.time()

print("耗费时间:", end - start)
print("返回的结果:", res.json())三、总结如果使用flask框架部署深度学习模型1.在A机器中书写flask服务代码2.在A机器终端部署写好的服务3.在B机器调用部署好的服务

先说结论:部署的方式取决于需求
需求一:简单的demo演示,只要看看效果的,像是学校里面的demo展示这种caffe、tf、pytorch等框架随便选一个,切到test模式,拿python跑一跑就好,顺手写个简单的GUI展示结果高级一点,可以用CPython包一层接口,然后用C++工程去调用
需求二:要放到服务器上去跑,但一不要求吞吐二不要求时延的那种,说白了还是有点玩玩的意思caffe、tf、pytorch等框架随便选一个,按照官方的部署教程,老老实实用C++部署,例如pytorch模型用工具导到libtorch下跑(官方有教程,很简单)这种还是没有脱离框架,有很多为训练方便保留的特性没有去除,性能并不是最优的;另外,这些框架要么CPU,要么NVIDIA GPU,对硬件平台有要求,不灵活;还有,框架是真心大,占内存(tf还占显存),占磁盘
需求三:放到服务器上跑,要求吞吐和时延(重点是吞吐)这种应用在互联网企业居多,一般是互联网产品的后端AI计算,例如人脸验证、语音服务、应用了深度学习的智能推荐等。由于一般是大规模部署,这时不仅仅要考虑吞吐和时延,还要考虑功耗和成本。所以除了软件外,硬件也会下功夫,比如使用推理专用的NVIDIA P4、寒武纪MLU100等。这些推理卡比桌面级显卡功耗低,单位能耗下计算效率更高,且硬件结构更适合高吞吐量的情况软件上,一般都不会直接上深度学习框架。对于NVIDIA的产品,一般都会使用TensorRT来加速(我记得NVIDIA好像还有TensorRT inference server什么的,名字记不清了,反正是不仅可以加速前传,还顺手帮忙调度了)。TensorRT用了CUDA、CUDNN,而且还有图优化、fp16、int8量化等。反正用NVIDIA的一套硬软件就对了
需求四:放在NVIDIA嵌入式平台上跑,注重时延比如PX2、TX2、Xavier等,参考上面(用全家桶就对了),也就是贵一点嘛
需求五:放在其他嵌入式平台上跑,注重时延硬件方面,要根据模型计算量和时延要求,结合成本和功耗要求,选合适的嵌入式平台。比如模型计算量大的,可能就要选择带GPU的SoC,用opencl/opengl/vulkan编程;也可以试试NPU,不过现在NPU支持的算子不多,一些自定义Op多的网络可能部署不上去对于小模型,或者帧率要求不高的,可能用CPU就够了,不过一般需要做点优化(剪枝、量化、SIMD、汇编、Winograd等)顺带一提,在手机上部署深度学习模型也可以归在此列,只不过硬件没得选,用户用什么手机你就得部署在什么手机上23333。为老旧手机部署才是最为头疼的上述部署和优化的软件工作,在一些移动端开源框架都有人做掉了,一般拿来改改就可以用了,性能都不错。
需求六:上述部署方案不满足我的需求比如开源移动端框架速度不够——自己写一套。比如像商汤、旷世、Momenta都有自己的前传框架,性能应该都比开源框架好。只不过自己写一套比较费时费力,且如果没有经验的话,很有可能费半天劲写不好
  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值