0.概述

整个triton的目录结构如下:

1.dali进行图像预处理

运行下面的脚本回生成一个dali后缀的图像处理引擎,这里面的细节参数请看dali的官方文档、

import nvidia.dali as dali
@dali.pipeline_def(batch_size=128, num_threads=4, device_id=0)
def pipe():img0 = dali.fn.external_source(device="cpu", name="IMG1")images = dali.fn.resize(img0, resize_x=640, resize_y=384)images = dali.fn.crop_mirror_normalize(images,dtype=dali.types.FLOAT,output_layout="CHW",std=[255,255,255])return images
def main():pipe().serialize(filename='model.dali')# pipe.build()# o = pipe.run()if __name__ == '__main__':main()

将dali生成的dali文件放到triton内,并定义好输入输出的config.pbtxt文件
config.pbtxt文件:


name: "dalli_preprocess"
backend: "dali"
max_batch_size: 128
input [
{name: "IMG1"data_type: TYPE_UINT8dims: [ 360, 640, 3 ]
}
]output [
{name: "DALI_PRE_OUT"data_type: TYPE_FP32dims: [3, 384, 640 ]
}
]instance_group [{count: 5kind: KIND_CPU}
]

最后的目录结构应该是这样的

models
└── dalli_preprocess├── 1│   └── model.dali└── config.pbtxt

2. yolov5trt

这里用到了tensorrtx项目:https://github.com/wang-xinyu/tensorrtx
可自行查阅相关资料,最后我们会得到一个"yolov5.engine"和一个"myplugin.so"
yolov5.engine 重命名为 model.plan
定义config.pbtxt文件

name: "detect_yolov5"
platform: "tensorrt_plan"
max_batch_size: 128
input [{name: "data"data_type: TYPE_FP32dims: [3, 384, 640 ]}
]
output [{name: "prob"data_type: TYPE_FP32dims: [ 6001, 1, 1]}
]instance_group [{count: 2kind: KIND_GPU}
]

将之前创建的各种文件按如下文件夹目录放置

models
├── dalli_preprocess
│   ├── 1
│   │   └── model.dali
│   └── config.pbtxt
│
└── detect_yolov5(新)├── 1(新)│   └── model.plan(新)└── config.pbtxt(新)plugins(新)
└──libmyplugins.so(新)

3. pytorch-nms后处理

这里的推理后端环境要自己搭建,搭建脚本如下,请仔细阅读根据实际情况删减


conda create -n yolov5_base64_input python=3.8
conda activate yolov5_base64_input
export PYTHONNOUSERSITE=True
conda install pytorch torchvision cudatoolkit=11.6 -c pytorch -c conda-forge
conda install numpy pillow conda-pack
pip install pybase64
conda-pack
#这里会将整个环境打包得到一个tar.gz的包
conda deactivate
conda env remove -n yolov5_base64_input

后处理脚本

import json
import numpy as np
import triton_python_backend_utils as pb_utils
from PIL import Image
from processing import preprocess, postprocess
import re
import base64
from io import BytesIOclass TritonPythonModel:def initialize(self, args):self.model_config = json.loads(args['model_config'])def execute(self, requests):responses = []for request in requests:#     # 获取请求数据# img3_base64 = img3_base64.as_numpy().astype(np.bytes_)nms_threshold = pb_utils.get_input_tensor_by_name(request, "POST_INPUT_NMS")confidence = pb_utils.get_input_tensor_by_name(request, "POST_INPUT_CONF")tersor = pb_utils.get_input_tensor_by_name(request, "POST_INPUT_TENSOR")yolov5_result = tersor.as_numpy().astype(np.float32)nms_threshold = nms_threshold.as_numpy().astype(np.float32)[0]confidence = confidence.as_numpy().astype(np.float32)[0]out  = {}for i in range(len(yolov5_result)):# 这里调用的就是后处理了,参考yolov5原作者处理方式detected_objects = postprocess(np.array([yolov5_result[i]]), 680, 384, confidence, nms_threshold)pic_per = list(map(lambda x :x.out_str(), detected_objects))out['pic_'+str(i)] = pic_perout_tensor_0 = pb_utils.Tensor("POST_OUTPUT",np.array([str(out)]).astype(np.bytes_))responses.append(pb_utils.InferenceResponse([out_tensor_0]))return responsesdef finalize(self):"""`finalize` is called only once when the model is being unloaded.Implementing `finalize` function is OPTIONAL. This function allowsthe model to perform any necessary clean ups before exit."""print('Cleaning up...')

