尝试FP16->full FP32、autocast+simplify等等,仍然是同样大错,说明官方参考脚本里的两点不能解决我们的双目 pose-conditioned DA3-small 子图问题;Python TensorRT build API 本身通常不会改变数值。prepare_tokens 子图在 TensorRT 上是对的,mean diff 4.9e-4,所以错误不是输入、patch Conv、pos embed 或 4D/5D layout。下一步我把第 0 个 Transformer block 单独导出,定位到 LayerNorm/Attention/MLP 中的哪一段。

...

block0 的 ONNX/ORT 仍然正确。

block0 TensorRT 跑完,拉回 diff。

...

第 0 个 block 已经开始偏了:block0 输出 mean diff 0.039,p99 0.174。这比全模型小,但说明根因在第一个标准 Transformer block 内,而不是 DA3 多视图外参或 RoPE。现在我用 FP32/noTF32 跑 block0;如果 FP32 正确,问题是 TensorRT FP16 block 精度;如果 FP32 也错,问题是 TensorRT 对该 block 某个算子的语义/实现。

...

block0 FP32 跑完,速度 ~8.9ms/block,先看数值。

...

FP32 block0 仍然同样错,说明不是 FP16 精度。block0 里最可疑的是 PyTorch F.scaled_dot_product_attention 的导出子图;参考脚本是单目 metric 模型,可能没有暴露这个问题或它们没有验证逐值一致性。现在把所有 Attention 的 fused_attn=False,强制走显式 q @ k.T -> softmax -> attn @ v,先用 block0 验证 TensorRT 数值。

...

manual attention 的 PyTorch/ORT 仍然对齐。测 TensorRT,如果这一步好了,就把 full frontend 也按这个方式导出。

...

manual attention 的 block0 TensorRT 跑完,拉回 diff 看是否改善。

...

定位到了:TensorRT 对 PyTorch 导出的 scaled_dot_product_attention 子图数值不一致。强制 DA3 Attention 走显式 matmul/softmax 后,block0 diff 从 mean 0.039 降到 5.6e-4

问题解决!