YOLOv7-pytorch + Triton server生产环境部署

        本文基于Triton部署架构开发,模型转换过程为pytorch(.pt)-ONNX(.onnx)-TensorRT(.engine)。
        yolov7版本为官方原版。
GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

1.准备

1.1 基础环境(略)

CUDA : 11.7

cudnn : 8.4

2.下载 Anaconda

Anaconda | The World’s Most Popular Data Science Platform

2.1 添加channels:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
gedit ~/.condarc

2.2 pip临时源:

pip后直接加-i https://mirrors.aliyun.com/pypi/simple;VPN pip可能无效。

-i https://mirrors.aliyun.com/pypi/simple
-i https://pypi.tuna.tsinghua.edu.cn/simple

3.安装 pytorch 1.13.1 + tensorrt 8.4.2.4

3.1 安装pytoch、tensorrt

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install pandas requests opencv-python tqdm pyyaml matplotlib seaborn onnx -i https://mirrors.aliyun.com/pypi/simple
pip install nvidia-tensorrt==8.4.2.4 --index-url https://pypi.ngc.nvidia.com

4.模型格式转化

4.1 通过以下链接教程从yolov7导出带NMS的onnx模型:

GitHub - Monday-Leo/YOLOv7_Tensorrt: A simple implementation of Tensorrt YOLOv7

        注意修改export_onnx.py中的参数。

4.2 使用TensorRT将onnx模型转为engine模型

4.2.1 TensorRT下载

        下载版本 : 8.4.2.4(8.4 GA Update 1)

https://developer.nvidia.com/nvidia-tensorrt-8x-download

4.2.2 onnx 转 engine

        (triton load .trt .plan模型导致内存泄漏,原因不明,.engine可行)

方法1:

        (4080显卡不可行,报错ERROR 10 + 2 ; 3060显卡可行)

        在 TensorRT-8.4.2.4/bin 下执行:

./trtexec --onnx=./yolov7.onnx --saveEngine=./yolov7_fp16.engine --fp16 --workspace=200

方法2:

        基于以下链接代码,导出.engine模型,注意修改export.py中的参数。

https://github.com/Linaom1214/TensorRT-For-YOLO-Series/tree/main
        终端命令导出模型:

python ./export.py -o best.onnx -e best.engine -p fp16

        至此模型转换结束

5.安装 triton inference server

参考链接:

Triton部署Torch和Onnx模型,集成数据预处理_triton onnx_adam-liu的博客-CSDN博客

5.1 下载 docker

sudo apt update
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io


systemctl start docker
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
service docker restart

nvidia-docker

5.2 基于Docker下载 Triron server(22.08版本)

docker pull nvcr.io/nvidia/tritonserver:22.08-py3

5.3 创建engine模型文件夹

(1)主文件夹下创建models文件夹;

(2)创建模型文件夹;

(3)创建文件夹1,将engine模型塞进去;

(4)在模型文件夹下创建配置文件config.pbtxt

 路径示例:

配置文件示例:(注意修改name、default_model_filename、input的dims,instance_group根据显卡性能和需求配置)

name: "yolov7_firesmoke_1280"
platform: "tensorrt_plan"
max_batch_size : 0
input [
  {
    name: "images"
    data_type: TYPE_FP32
    dims: [3,1280,1280]
  }
]
output [
  {
    name: "det_boxes"
    data_type: TYPE_FP32
    dims: [ 100,4 ]
  },
  {
    name: "det_classes"
    data_type: TYPE_INT32
    dims: [ 100 ]
  },
  {
    name: "det_scores"
    data_type: TYPE_FP32
    dims: [ 100 ]
  },
  {
    name: "num_dets"
    data_type: TYPE_INT32
    dims: [ 1 ]
  } 
]
default_model_filename: "firesmoke_1280_dec.engine"
instance_group[
  {
    count:2
    kind:KIND_GPU
    gpus:[0]
  }
]

5.4启动Triton Server

5.4.1 终端手动加载模型(多模型管理)

sudo docker run --gpus=1 --rm --net=host -p8000:8000 -p8001:8001 -p8002:8002 -v /home/isst-robot/models:/models nvcr.io/nvidia/tritonserver:22.08-py3 tritonserver --model-repository=/models --strict-model-config=false --model-control-mode explicit

sudo docker run --gpus=1 --rm --net=host -p8000:8000 -p8001:8001 -p8002:8002 -v /home/isst-robot/models:/models nvcr.io/nvidia/tritonserver:22.08-py3 tritonserver --model-repository=/models --strict-model-config=false --model-control-mode explicit

其中 --strict-model-config=false --model-control-mode explicit 表示不自动加载模型,转为手动加载。

(这里要使用--gpus好像要装个依赖包)

5.4.2启动单个模型(/load加载模型,/unload卸载模型)

curl -X POST http://localhost:8000/v2/repository/models/yolov7_helmat_1280/load
curl -X POST http://localhost:8000/v2/repository/models/yolov7_mask_1280/load

5.4.3编写Client端代码
相关依赖
pip3 install nvidia-pyindex
pip3 install tritonclient[all]
 
pip3 install gevent

核心函数如下,使用了python+HTTP,传入image数据进行处理,预处理、后处理根据业务需要写。预处理方面由于Triton传入Tensor必须与配置文件一致,所以必须写resize填充。

