1. 适用范围

本文只针对当前项目正在使用的容器环境:

  • 容器名:pvn3d-dev
  • 容器系统:Ubuntu 18.04.5 LTS
  • 项目路径:/workspace/workflow/self/PVN3D
  • Conda 环境:pvn3d
  • Python:3.8.20
  • PyTorch:1.10.0+cu113
  • CUDA Toolkit:11.3
  • GPU:NVIDIA GeForce RTX 4060 Laptop GPU

本文目标不是重建训练环境,而是在现有 PVN3D 环境上补齐 TensorRT,用于后续:

  • deploy/scripts/export_onnx.py
  • deploy/scripts/build_trt_engine.py

2. 当前容器实测状态

通过 docker exec 实测,当前容器状态如下:

  • nvidia-smi 正常
  • torch.cuda.is_available()True
  • PointNet2 扩展可导入
  • onnx 未安装
  • onnxruntime 未安装
  • tensorrt Python 包未安装
  • trtexec 不在 PATH

这说明当前 PVN3D 原生推理环境正常,但 TensorRT 部署链还没装齐。

3. 推荐安装方案

这套环境建议使用 TensorRT 8.6.1

3.1 EA 和 GA 的区别

如果你在 NVIDIA 下载页看到:

  • TensorRT 8.6 EA for x86_64 Architecture
  • TensorRT 8.6 GA for x86_64 Architecture

这里的区别不是“能不能装”,而是发布阶段不同。

EA 的意思是 Early Access,用于提前测试和收集反馈。NVIDIA 在 TensorRT 8.6.0 EA 的官方 Release Notes 里明确写了:这是面向 early testing and feedback 的版本,生产环境继续使用 TensorRT 8.5.3。

GA 的意思是 General Availability,也就是正式可用版本。GA 版通常意味着:

  • API 和行为更稳定
  • 已修复一轮 EA 阶段暴露的问题
  • 更适合作为生产或长期维护环境的基线
  • 文档、支持矩阵、已知问题列表更完整

对当前 pvn3d-dev 容器,应该直接选 GA,不要选 EA。原因很直接:

  • 当前目标是把 PVN3D 的部署链稳定跑通
  • 不是做 TensorRT 新特性的预研
  • 当前环境已经固定在 Python 3.8 + torch 1.10.0+cu113 + CUDA 11.3
  • 再引入 EA 版,只会额外增加兼容性和排错成本

本文后面提到的 TensorRT 8.6.1,默认就是指 GA 线。

不建议在这个容器里直接切到 TensorRT 10.x,原因很简单:

  • 当前 PyTorch 仍是 cu113
  • 当前容器内 CUDA Toolkit 是 11.3
  • 先把第一阶段部署链跑通,比升级整套推理环境更重要

这篇文档采用下面这条安装路径:

  1. 宿主机手动下载 TensorRT 8.6.1 安装包
  2. docker cp 复制到 pvn3d-dev
  3. 在容器内解压到固定目录
  4. 配置 PATHLD_LIBRARY_PATH
  5. pvn3d conda 环境中安装 cp38 对应的 TensorRT Python wheel
  6. 验证 trtexecimport tensorrt

选择这条路径的原因:

  • 不改动现有 PyTorch / CUDA 训练环境
  • 不依赖系统 Python
  • trtexec 和 Python 绑定都能拿到
  • 后续升级或回滚更容易

4. 安装前核验

先在宿主机确认容器正常运行:

docker ps --filter name=pvn3d-dev

然后进入容器核验当前基线:

docker exec -it pvn3d-dev bash
source /opt/conda/etc/profile.d/conda.sh
conda activate pvn3d
cd /workspace/workflow/self/PVN3D

python --version
nvidia-smi
nvcc --version
python - <<'PY'
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
if torch.cuda.is_available():
    print(torch.cuda.get_device_name(0))
PY

预期结果:

  • Python 是 3.8.x
  • CUDA Toolkit 是 11.3
  • torch.cuda.is_available() 返回 True

如果这一步不成立,不要继续装 TensorRT,先修当前容器。

5. 下载 TensorRT 安装包

5.1 推荐版本

推荐版本:

  • TensorRT:8.6.1 GA

建议优先选择 Linux x86-64 的 TensorRT 8.6.1 安装包。

结合当前容器环境,更建议下载 CUDA 11.x 对应的 TensorRT 8.6.1 包,不要直接选 CUDA 12.x 线。