定义输入输出config,pbtxt(需要把环境制定,这里的路径是docker的)

name: "detect_postprocess"
backend: "python"
max_batch_size: 128
input [
{name: "POST_INPUT_TENSOR"data_type: TYPE_FP32dims: [ 6001,1,1]
},
{name: "POST_INPUT_CONF"data_type: TYPE_FP32dims: [ 1]
},
{name: "POST_INPUT_NMS"data_type: TYPE_FP32dims: [ 1]
}
]output [
{name: "POST_OUTPUT"data_type: TYPE_STRINGdims: [ 1 ]
}
]parameters: {key: "EXECUTION_ENV_PATH",value: {string_value: "/plugins/yolov5_base64_input.tar.gz"}
}instance_group [{count: 5kind: KIND_GPU}
]

此时目录结构:

models
├── dalli_preprocess
│   ├── 1
│   │   └── model.dali
│   └── config.pbtxt
│
├── detect_postprocess(新)
│   ├── 1(新)
│   │   ├── boundingbox.py(新)
│   │   ├── model.py(新)
│   │   └── processing.py(新)
│   └── config.pbtxt(新)
│
└── detect_yolov5├── 1│   └── model.plan└── config.pbtxtplugins
├── libmyplugins.so
└── yolov5_base64_input.tar.gz(新)

4.组合前三个组件

定义config.pbtxt

name: "detect_yolov5_pipeline"
platform: "ensemble"
max_batch_size: 128
input [{name: "img1"data_type: TYPE_UINT8dims: [ 360, 640, 3 ]},{ name: "nms_threshold"data_type: TYPE_FP32dims: [ 1 ]},{ name: "confidence"data_type: TYPE_FP32dims: [ 1 ]}
]
output [{name: "OUTPUT0"data_type: TYPE_STRINGdims: [ 1 ]}
]ensemble_scheduling {step [{model_name: "detect_dalli_preprocess"model_version: -1input_map {key: "IMG1"value: "img1"}output_map {key: "DALI_PRE_OUT"value: "preprocessed_image"}},{model_name: "detect_yolov5"model_version: -1input_map {key: "data"value: "preprocessed_image"},output_map {key: "prob"value: "infer_out"}},{model_name: "detect_postprocess"model_version: -1input_map {key: "POST_INPUT_TENSOR"value: "infer_out"},input_map {key: "POST_INPUT_CONF"value: "confidence"},input_map {key: "POST_INPUT_NMS"value: "nms_threshold"},output_map {key: "POST_OUTPUT"value: "OUTPUT0"}}]}

此时的目录结构

models
├── dalli_preprocess
│   ├── 1
│   │   └── model.dali
│   └── config.pbtxt
├── detect_postprocess
│   ├── 1
│   │   ├── __pycache__
│   │   │   ├── boundingbox.cpython-38.pyc
│   │   │   ├── model.cpython-38.pyc
│   │   │   └── processing.cpython-38.pyc
│   │   ├── boundingbox.py
│   │   ├── model.py
│   │   └── processing.py
│   └── config.pbtxt
├── detect_yolov5
│   ├── 1
│   │   └── model.plan
│   └── config.pbtxt
└── detect_yolov5_pipeline(新)├── 1(新,空文件夹)└── config.pbtxt(新)plugins
├── libmyplugins.so
└── yolov5_base64_input.tar.gz

5.启动命令

docker run \
--gpus 1 \
--shm-size=2g \
--rm \
-p8000:8000 -p8001:8001 -p8002:8002 \
-v /home/ubuntu/project/triton_deploy/models:/models -v /home/ubuntu/project/triton_deploy/plugins:/plugins \
--env LD_PRELOAD=/plugins/libmyplugins.so nvcr.io/nvidia/tritonserver:22.08-py3 tritonserver \
--model-repository=/models 