def models_infer(triton_client, model_name, confidence_coefficient, image, human=False,
                 output0='det_boxes', output1='det_classes', output2='det_scores', output3='num_dets',
                 request_compression_algorithm=None,
                 response_compression_algorithm=None, ):

    inputs = []
    outputs = []
    input_shape = [1280, 1280]
    
    # ZED数据,图像只要一半
    if human:
        image = image[:, :image.shape[1] // 2]
        image_data, offset = resize_image(image, (input_shape[0], input_shape[1]))
        image_data = np.array(image_data)

    # 调整Tensor (1, 3, 1280, 1280)
    img = np.expand_dims((image_data.astype(np.float32)).transpose((2, 0, 1)), axis=0)

    # 创建infer input
    inputs.append(httpclient.InferInput('images', [1, 3, 1280, 1280], "FP32"))
    inputs[0].set_data_from_numpy(img)

    # OUTPUT0、OUTPUT1为配置文件中的输出节点名称
    outputs.append(httpclient.InferRequestedOutput(output0, binary_data=False))
    outputs.append(httpclient.InferRequestedOutput(output1, binary_data=False))
    outputs.append(httpclient.InferRequestedOutput(output2, binary_data=False))
    outputs.append(httpclient.InferRequestedOutput(output3, binary_data=False))

    # 获取结果
    results = triton_client.infer(
        model_name=model_name,
        inputs=inputs,
        outputs=outputs,
        request_compression_algorithm=request_compression_algorithm,
        response_compression_algorithm=response_compression_algorithm)

    # 转化为numpy格式,output0='位置', output1='种类', output2='置信', output3='目标总数'
    output0 = results.as_numpy(output0)
    output1 = results.as_numpy(output1)
    output2 = results.as_numpy(output2)
    output3 = results.as_numpy(output3)

    # 后处理业务代码
    # TODO:

运行结果:

参考:

Triton部署Torch和Onnx模型,集成数据预处理_triton onnx_adam-liu的博客-CSDN博客

ubuntu-desktop20.04 yolox+tensorrt yolov7+tensorrt推理部署_ubuntu yolov7_lyb_8888的博客-CSDN博客

### 回答1: yolov5-pytorch模型部署可以通过以下步骤实现: 1. 安装必要的依赖库,如pytorch、numpy、opencv等。 2. 下载yolov5-pytorch模型,并将其加载到内存中。 3. 准备待检测的图像或视频数据。 4. 对待检测的数据进行预处理,如缩放、归一化等。 5. 将预处理后的数据输入到yolov5模型中进行检测。 6. 解析检测结果,并将其可视化或保存到文件中。 7. 可以将部署好的模型封装成API接口,供其他应用程序调用。 需要注意的是,模型部署的具体实现方式可能因应用场景而异,例如在嵌入式设备上部署时可能需要进行模型压缩和量化等操作。 ### 回答2: yolov5-pytorch是一种目标检测算法,能够在图像中检测到人、车、建筑等物体,因此在工业生产、医学影像、智能交通等领域得到了广泛的使用。在应用场景中,通常需要将yolov5-pytorch模型部署在服务器上,以便实现实时检测与处理的需求。 要部署yolov5-pytorch模型,需要以下步骤: 1. 准备工作 - 安装pytorch和opencv等依赖库; - 下载yolov5-pytorch源码; - 准备训练集并训练模型。 2. 模型测试 对于训练好的模型,需要进行测试以验证其性能。 - 使用测试集或者视频等数据进行测试; - 可以使用官方提供的test.py或者自定义脚本进行测试; - 统计模型的 AP、F1 score、precision等数据,并分析模型性能和精度。 3. 模型部署 - 可以使用flask等框架进行部署; - 按照官方提供的推理代码进行部署; - 必要时进行模型量化、裁剪等优化操作,以减小模型大小和加速推理速度; - 针对不同的应用场景,可以构建不同的数据预处理和后处理流程,提高模型的优化和性能。 总之,对于yolov5-pytorch模型部署来说,关键是理解原理和基本操作,并结合实际应用场景进行优化和测试。只有在实践中不断探索和改进,才能够实现高效、精确的目标检测应用。 ### 回答3: YOLOv5是最近比较火的目标检测模型,其结构简单,速度快,准确率高,因此得到了广泛的应用。在生产环境中,我们需要将YOLOv5模型部署到特定的硬件设备上,以便快速地对图像或视频流进行实时的目标检测和识别。本文将介绍如何将YOLOv5模型部署Pytorch环境中。 1. 准备工作 在开始部署模型之前,我们需要做一些准备工作: - 安装Pytorch和torchvision - 下载YOLOv5源代码 - 下载预训练权重文件 2. 模型转换 我们需要将YOLOv5的模型转换成适合部署的格式。YOLOv5的模型结构采用Pytorch实现,我们需要将其转换为ONNX格式,以便部署到不同的硬件设备上。通过执行以下命令可以将模型转换为ONNX格式: python models/export.py --weights yolov5s.pt --img 640 --batch 1 3. 部署模型 将生成的ONNX模型导入到Pytorch环境中,并使用特定的库将其部署到硬件设备上。部署的目标设备可能有所不同,例如,我们可以将模型部署到树莓派、Jetson Nano等低功耗嵌入式设备,也可以将其部署到高端GPU服务器中,以实现更快速的目标检测。 在部署模型时,我们需要使用特定的库和API,例如TensorRT、OpenVino等。这些库可以提高模型在不同硬件设备上的性能和速度。 4. 测试模型 部署模型后,我们需要对其进行测试。我们可以使用现有的数据进行测试,也可以使用摄像头或者图像流实时进行目标检测。我们需要对检测结果进行验证,包括检测结果是否准确、检测速度是否满足要求等。 5. 优化模型 在部署模型时,我们也需要考虑优化模型以提高其性能和速度。优化模型的方法包括: - 模型剪枝和量化 - 使用特定的库和API - 模型硬件加速 总结 通过以上步骤,我们可以将YOLOv5模型部署Pytorch环境中,并实现高效的目标检测。随着硬件设备的不断升级和优化,我们可以不断地探索如何优化模型以适应更多的应用场景,提高模型的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值