ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv7 部署到 Triton Inference Server:TensorRT 引擎导出、模型仓库配置与客户端推理全流程指南

YOLOv7 部署到 Triton Inference Server:TensorRT 引擎导出、模型仓库配置与客户端推理全流程指南 人工智能深度学习计算机视觉【免费下载链接】yolov7Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors项目地址https://gitcode.com/GitHub_Trending/yo/yolov7点击查看免费下载导读本文档基于仓库deploy/triton-inference-server/目录下的官方部署指南完整讲解如何将 YOLOv7 从 PyTorch 权重导出为带 EfficientNMS 插件与动态 batch 的 ONNX再通过 trtexec 编译为 FP16 精度的 TensorRT engine最终以tensorrt_plan平台接入 NVIDIA Triton Inference Server 的完整流程。读完本文你将掌握模型仓库Model Repository目录规范、config.pbtxt最小配置、Triton 容器启动参数以及使用仓库自带的client.py客户端通过 gRPC 对图片、视频和批量请求进行推理与结果渲染的方法。Triton Inference Server 为模型部署提供了开箱即用的多项能力gRPC 与 HTTP 双接口、多 GPU 自动调度、共享内存含 GPU 共享内存、动态服务端批处理Dynamic Batching、健康状态指标与内存资源管理。本部署方案除一个支持 GPU 的可用 Docker 守护进程外无需任何额外运行时依赖推理逻辑全部封装在引擎与服务端客户端仅通过 gRPC 协议交互。一、整体流程概览从.pt权重到 Triton 上稳定推理共经历四个阶段PyTorch → ONNX使用仓库根目录的 export.py 导出带 grid、end2endEfficientNMS与动态 batch 的 ONNX 模型ONNX → TensorRT Engine在 TensorRT Docker 容器内用trtexec以 FP16 精度、动态 batch 形状编译出.engine文件构建 Triton 模型仓库按 Triton 规定的目录结构放置 engine 文件命名为model.plan与config.pbtxt配置启动服务并推理运行 Triton 容器挂载模型仓库使用 client.py 发送 gRPC 推理请求。下文按此顺序展开并在关键环节结合仓库源码说明底层实现细节。二、第一步导出 TensorRT 引擎2.1 前置依赖onnx-simplifier通用 requirements.txt 中并未列出 ONNX 简化工具需要单独安装pip3 install onnx-simplifier2.2 PyTorch → ONNX含 grid、EfficientNMS 插件与动态 batch# Pytorch Yolov7 - ONNX with grid, EfficientNMS plugin and dynamic batch size python export.py --weights ./yolov7.pt --grid --end2end --dynamic-batch --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640对照 export.py 的参数定义逐项说明其作用与默认值参数作用仓库默认值本部署取值--weights待导出的 PyTorch 权重路径./yolor-csp-c.pt./yolov7.pt--img-size输入尺寸高、宽会被校正为 stride 的倍数[640, 640]640 640--dynamic-batch为 ONNX 的 batch 维度声明动态轴供 TensorRT / ONNX Runtime 使用关闭开启--grid导出Detect()层的 grid控制model.model[-1].export标志关闭开启--end2end导出端到端 ONNX内置 NMS把 NMS 融入模型图关闭开启--topk-all每张图保留的 Top-K 目标数100100--iou-thresNMS 的 IoU 阈值0.450.65--conf-thresNMS 的置信度阈值0.250.35--simplify使用 onnxsim 简化 ONNX 图关闭开启源码级原理在 export.py 中当同时开启--grid与--end2end时模型会被包装为models.experimental.End2End对象并将输出名固定为[num_dets, det_boxes, det_scores, det_classes]——这正是 client.py 中OUTPUT_NAMES声明所使用的四个输出张量名。端到端输出的维度结构为[batch, 1]、[batch, topk_all, 4]、[batch, topk_all]、[batch, topk_all]见 export.py。此外--dynamic-batch会将batch_size替换为字符串batch并把images及四个输出张量的第 0 维标记为动态轴见 export.py。导出成功后可使用 Netron 可视化检查计算图结构。2.3 ONNX → TensorRTtrtexec 编译启动 TensorRT 官方 Docker 镜像并进入交互式容器docker run -it --rm --gpusall nvcr.io/nvidia/tensorrt:22.06-py3将上一步生成的 ONNX 复制进容器# 在容器外执行docker cp yolov7.onnx container-id:/workspace/使用trtexec以FP16 精度、min batch 1、opt batch 8、max batch 8编译引擎./tensorrt/bin/trtexec --onnxyolov7.onnx --minShapesimages:1x3x640x640 --optShapesimages:8x3x640x640 --maxShapesimages:8x3x640x640 --fp16 --workspace4096 --saveEngineyolov7-fp16-1x8x8.engine --timingCacheFiletiming.cache参数含义--minShapes/--optShapes/--maxShapes分别定义动态 batch 的最小、最优与最大输入形状这里统一为Nx3x640x640N 分别为 1、8、8--fp16启用 FP16 半精度计算显著提升吞吐--workspace4096限制 GPU 工作空间为 4096 MB--timingCacheFile复用计时缓存加速后续重复编译。测试引擎是否可用./tensorrt/bin/trtexec --loadEngineyolov7-fp16-1x8x8.engine将编译好的引擎复制回宿主机# 在容器外执行docker cp container-id:/workspace/yolov7-fp16-1x8x8.engine .2.4 引擎性能参考RTX 3090 实测输出以 RTX 3090 为例trtexec的性能摘要如下[I] Performance summary [I] Throughput: 73.4985 qps [I] Latency: min 14.8578 ms, max 15.8344 ms, mean 15.07 ms, median 15.0422 ms, percentile(99%) 15.7443 ms [I] End-to-End Host Latency: min 25.8715 ms, max 28.4102 ms, mean 26.672 ms, median 26.6082 ms, percentile(99%) 27.8314 ms [I] Enqueue Time: min 0.793701 ms, max 1.47144 ms, mean 1.2008 ms, median 1.28644 ms, percentile(99%) 1.38965 ms [I] H2D Latency: min 1.50073 ms, max 1.52454 ms, mean 1.51225 ms, median 1.51404 ms, percentile(99%) 1.51941 ms [I] GPU Compute Time: min 13.3386 ms, max 14.3186 ms, mean 13.5448 ms, median 13.5178 ms, percentile(99%) 14.2151 ms [I] D2H Latency: min 0.00878906 ms, max 0.0172729 ms, mean 0.0128844 ms, median 0.0125732 ms, percentile(99%) 0.0166016 ms [I] Total Host Walltime: 3.04768 s [I] Total GPU Compute Time: 3.03404 s [I] Explanations of the performance metrics are printed in the verbose logs.注意换算口径73.5 qps × batch 8 ≈ 588 fps 约 15ms 延迟。这是引擎本身的吞吐能力叠加 Triton 的动态批处理聚合后服务端可支撑的并发吞吐见后文 Model Analyzer 章节。以上性能数字为原文档在特定硬件RTX 3090与特定 TensorRT 版本下的实测结果不同环境与版本的实际数值会有差异仅作选型参考不构成跨平台性能承诺。三、第二步构建 Triton 模型仓库Model RepositoryTriton 通过固定的目录结构组织模型每个模型一个目录版本子目录存放引擎文件模型目录下放置config.pbtxt。本仓库部署的模型名为yolov7。# 创建目录结构 mkdir -p triton-deploy/models/yolov7/1/ touch triton-deploy/models/yolov7/config.pbtxt # 将引擎放入版本目录并重命名为 model.plan mv yolov7-fp16-1x8x8.engine triton-deploy/models/yolov7/1/model.planmodel.plan是 Triton 对 TensorRT engine 文件的约定命名tensorrt_plan平台要求文件名固定为该值。最终的仓库结构如下$ tree triton-deploy/ triton-deploy/ └── models └── yolov7 ├── 1 │ └── model.plan └── config.pbtxt 3 directories, 2 files四、第三步模型配置 config.pbtxtconfig.pbtxt描述模型的服务端行为。针对本引擎固定 8 batch、动态批处理聚合的最小配置如下name: yolov7 platform: tensorrt_plan max_batch_size: 8 dynamic_batching { }字段说明name模型名称需与目录名一致也是客户端请求时使用的模型标识-m yolov7platformtensorrt_plan表示加载 TensorRT enginemax_batch_size: 8允许的最大批大小与 trtexec 编译时的maxShapes对齐dynamic_batching { }开启 Triton 动态批处理器让服务端把多个并发小请求自动聚合为更大的 batch 送入引擎是获得高吞吐的关键开关。由于 engine 内部已内置 NMS端到端导出config.pbtxt中无需声明输入输出的张量形状若使用普通非 end2end导出则需要在配置中显式给出input/output定义。五、第四步启动 Triton Inference Server使用 Triton 官方镜像启动服务挂载模型仓库docker run --gpus all --rm --ipchost --shm-size1g --ulimit memlock-1 --ulimit stack67108864 -p8000:8000 -p8001:8001 -p8002:8002 -v$(pwd)/triton-deploy/models:/models nvcr.io/nvidia/tritonserver:22.06-py3 tritonserver --model-repository/models --strict-model-configfalse --log-verbose 1启动参数解读-p8000:8000 -p8001:8001 -p8002:8002分别暴露 HTTP8000、gRPC8001与 Metrics8002端口--ipchost --shm-size1g共享主机 IPC 与 1GB 共享内存供系统共享内存与 GPU 共享内存机制使用--ulimit memlock-1 --ulimit stack67108864放开内存锁定限制并加大栈空间避免 CUDA 相关资源受限--model-repository/models模型仓库挂载点--strict-model-configfalse允许引擎在缺少部分配置字段时仍能加载--log-verbose 1输出详细日志。服务启动后日志中应出现模型就绪表------------------------- | Model | Version | Status | ------------------------- | yolov7 | 1 | READY | -------------------------Status列为READY即表示模型加载成功、可接受推理请求。若模型加载失败可通过--log-verbose 1的详细日志定位具体原因如config.pbtxt语法错误、model.plan路径或引擎版本不匹配等。六、性能压测Model Analyzer / perf_analyzer在 RTX 3090 AMD Ryzen 9 5950X 平台上原文档给出了动态批处理开启与关闭的对比数据。压测使用 Triton SDK 镜像中的perf_analyzerdocker run -it --ipchost --nethost nvcr.io/nvidia/tritonserver:22.06-py3-sdk /bin/bash ./install/bin/perf_analyzer -m yolov7 -u 127.0.0.1:8001 -i grpc --shared-memory system --concurrency-range 16关键参数-m yolov7被测模型-u 127.0.0.1:8001gRPC 端口-i grpc使用 gRPC 协议另有http可选--shared-memory system使用系统共享内存传输输入输出减少拷贝开销--concurrency-range 1616 个并发客户端每个客户端发送 batch size 1 的请求。开启动态批处理默认配置的结果截取Concurrency: 16, throughput: 590.119 infer/sec, latency 27080 usec关闭动态批处理后的结果截取Concurrency: 16, throughput: 335.587 infer/sec, latency 47616 usec结论要点16 个并发客户端、batch size 1 的吞吐590 infer/sec与本地单线程按 batch 16 运行引擎的吞吐基本一致——这正是Triton Dynamic Batcher 将并发请求聚合为大 batch的收益体现关闭动态批处理后吞吐显著下降335 vs 590延迟也几乎翻倍47616 vs 27080 usec可见动态批处理对并发场景吞吐的决定性影响。七、在业务代码中调用client.py 客户端仓库提供了可直接运行的 gRPC 客户端 client.py支持三种运行模式dummy空数据连通性测试、image单图推理并渲染结果、video视频流逐帧推理。7.1 安装客户端依赖并运行pip3 install tritonclient[all] opencv-python python3 client.py image data/dog.jpg仓库目录 deploy/triton-inference-server/data/ 下预置了示例输入dog.jpg。执行后控制台会打印每个检测框的类别与置信度并弹出渲染结果窗口7.2 客户端工作流源码解读结合 client.py 源码整个调用链分为四步创建客户端并做三级健康检查L108-L131构造grpcclient.InferenceServerClient后依次调用is_server_live()、is_server_ready()、is_model_ready(model)任一项失败即退出确保服务与模型都处于可用状态构造输入输出输入张量名固定为images数据类型FP32形状[1, 3, height, width]输出张量为num_dets、det_boxes、det_scores、det_classes四个L15-L16与 export.py 端到端导出的输出名一一对应预处理调用 processing.py 中的preprocess()——默认采用letterbox 策略保持宽高比、不足部分以灰度值 127 填充、BGR 转 RGB、HWC转CHW、归一化到[0,1]后处理与渲染调用postprocess()processing.py按num_dets截取有效检测框将归一化坐标换算回原始图像尺寸并还原 letterbox 偏移随后用 render.py 绘制边界框、标签底色与文字用 labels.py 的COCOLabels枚举将类别 ID 映射为 COCO 80 类名称。7.3 client.py 完整命令行参数$ python3 client.py --help usage: client.py [-h] [-m MODEL] [--width WIDTH] [--height HEIGHT] [-u URL] [-o OUT] [-f FPS] [-i] [-v] [-t CLIENT_TIMEOUT] [-s] [-r ROOT_CERTIFICATES] [-p PRIVATE_KEY] [-x CERTIFICATE_CHAIN] {dummy,image,video} [input] positional arguments: {dummy,image,video} Run mode. dummy will send an emtpy buffer to the server to test if inference works. image will process an image. video will process a video. input Input file to load from in image or video mode optional arguments: -h, --help show this help message and exit -m MODEL, --model MODEL Inference model name, default yolov7 --width WIDTH Inference model input width, default 640 --height HEIGHT Inference model input height, default 640 -u URL, --url URL Inference server URL, default localhost:8001 -o OUT, --out OUT Write output into file instead of displaying it -f FPS, --fps FPS Video output fps, default 24.0 FPS -i, --model-info Print model status, configuration and statistics -v, --verbose Enable verbose client output -t CLIENT_TIMEOUT, --client-timeout CLIENT_TIMEOUT Client timeout in seconds, default no timeout -s, --ssl Enable SSL encrypted channel to the server -r ROOT_CERTIFICATES, --root-certificates ROOT_CERTIFICATES File holding PEM-encoded root certificates, default none -p PRIVATE_KEY, --private-key PRIVATE_KEY File holding PEM-encoded private key, default is none -x CERTIFICATE_CHAIN, --certificate-chain CERTIFICATE_CHAIN File holding PEM-encoded certicate chain default is none7.4 三种运行模式详解dummy 模式连通性测试不读取任何文件直接构造一个形状为[1, 3, width, height]、全部填充 1 的 FP32 空缓冲发送给服务端L160-L188验证服务链路、输入输出张量名与形状约定是否正确并打印各输出缓冲的 shape 与元素和配合-i可额外打印模型元数据、配置与推理统计。image 模式单图推理使用 OpenCV 读取图片 →preprocess→ 推理 →postprocess→ 渲染。默认弹窗显示结果传-o指定输出文件路径时保存到磁盘如python3 client.py image data/dog.jpg -o data/dog_result.jpg。渲染细节上client.py 用RAND_COLORS按类别取色绘制边框并以浅灰底深色字渲染「类别置信度」标签。video 模式视频流推理逐帧cap.read()→ 预处理 → 推理 → 后处理 → 渲染实时弹窗播放按q键退出L318-L320。若指定-o则通过cv2.VideoWriterMP4V 编码将结果写入视频文件帧率由-f控制默认 24.0 FPS。每帧会打印该帧检测到的目标数量与明细。八、快速排障清单结合源码与部署经验将常见问题整理如下现象可能原因与排查方向trtexec报错确认 ONNX 已通过--simplify简化--minShapes/optShapes/maxShapes的 batch 与--max-batch-size对齐容器版本与 trtexec 路径./tensorrt/bin/trtexec一致模型状态非 READY检查config.pbtxt语法、name与目录名一致性、model.plan文件名与位置必须在model/1/下用--log-verbose 1查看详细错误客户端is_model_ready失败确认服务端口映射8001 为 gRPC与-m模型名正确检测框偏移检查 letterbox 预处理与后处理是否成对启用processing.py 中preprocess与postprocess的letter_box默认值均为True需保持一致输出张量名不匹配端到端导出必须同时开启--grid --end2end否则输出不是num_dets/det_boxes/det_scores/det_classes九、总结本文从一条完整的生产链路出发演示了 YOLOv7 在 Triton Inference Server 上的标准部署姿势export.py端到端动态 batch ONNX 导出 →trtexecFP16 引擎编译 → 模型仓库与config.pbtxt配置 → Triton 容器启动 →perf_analyzer压测 →client.py业务调用。仓库中 export.py、client.py、processing.py、render.py、labels.py 等文件共同构成了从「权重」到「在线服务」的完整可复现参考实现可直接作为自建推理服务基础设施的起点。赞分享人工智能深度学习计算机视觉【免费下载链接】yolov7Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors项目地址https://gitcode.com/GitHub_Trending/yo/yolov7点击查看免费下载相关推荐TensorRT 引擎部署到 Triton Inference Server 实战从 ONNX 优化、模型仓库配置到客户端推理TensorRT 引擎部署到 Triton Inference Server 实战从 ONNX 优化、模型仓库配置到客户端推理 本文基于 TensorRT 仓人工智能推理引擎深度学习本地部署模型优化LunaTranslator 内嵌翻译实战指南乱码排查与配置项全解LunaTranslator 内嵌翻译实战指南乱码排查与配置项全解 画面里的文字变成了方块 游戏里一句日文对话突然变成一整排方块时「盯着翻译窗口等它出来、再桌面应用OCR人工智能阿里云 EAS 上部署 Triton Inference Server 实战指南从 OSS 模型仓库到线上推理阿里云 EAS 上部署 Triton Inference Server 实战指南从 OSS 模型仓库到线上推理 导读 本指南基于 Triton Inferen模型推理服务AI 应用后端上一篇Obsidian插件汉化完整教程5分钟让英文插件变中文界面下一篇FWUPDLinux固件更新生态系统的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表