这里有一条工程判断:

  • 当前容器是 torch 1.10.0+cu113
  • 虽然新驱动能兼容更高 CUDA 版本,但这里不需要把 TensorRT 单独推到 CUDA 12 线
  • 保持在 CUDA 11 大版本内,后续排查更简单

5.2 这么多安装包里应该选哪一个

针对当前 pvn3d-dev 容器,应该下载这个:

TensorRT 8.6 GA for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7 and 11.8 TAR Package

选择理由:

  • 当前容器系统是 Ubuntu 18.04.5
  • 当前容器内 CUDA Toolkit 是 11.3
  • 当前 PyTorch 是 1.10.0+cu113
  • 当前目标是在已有容器中补 TensorRT,而不是重装系统级依赖
  • TAR Package 更适合复制进容器后手动解压,再接入现有 conda 环境

不建议选其他包,原因如下:

  • Ubuntu 22.04 DEB local repo Package
    系统不匹配,当前容器不是 Ubuntu 22.04
  • Ubuntu 20.04 DEB local repo Package
    系统不匹配,当前容器不是 Ubuntu 20.04
  • Ubuntu 18.04 DEB local repo Package
    虽然系统版本匹配,但更适合直接走 apt 安装。对当前这个已有训练环境的容器来说,侵入性更强,不如 TAR 方案容易控制和回滚
  • CentOS / RedHat RPM local repo Package
    发行版不匹配
  • 所有 CUDA 12.0 / 12.1
    当前容器的稳定基线是 CUDA 11.3,不建议把 TensorRT 单独切到 CUDA 12 线

可以直接按下面这个判断来记:

  • 如果目标是在现有 pvn3d-dev 容器里补 TensorRT,选 CUDA 11.xLinux x86_64 TAR Package
  • 不选 DEB
  • 不选 RPM
  • 不选 CUDA 12.x

5.3 下载方式

TensorRT 安装包需要从 NVIDIA Developer 下载,通常需要登录。

建议在宿主机浏览器中完成下载,不要在容器里临时抓取。

下载后,假设宿主机文件在:

~/Downloads/TensorRT-8.6.1.x.Linux.x86_64-gnu.cuda-11.x.tar.gz

实际文件名以你下载到的版本为准。

6. 把安装包复制进容器

在宿主机执行:

docker cp ~/Downloads/TensorRT-8.6.1.x.Linux.x86_64-gnu.cuda-11.x.tar.gz \
  pvn3d-dev:/tmp/

复制完成后检查:

docker exec pvn3d-dev bash -lc 'ls -lh /tmp/TensorRT-8.6.1*.tar.gz'

7. 容器内安装 TensorRT

7.1 进入容器并激活环境

docker exec -it pvn3d-dev bash
source /opt/conda/etc/profile.d/conda.sh
conda activate pvn3d
cd /workspace/workflow/self/PVN3D

7.2 准备安装目录

建议把 TensorRT 解压到固定目录:

mkdir -p /opt/tensorrt
cd /opt/tensorrt

7.3 解压安装包

tar -xzf /tmp/TensorRT-8.6.1*.tar.gz -C /opt/tensorrt
ls -lh /opt/tensorrt

解压后应出现类似目录:

/opt/tensorrt/TensorRT-8.6.1.x

进入目录检查结构:

cd /opt/tensorrt/TensorRT-8.6.1*
ls

正常应能看到这些子目录:

  • bin
  • include
  • lib
  • python
  • samples

7.4 配置当前 shell 的运行环境

先在当前 shell 临时生效:

export TRT_ROOT=$(echo /opt/tensorrt/TensorRT-8.6.1*)
export PATH=$TRT_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$TRT_ROOT/lib:$LD_LIBRARY_PATH

检查:

echo $TRT_ROOT
which trtexec
ldconfig -p | grep nvinfer || true

说明:

  • which trtexec 能找到就够了
  • ldconfig -p 查不到不一定是错,因为这里主要依赖 LD_LIBRARY_PATH

8. 安装 TensorRT Python 绑定

当前 pvn3d 环境是 Python 3.8,所以必须安装 cp38 对应的 wheel。

先进入 TensorRT 的 Python wheel 目录:

cd $TRT_ROOT/python
ls -1

找出 cp38 的 wheel:

ls -1 *cp38*.whl

安装前先升级基础打包工具:

python -m pip install --upgrade pip wheel setuptools

安装 TensorRT Python wheel:

python -m pip install ./*cp38*.whl

如果目录里同时存在多个 wheel,不要用模糊匹配一次性全装,优先安装主 TensorRT wheel。

更稳妥的方式是先确认文件名,再显式安装,例如:

python -m pip install ./tensorrt-8.6.1.*-cp38-none-linux_x86_64.whl

如果后续确实需要 lean 或 dispatch runtime,再单独装:

python -m pip install ./tensorrt_lean-8.6.1.*-cp38-none-linux_x86_64.whl
python -m pip install ./tensorrt_dispatch-8.6.1.*-cp38-none-linux_x86_64.whl

对当前项目第一阶段部署,不需要先装 lean 或 dispatch。

9. 持久化环境变量

如果只在当前 shell 里 export,退出容器后就失效。

针对当前 conda 环境,建议把 TensorRT 环境变量写进 activate.d

9.1 创建激活脚本

mkdir -p /opt/conda/envs/pvn3d/etc/conda/activate.d
mkdir -p /opt/conda/envs/pvn3d/etc/conda/deactivate.d

创建激活脚本:

cat >/opt/conda/envs/pvn3d/etc/conda/activate.d/tensorrt.sh <<'EOF'
export TRT_ROOT=/opt/tensorrt/TensorRT-8.6.1.6
export _OLD_TRT_PATH="${PATH:-}"
export _OLD_TRT_LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}"
export PATH="$TRT_ROOT/bin:$PATH"
export LD_LIBRARY_PATH="$TRT_ROOT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
EOF

创建退出脚本:

cat >/opt/conda/envs/pvn3d/etc/conda/deactivate.d/tensorrt.sh <<'EOF'
if [ -n "${_OLD_TRT_PATH+x}" ]; then
  export PATH="$_OLD_TRT_PATH"
else
  export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
fi

if [ -n "${_OLD_TRT_LD_LIBRARY_PATH+x}" ]; then
  export LD_LIBRARY_PATH="$_OLD_TRT_LD_LIBRARY_PATH"
else
  unset LD_LIBRARY_PATH
fi

unset _OLD_TRT_PATH
unset _OLD_TRT_LD_LIBRARY_PATH
unset TRT_ROOT
EOF

这里不要写占位目录名,必须改成实际解压出来的目录名。
当前示例使用的是:

/opt/tensorrt/TensorRT-8.6.1.6

如果你的目录名不同,按实际目录修改。

9.2 这一段为什么不能照旧写

如果把退出脚本写成下面这种形式:

export PATH="$_OLD_TRT_PATH"
export LD_LIBRARY_PATH="$_OLD_TRT_LD_LIBRARY_PATH"

在下面这种场景里会出问题:

  1. 你已经在 pvn3d 环境里
  2. 这时才新建 activate.ddeactivate.d
  3. 没有重新激活过环境,就直接执行 conda deactivate

此时 _OLD_TRT_PATH_OLD_TRT_LD_LIBRARY_PATH 其实还没有被激活脚本设置过。
结果就是:

  • PATH 可能被清空
  • LD_LIBRARY_PATH 可能被清空
  • conda 后续调用的 dirnamelswhich 等系统命令找不到

这就是常见的报错来源:

bash: dirname: No such file or directory
bash: dirname: command not found

9.3 如果已经把 PATH 清空了

先临时恢复一个最基本的系统 PATH

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

然后重新写入上面的两个脚本,再执行:

conda deactivate
conda activate pvn3d
which trtexec
echo $TRT_ROOT

10. 验证安装结果

10.1 验证 trtexec

trtexec --help | head

10.2 验证 Python 绑定

python - <<'PY'
import tensorrt as trt
print("TensorRT:", trt.__version__)
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
print("builder_ok:", builder is not None)
PY

10.3 验证当前项目需要的最小能力

python - <<'PY'
import os
import tensorrt as trt
print("TensorRT:", trt.__version__)
print("trtexec_in_path:", os.popen("which trtexec").read().strip())
PY

预期结果:

  • trtexec 能运行
  • import tensorrt 成功
  • trt.Builder(...) 能创建对象

11. 补齐 ONNX 依赖

TensorRT 装完后,还需要补 ONNX 导出链依赖,否则仍然不能执行部署脚本。

pvn3d 环境里执行:

python -m pip install onnx==1.14.1 onnxruntime==1.16.3

然后检查:

python - <<'PY'
import onnx
import onnxruntime as ort
print("onnx:", onnx.__version__)
print("onnxruntime:", ort.__version__)
PY

12. pip 里的 TensorRT 包有什么区别

如果你查 pip 安装方法,会看到不止一个 TensorRT 包名。这些包的定位不一样。

12.1 tensorrt

这是完整开发包,对应完整的 builder + runtime 能力。

适合场景:

  • 需要在 Python 里构建 engine
  • 需要完整 TensorRT Python API
  • 需要做开发、调试、转换、验证

对当前 PVN3D 部署链,如果想走纯 pip 方案,理论上应该装这一类。

12.2 tensorrt-cu11 / tensorrt-cu12

这是按 CUDA 大版本拆分的 pip 元包。

区别不在 TensorRT 功能,而在它会拉取哪一套 CUDA 主版本依赖。

  • tensorrt-cu11
    面向 CUDA 11.x
  • tensorrt-cu12
    面向 CUDA 12.x

如果不显式写 CUDA 后缀,官方较新的 pip 元包通常默认会偏向较新的 CUDA 主版本。
对当前 pvn3d-dev,如果你强行走 pip 元包路线,至少也应该选 cu11,不能选 cu12

12.3 tensorrt-lean

这是精简运行时。

特点:

  • 只用于运行预先构建好的 engine
  • 体积更小
  • 不包含完整 builder 能力

适合场景:

  • 只做部署
  • engine 已经在别处构建好了
  • 只需要推理运行时

不适合当前这一步,因为你现在还要在这个环境里构建 engine。

12.4 tensorrt-dispatch

这是更小的 dispatch runtime。

特点:

  • 体积比 lean 更小
  • 也是运行时导向
  • 主要适合最小化部署占用

它同样不适合当前阶段,因为当前阶段需要的不只是“运行 engine”,还需要“生成 engine”。

12.5 这几个包在当前项目里怎么选

对当前 pvn3d-dev,结论很明确:

  • 不优先用 pip install tensorrt
  • 更不建议直接装默认最新的 tensorrt
  • 不用 tensorrt-lean
  • 不用 tensorrt-dispatch

原因:

  • 当前项目已经固定在 Python 3.8 + torch 1.10.0+cu113 + CUDA 11.3
  • 直接走 pip 元包,容易把环境拉向更新的 TensorRT / CUDA 依赖
  • 你当前不仅要运行 engine,还要构建 engine
  • 现阶段最稳的方式仍然是前面这套 TensorRT 8.6.1 GA TAR + cp38 wheel 安装方法

可以直接记成一句话:

  • 当前项目安装 TensorRT,用 TAR + cp38 wheel
  • pip 里的 leandispatch 只适合更后面的轻量运行时部署

13. 安装后建议的首次联调顺序

建议按下面顺序验证,不要一步跳到 engine 构建:

  1. which trtexec
  2. python -c "import tensorrt as trt; print(trt.__version__)"
  3. python -c "import onnx; import onnxruntime"
  4. python deploy/scripts/export_onnx.py --help
  5. python deploy/scripts/build_trt_engine.py --help
  6. python deploy/scripts/export_onnx.py ...
  7. python deploy/scripts/build_trt_engine.py --dry-run
  8. python deploy/scripts/build_trt_engine.py ...

14. 常见问题

14.1 which trtexec 还是空

优先检查:

  • TRT_ROOT 是否写对
  • PATH 是否包含 $TRT_ROOT/bin
  • 你是否重新执行了 conda activate pvn3d

14.2 import tensorrt 失败

优先检查:

  • 装的是不是 cp38 wheel
  • LD_LIBRARY_PATH 是否包含 $TRT_ROOT/lib
  • 当前 shell 是否真的在 pvn3d 环境里

14.3 wheel 装不上

优先检查:

  • Python 版本是否真的是 3.8
  • wheel 文件名是否匹配 cp38
  • pip, setuptools, wheel 是否已经升级

14.4 安装完 TensorRT 后 PyTorch 出问题

先不要立刻重装整个环境,先检查:

  • 是否误装了不匹配的 CUDA 12.x TensorRT Python 包
  • 是否把系统级 CUDA 路径覆盖到了当前环境
  • 是否改坏了 LD_LIBRARY_PATH

15. 回滚方法

如果安装后要回滚,按下面顺序处理:

  1. 删除 conda 激活脚本
  2. 卸载 tensorrt Python wheel
  3. 删除 /opt/tensorrt/TensorRT-8.6.1.x

示例:

rm -f /opt/conda/envs/pvn3d/etc/conda/activate.d/tensorrt.sh
rm -f /opt/conda/envs/pvn3d/etc/conda/deactivate.d/tensorrt.sh
python -m pip uninstall -y tensorrt tensorrt-lean tensorrt-dispatch
rm -rf /opt/tensorrt/TensorRT-8.6.1*

16. 参考

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