dali预处理-yolov5trt推理-pytorch后处理-nvidia-triton部署相关推荐

  1. triton部署yolov5笔记(五)

    github链接:https://github.com/Lobaer-D/triton-onnx 整体流程可以参考CSDN链接 triton部署yolov5笔记(一) triton部署yolov5笔记 ...

  2. [AI画图本地免安装部署]Windows 10 Nvidia平台部署AUTOMATIC1111 版本 stable diffusion 免安装版

    文章目录 [AI画图本地免安装部署]Windows 10 Nvidia平台部署AUTOMATIC1111 版本 stable diffusion 免安装版 1. 网络准备 1. 下载资源 2. 开始部 ...

  3. triton部署yolov5笔记(三)

    直达链接 Triton部署YOLOV5笔记(一) Triton部署YOLOV5笔记(二) triton部署yolov5笔记(三) triton部署yolov5笔记(四) 拉取镜像 docker pul ...

  4. Pytorch模型通过paddlelite部署到嵌入式设备

    Pytorch模型通过paddlelite部署到嵌入式设备 一.把模型转为嵌入式设备能够识别的格式 1.把.pt或.pth的pytorch模型转为.onnx格式中间过渡状态模型格式,github上X2 ...

  5. 英伟达DALI加速技巧:使数据预处理比原生PyTorch运算速度快4倍

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 你的数据处理影响整个训练速度,如果加上英伟达 DALI 库,处理速度比原生 PyT ...

  6. 英伟达DALI加速技巧:让数据预处理速度比原生PyTorch快4倍

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 选自towardsdatascience 作者:Pieterluitjens 机器之心编译 参与:一鸣.嘉明.思 你的数据处理影响 ...

  7. python数据集的预处理_关于Pytorch的MNIST数据集的预处理详解

    关于Pytorch的MNIST数据集的预处理详解 MNIST的准确率达到99.7% 用于MNIST的卷积神经网络(CNN)的实现,具有各种技术,例如数据增强,丢失,伪随机化等. 操作系统:ubuntu ...

  8. 安装Pytorch时NVIDIA驱动更新,CUDA版本问题

    近几个月就要开题了,准备做图像处理,需要安装Pytorch,在装pytorch GPU版的时候踩过不少坑,因为显卡的原因一直装不好GPU版,很困惑很痛苦,网上找了许多教程都没有说更新驱动driver的 ...

  9. pytorch 41 yolov8的无nsm后处理的onnxruntime部署方案

    自onnx11版本及以后,onnx支持将nms操作嵌入到模型中.本博文将yolov8模型的nms操作嵌入到模型中可以大幅度的简化模型部署代码,提升模型推理速度(在以往大家都是使用opencv的库进行n ...

最新文章

  1. RabbitMQ OS X下安装及常用命令-1
  2. SharePoint 2013创建应用程序时IIS端口文件夹下没文件
  3. python面向对象初识
  4. 软件系统架构~视点和视图
  5. uni怎么使用原生html标签,uni-app如何完美解析富文本内容
  6. 【Flink on k8s】JConsole 远程监控 TaskManager
  7. CCF 2013-12-1 出现次数最多的数
  8. 数组去重实现的方式(越多越好)
  9. Android官方文档中文版
  10. 汇川小型PLC-MODBUS(485)通讯模式
  11. android教师评价系统源码,教师评价系统
  12. 苹果cms tv.html,苹果cms添加TV电视直播教程
  13. 如何通过球面投影(Spherical Projection)将点云转换为距离图像(Range Images)
  14. 冰冻三尺非一日之寒——大型网站架构演进
  15. 无法获取链接服务器 XXX 的 OLE DB 访问接口 SQLNCLI10 的架构行集 DBSCHEMA_TABLES_INFO。该访问接口支持该接口,但使用该接口时返回了失败代码。...
  16. Geek 设计师们疯狂的桌面
  17. 拼多多产品怎么引流?拼多多商品怎么引更多的流量?
  18. Python pyglet 自制3D引擎入门(一) -- 绘制几何体、创建3D场景
  19. 计算机辅助项目管理实验论文,计算机辅助项目管理B卷
  20. Linux_用户账号权限的设定教程!

热门文章

  1. 前端微信小程序仿菜谱精灵
  2. PAT 1029 旧键盘
  3. 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
  4. 小米官网的设计 致敬
  5. 微信公众号h5游戏核销流程
  6. 【01误区解读】知识图谱与文献计量你一定做错了~CiteSpace时区图
  7. java unsupport_Java-如何使用Android自动化修复“ UnsupportedC...
  8. CVPR 2022 论文列表
  9. MS Office EXCEL常用函数
  10. C# 绘制CIE1931彩色马蹄形图(CIE1931色坐标描点显示软件)