【Torchserve部署YOLOX远程服务】

环境配置

java
yolox训练所用:3060laptop-win,cuda=11.1,torch=1.9(一个小demo跑着玩的,正常建议linux主机端)
serve环境:自行参考官方教程(切记java需配好)

1.1 mar文件准备

mar文件准备主要需要:model类文件和权重文件;或者torchscript保存的模型权重文件。图省事建议第二种,
直接在:path to YOLOX\tools\infer.py
中找张图infer一下,找到模型推理前一刻,如下代码块第三行前插入上两行

script_model=torch.jit.trace(self.model, img,strict=False)
torch.jit.save(script_model, r'E:\vsCodes\detection_tools\detModels\YOLOX\tools\0612.pt')
outputs = self.model(img)

得到了0612.pt文件(这么弄不需要再把model类拉出来)

1.2 handler文件编写

handler文件继承自serve提供的basehandler;
主要写如下三个模块:

def preprocess(self, data):
	'''
	接口走post请求;
	所以这一步将二进制流转为,模型所接受的tensor张量
	'''
def inference(self, data):
	'''
	单纯的一个model infer过程
	'''
def postprocess(self, data):
	'''
	将infer的结果做后处理(nms、设计输出格式),个人习惯如下:
	[{'bbox': [28, 3, 329, 271], 'category': 'label1', 'score': 0.8932}, {'bbox': [375, 49, 167, 144], 'category': 'label2', 'score': 0.7039}]
	'''

两个必要文件准备完毕。导出mar文件。

torch-model-archiver \
--model-name define_name_for_(.mar) \
--version 1.0 \
--serialized-file path/to/file(.pt, torchscript) \
--export-path path/to/(.mar) \
--handler path/to/your_handler.py -f

到此,第一步工作完成。

2.1 模型启服务

这一步很突然,serve封装好了,后续出bug本人目前只能通过打印日志来处理纠错。。。。
可编写.properties文件,绑定ip,局域网内共享,(想要跨网的话,可以去阿里腾讯云那边买个云服务搞一下内网穿透。)

inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
metrics_address=http://0.0.0.0:8082
# install_py_dep_per_model=true
#number_of_netty_threads=32
#job_queue_size=1000
#max_request_size=65535000
#max_response_size=65535000

2.2 模型请求

官方有给,比较常用的是两条:

#返回healthy,则环境配置无问题,要处理的无非是之后的handler一些逻辑
curl http:/...:8080/ping

#返回自己设计的ans,则成功
curl http:/...:8080/predicitions/model_name -T path/to/test_img

下面是个python请求的小demo,到这一步,局域网内应该可以通用此api了

import os
import os.path as osp
import cv2
from PIL import Image
from io import BytesIO
import time
import glob
import requests

def test(dirpath):
    list=[]
    # filename = "/home/jzp/codes/local_codes/datasets/0.png"
    # url="http://192.168.1.126:8080/predictions/tmp"
   
    if osp.isdir(dirpath):
    	file_lst=glob.glob(osp.join(dirpath, '*.jpg')
    else:
    	file_lst=[dirpath]
    	
    for filename in os.listdir(file_lst):
        start_t=time.time()
        image = Image.fromarray(cv2.imread(filename))
        image2bytes = BytesIO()
        image.save(image2bytes, format="PNG")
        image2bytes.seek(0)
        image_as_bytes = image2bytes.read()
    
        req = requests.post("http://192.168.1.126:8080/predictions/tmp", data=image_as_bytes)
        if req.status_code == 200:
            res = req.json()
            print(res)
        else:
            print(req)

        # os.system('curl -X POST {} -T {}'.format(url, filename))
        list.append(time.time()-start_t)
    
    # print(list)
    print(len(list))
    print(sum(list))

测了一下,cpu启服务,600张在300s,,,,呃,还是gpu吧。。

3 遇到的问题

一开始是用MMdetection,tools/deploy/mmdet2torchserve.py这个贼方便,但是这样的话handler.py就自然捆绑了mmcv、mmdet,serve的环境需求一下就多了两个,而且单纯cpu环境启服务我搞了玩的话,会遇到些麻烦。再有就是,debug只能疯狂重启服务,读log,handler文件得仔细写。。。

serve: https://github.com/pytorch/serve
yolox: https://github.com/Megvii-BaseDetection/YOLOX
印象较深的一个大哥写的使用(yolov5):https://blog.csdn.net/qiumokucao/article/details/124856520?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165501868216781685357478%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165501868216781685357478&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-124856520-null-null.142v13pc_search_result_control_group,157v14control&utm_term=torchserve+yolov5&spm=1018.2226.3001.4187

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值