1. Yolov8模型导出实战指南第一次把Yolov8模型部署到Triton时我在模型导出环节就踩了坑。当时导出的模型在本地测试一切正常但一到Triton就报维度错误。后来才发现是batch size参数没设置对。这里分享下我总结的可靠导出方法用Ultralytics官方库导出ONNX模型时关键参数要这样配置model.export(formatonnx, batch1, simplifyTrue, opset12, dynamicFalse)重点解释几个容易出错的参数batch1这个必须设置否则Triton推理时会报输入维度不匹配。我实测batch1时85%的情况都会出问题dynamicFalse禁用动态维度能提升10-15%的推理速度特别适合固定输入尺寸的场景opset12ONNX的版本兼容性很重要opset版本太低会导致某些算子不支持导出完成后建议用Netron工具检查模型结构。重点看输入输出节点的输入维度是否为[1,3,640,640]输出维度是否符合预期通常是[1,22,8400]是否有不支持的算子如GridSample2. Triton模型仓库配置详解模型仓库的目录结构就像房子的地基建不好后面全得塌。我建议按这个标准结构组织model_repository/ └── yolov8s ├── 1 │ └── model.onnx └── config.pbtxt关键点在于config.pbtxt的配置这里给出一个经过生产验证的模板name: yolov8s platform: onnxruntime_onnx max_batch_size: 0 input [ { name: images data_type: TYPE_FP32 dims: [1, 3, 640, 640] } ] output [ { name: output0 data_type: TYPE_FP32 dims: [1, 22, 8400] } ] instance_group [ { count: 1 kind: KIND_GPU gpus: [0] } ]遇到过三个典型坑点max_batch_size如果设为0的值必须确保模型支持动态batchdims维度顺序ONNX模型通常是NCHW格式千万别写成NHWC输出名称Yolov8默认输出名是output0用错会导致客户端取不到结果3. Docker容器部署技巧用Docker部署时镜像选择很关键。推荐用NVIDIA官方镜像docker pull nvcr.io/nvidia/tritonserver:23.06-py3启动容器时这几个参数最易出错docker run -d --gpusall \ -p 8000:8000 -p 8001:8001 -p 8002:8002 \ -v /path/to/model_repository:/models \ nvcr.io/nvidia/tritonserver:23.06-py3 \ tritonserver --model-repository/models \ --strict-model-configfalse \ --log-verbose1重点参数说明--gpusall必须加上才能用GPU加速-v挂载路径Windows系统要用绝对路径如/d/models--strict-model-config设为false可以容忍一些配置小错误验证服务是否正常curl -v localhost:8000/v2/health/ready看到返回READY就说明启动成功了。4. Python客户端开发实战客户端代码我重构过3个版本最终这个方案最稳定import tritonclient.http as httpclient import numpy as np import cv2 class TritonYOLOv8: def __init__(self, urllocalhost:8000): self.client httpclient.InferenceServerClient(urlurl) self.inputs httpclient.InferInput(images, [1,3,640,640], FP32) self.outputs httpclient.InferRequestedOutput(output0) def preprocess(self, image_path): img cv2.imread(image_path) img cv2.resize(img, (640, 640)) img img.transpose(2,0,1)[np.newaxis] return img.astype(np.float32) def infer(self, image): self.inputs.set_data_from_numpy(image) response self.client.infer( model_nameyolov8s, inputs[self.inputs], outputs[self.outputs] ) return response.as_numpy(output0) def postprocess(self, output): # 实现后处理逻辑 pass几个性能优化技巧复用client对象避免重复创建连接实测能减少30%的延迟零拷贝传输用set_data_from_numpy而不是手动拷贝批处理支持如果要处理多张图可以扩展input维度5. 性能调优经验分享在真实业务场景中我通过以下优化将QPS从50提升到2001. 模型层面优化转TensorRT引擎FP16精度下速度提升3倍trt_model torch2trt(model, [dummy_input], fp16_modeTrue)启用动态shape需要修改config.pbtxt2. Triton配置优化optimization { execution_accelerators { gpu_execution_accelerator : [ { name : tensorrt parameters { key: precision_mode value: FP16 } }] } }3. 客户端优化使用keepalive连接实现异步请求池预分配内存避免频繁申请释放6. 常见问题解决方案问题1报错failed to load model检查模型路径权限chmod -R 777 model_repository确认config.pbtxt中platform设置正确问题2推理结果异常检查客户端预处理是否与训练时一致用ONNX Runtime本地测试比对结果问题3GPU内存泄漏在config.pbtxt中添加model_warmup [ { batch_size: 1 inputs { key: images value: { data_type: TYPE_FP32 dims: [1,3,640,640] zero_data: true } } } ]这些经验都是从真实项目踩坑中总结出来的。比如内存泄漏问题我们当时发现服务运行几天后就会崩溃最后是通过warmup配置解决的。建议部署前先用JMeter做压力测试提前发现问题。