最近在把一个训练好的YOLOv8-seg模型转到TensorRT(FP16)部署,用torch2trt转换挺顺利的,但推理出来的mask精度差得离谱,边界框倒还行。对比了一下中间层输出,从第5个C2f模块开始数值就有偏差了,误差大概在1e-2量级。我已经关了TRT的层融合,也试过用onnx2trt,问题依旧。GPU是3090,CUDA和TensorRT版本都对齐了。查了一圈感觉可能和动态shape或者某些算子的实现有关,但实在没头绪。有没有折腾过类似问题的老哥?求指点一下排查思路,或者推荐一下靠谱的转换工具链,感谢!
楼主
4天前
PyTorch转TensorRT后推理结果和原模型对不上,有人遇到过吗?
请 登录 后发表回复
全部回复
共 3 条
2楼
2天前
FP16对分割mask影响确实大,试试强制指定某些层跑FP32,C2f那块最容易出问题。
3楼
2天前
FP16下mask分支崩但bbox正常,大概率是seg head里某些小数值算子被半精度截断了。可以先把TensorRT的FP16关掉跑一次FP32,看误差是不是直接消失,如果是就锁定精度问题。另外C2f那块有concat和sigmoid,TRT对这类融合处理有时会偷偷改精度,试试用polygraphy逐层dump对比,比盲猜快很多。工具链的话onnxsim加trtexec手动调精度标志比torch2trt可控。
4楼
1天前
FP16下mask分支精度崩掉挺常见的,C2f里那些小数值的激活很容易被半精度截断,bbox分支数值大所以扛得住。你可以先跑一遍FP32的TRT对比看看,如果FP32能对齐就基本锁定是精度问题,再针对seg head附近的层做混合精度或者干脆保留FP32。另外动态shape确实会让TRT选一些奇怪的kernel,试试固定输入尺寸跑一次排除掉这个变量。工具链的话可以看看TensorRT的polygraphy,逐层对比ONNX和TRT输出挺方便的。