初探SAM3(一) :SAM3 TensorRT 部署踩坑记录

📅 2026/7/10 22:52:54
初探SAM3(一) :SAM3 TensorRT 部署踩坑记录
本文档记录在 Windows 11 RTX 5060 Ti (Blackwell SM_120a) 环境下将 SAM3 模型部署为 TensorRT GPU 推理引擎的完整过程以及 FP16 精度问题的排查结果。一、环境安装SAM3 模型下载先在Hugging Face上下载让我注册填写个人信息然后审核结果没审核通过然后我直接在魔塔社区下载了没有什么特殊限制直接可以下载模型比较大在终端下载如下图所示后面所有SAM3相关操作都是基于这个模型展开的。1. 驱动与 CUDA组件版本下载GPU 驱动591.86NVIDIA 官网CUDA Toolkit12.8https://developer.nvidia.com/cuda-downloadsCUDA 12.8 安装后路径为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8将以下路径加入系统 PATHC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\lib\x642. cuDNNcuDNN 按 CUDA 大版本打包如cuDNN 9.x for CUDA 12.x不分小版本所以 CUDA 12.9 的 cuDNN 可以直接用于 CUDA 12.8。安装方式下载对应 CUDA 12.x 的 cuDNN zip将bin/、lib/、include/文件覆盖到 CUDA 安装目录。当前环境使用cuDNN 8.9.7CUDA 12.8 自带位于bin/cudnn64_8.dllcuDNN 9.23.0从 CUDA 12.9 包覆盖新增cudnn64_9.dll系列两个版本共存TensorRT 实际调用哪个取决于它链接的是cudnn64_8.dll还是cudnn64_9.dll。3. TensorRT项目使用两个版本对比版本路径用途TRT-RTX 1.5.0.114C:\My_Project\src\deeplearning\SAM3\TensorRT-RTX-1.5.0.114\主要部署版本TRT 10.11.0.33C:\package\TensorRT-10.11.0.33\对比测试Windows 环境配置Python 脚本中importos# TRT-RTX 路径os.environ[PATH]rC:\My_Project\src\deeplearning\SAM3\TensorRT-RTX-1.5.0.114\bin;os.environ.get(PATH,)os.add_dll_directory(rC:\My_Project\src\deeplearning\SAM3\TensorRT-RTX-1.5.0.114\bin)os.add_dll_directory(rC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\bin)# 使用标准 TRT 时还需注册插件importtensorrtastrt trt.init_libnvinfer_plugins(trt.Logger(trt.Logger.WARNING),)注意TRT-RTX 导入tensorrt_rtx模块标准 TRT 导入tensorrt模块。4. ONNX Runtime用于预处理图像缩放、归一化。项目使用 onnxruntime-win-x64-gpu-1.26.0。C:\My_Project\src\deeplearning\SAM3\sjl\onnxruntime-win-x64-gpu-1.26.0\onnxruntime-win-x64-gpu-1.26.0\PyPI 安装pipinstallonnxruntime-gpu1.26.0PyTorch 自带 cuDNN版本 91002独立于系统 cuDNN不影响 TensorRT。5. Python 环境项目使用 Anaconda 管理环境conda create-nsam3python3.10conda activate sam3 pipinstallnumpy opencv-python onnxruntime-gpu tensorrt-cu12二、ONNX 模型导出SAM3 ONNX 导出采用两步法Step 1: 导出核心模型位置sjl/export_onnx/export_onnx/export_onnx.py由于F.interpolate(antialiasTrue)无法直接导出为 ONNX预处理被剥离出核心模型。核心模型只包含 ViT 编码器 解码器 分割头。Step 2: 导出预处理模型位置sjl/export_onnx/export_onnx/export_preprocess_onnx.py用 ONNX 原生算子构建预处理流程BGR→RGB 转换 → Resize(1008×1008) → 归一化。导出产物在sjl/export_onnx/exports/目录下包含 FP16 和 FP32 两个版本。多类别文本检测SAM3 原生支持批量文本编码forward_text()接受List[str]。方案 A推荐导出时预先编码所有类别作为 ONNX 常量。推理时无文本编码开销但类别在导出时固定。方案 B将language_features和language_mask设为 ONNX 输入运行时灵活但需 CPU 预计算文本特征。三、TensorRT Engine 构建与测试Engine 文件列表文件来源精度大小sam3_core_fp32_trt_rtx.engineTRT-RTXFP32~1.9Gsam3_core_fp16_trt_rtx.engineTRT-RTXFP16~1.0Gsam3_core_bf16_trt_rtx.engineTRT-RTXFLOAT (非 BF16)~1.9Gsam3_core_fp16_from_fp32.engineTRT 10.11,--fp16FP16~1.0Gsam3_core_fp16_notf32.engineTRT 10.11,--fp16,--noTF32FP16~1.0G测试脚本脚本用途test_trt_rtx.py主测试脚本TRT-RTX 推理 计时 benchmarktest_fp16_quick.py快速 FP16 验证profile_fp16.pyFP16 vs FP32 精度对比dump_layers.py层结构分析dump_layers2.py层名称逐行 dump推理流程原始图像 (cv2.imread) → ONNX 预处理 (CPU) → (1, 3, 1008, 1008) FP32/FP16 → CUDA memcpy → GPU → TensorRT engine 推理 → 输出 (boxes, scores, masks, presence_logit) → CUDA memcpy → CPU → 后处理 (NMS, 阈值)四、FP16 精度问题排查结果问题现象FP16 engine 推理得到的 detection scores 全部异常偏低max0.02而期望值应接近 0.94。Enginepresence_logitscores max精度正确?ONNX FP32 CPU5.670.942正确ONNX FP16 CPU5.670.942正确TRT-RTX FP325.670.942正确TRT-RTX FP16-2.820.021错误TRT 10.11 FP16-4.660.003错误排查步骤#测试结果结论1ONNX FP16 CPU 推理正确FP16 模型本身没问题2TRT-RTX FP32 GPU 推理正确GPU 执行路径正常3TRT-RTX FP16 GPU 推理错误FP16 GPU kernel 有问题4升级 cuDNN 8.9.7 → 9.23.0无变化不是 cuDNN 单版本问题5TRT 10.11 FP16错误不是 TRT-RTX 特有的 bug6--builderOptimizationLevel0错误不是优化级别导致7--noCompilationCache错误不是编译缓存导致8--noTF32错误不是 TF32 精度模式导致速度对比N30 次迭代Engine平均/帧FPSTRT-RTX FP32509ms2.0TRT-RTX FP16122ms8.1TRT 10.11 FP1695ms10.4FP16 速度快 4-5 倍但精度完全不可用。层结构分析FP32 engine1042 层FP16 engine786 层FP16 模式有更多层融合基本层类型相同仅融合程度不同完整层 dump 见trt_test/layers_dump.txt初步怀疑-待验证TensorRT 的 FP16 GEMM/卷积 GPU kernel 在 Blackwell SM_120 架构上计算错误。关键证据ONNX FP16 CPU 正确 → 模型 FP16 精度本身够用TRT FP32 GPU 正确 → GPU 执行正常TRT-RTX 和 TRT 10.11 都错 → 不是某个 TRT 版本的 bugcuDNN 升级无效 → 不是单一 cuDNN 版本问题SM_120 是 2025 年新架构TensorRT/cuDNN 的 FP16 kernel 在该架构上未经验证。其他项目如 dataplayer12/SAM3-TensorRT使用 RTX 3090 (Ampere)、A100、H100、GB200 (服务器 Blackwell) 等成熟 GPUFP16 正常工作问题仅出现在桌面版 SM_120a (RTX 5060 Ti)。五、解决方案与下一步当前可用方案使用 FP32 engine精度正确scores max0.942与 ONNX 一致速度509ms/帧2 FPSEngine 文件sam3_core_fp32_trt_rtx.engine修复方向**使用更新版本的 cuDNN **后续版本可能修复 SM_120 FP16 kernel等待 TRT-RTX 2.x 或 TRT 11.x新 TRT 版本可能加入 SM_120a 验证CUDA 12.9 完整工具链NVIDIA 发布正式版 CUDA 12.9 后可能包含 SM_120 修复测试 BF16 路径如果 NVIDIA 在 TRT-RTX 中加入--bf16支持BF16 可能走不同的 GPU kernel 路径