pvn3d-dev 容器内 TensorRT 安装步骤
1. 适用范围本文只针对当前项目正在使用的容器环境容器名pvn3d-dev容器系统Ubuntu 18.04.5 LTS项目路径/workspace/workflow/self/PVN3DConda 环境pvn3dPython3.8.20PyTorch1.10.0cu113CUDA Toolkit11.3GPUNVIDIA GeForce RTX 4060 Laptop GPU本文目标不是重建训练环境而是在现有 PVN3D 环境上补齐 TensorRT用于后续deploy/scripts/export_onnx.pydeploy/scripts/build_trt_engine.py2. 当前容器实测状态通过docker exec实测当前容器状态如下nvidia-smi正常torch.cuda.is_available()为TruePointNet2 扩展可导入onnx未安装onnxruntime未安装tensorrtPython 包未安装trtexec不在PATH这说明当前 PVN3D 原生推理环境正常但 TensorRT 部署链还没装齐。3. 推荐安装方案这套环境建议使用TensorRT 8.6.1。3.1 EA 和 GA 的区别如果你在 NVIDIA 下载页看到TensorRT 8.6 EA for x86_64 ArchitectureTensorRT 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.0cu113 CUDA 11.3再引入 EA 版只会额外增加兼容性和排错成本本文后面提到的TensorRT 8.6.1默认就是指GA线。不建议在这个容器里直接切到 TensorRT 10.x原因很简单当前 PyTorch 仍是cu113当前容器内 CUDA Toolkit 是11.3先把第一阶段部署链跑通比升级整套推理环境更重要这篇文档采用下面这条安装路径宿主机手动下载 TensorRT 8.6.1 安装包用docker cp复制到pvn3d-dev在容器内解压到固定目录配置PATH和LD_LIBRARY_PATH在pvn3dconda 环境中安装cp38对应的 TensorRT Python wheel验证trtexec和import tensorrt选择这条路径的原因不改动现有 PyTorch / CUDA 训练环境不依赖系统 Pythontrtexec和 Python 绑定都能拿到后续升级或回滚更容易4. 安装前核验先在宿主机确认容器正常运行dockerps--filternamepvn3d-dev然后进入容器核验当前基线dockerexec-itpvn3d-devbashsource/opt/conda/etc/profile.d/conda.sh conda activate pvn3dcd/workspace/workflow/self/PVN3D python--versionnvidia-smi nvcc--versionpython -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.xCUDA Toolkit 是11.3torch.cuda.is_available()返回True如果这一步不成立不要继续装 TensorRT先修当前容器。5. 下载 TensorRT 安装包5.1 推荐版本推荐版本TensorRT8.6.1 GA建议优先选择 Linux x86-64 的 TensorRT 8.6.1 安装包。结合当前容器环境更建议下载CUDA 11.x对应的 TensorRT 8.6.1 包不要直接选 CUDA 12.x 线。这里有一条工程判断当前容器是torch 1.10.0cu113虽然新驱动能兼容更高 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.0cu113当前目标是在已有容器中补 TensorRT而不是重装系统级依赖TAR Package更适合复制进容器后手动解压再接入现有conda环境不建议选其他包原因如下Ubuntu 22.04 DEB local repo Package系统不匹配当前容器不是 Ubuntu 22.04Ubuntu 20.04 DEB local repo Package系统不匹配当前容器不是 Ubuntu 20.04Ubuntu 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.x的Linux x86_64 TAR Package不选DEB不选RPM不选CUDA 12.x5.3 下载方式TensorRT 安装包需要从 NVIDIA Developer 下载通常需要登录。建议在宿主机浏览器中完成下载不要在容器里临时抓取。下载后假设宿主机文件在~/Downloads/TensorRT-8.6.1.x.Linux.x86_64-gnu.cuda-11.x.tar.gz实际文件名以你下载到的版本为准。6. 把安装包复制进容器在宿主机执行dockercp~/Downloads/TensorRT-8.6.1.x.Linux.x86_64-gnu.cuda-11.x.tar.gz\pvn3d-dev:/tmp/复制完成后检查dockerexecpvn3d-devbash-lcls -lh /tmp/TensorRT-8.6.1*.tar.gz7. 容器内安装 TensorRT7.1 进入容器并激活环境dockerexec-itpvn3d-devbashsource/opt/conda/etc/profile.d/conda.sh conda activate pvn3dcd/workspace/workflow/self/PVN3D7.2 准备安装目录建议把 TensorRT 解压到固定目录mkdir-p/opt/tensorrtcd/opt/tensorrt7.3 解压安装包tar-xzf/tmp/TensorRT-8.6.1*.tar.gz-C/opt/tensorrtls-lh/opt/tensorrt解压后应出现类似目录/opt/tensorrt/TensorRT-8.6.1.x进入目录检查结构cd/opt/tensorrt/TensorRT-8.6.1*ls正常应能看到这些子目录binincludelibpythonsamples7.4 配置当前 shell 的运行环境先在当前 shell 临时生效exportTRT_ROOT$(echo/opt/tensorrt/TensorRT-8.6.1*)exportPATH$TRT_ROOT/bin:$PATHexportLD_LIBRARY_PATH$TRT_ROOT/lib:$LD_LIBRARY_PATH检查echo$TRT_ROOTwhichtrtexec ldconfig-p|grepnvinfer||true说明which trtexec能找到就够了ldconfig -p查不到不一定是错因为这里主要依赖LD_LIBRARY_PATH8. 安装 TensorRT Python 绑定当前pvn3d环境是 Python 3.8所以必须安装cp38对应的 wheel。先进入 TensorRT 的 Python wheel 目录cd$TRT_ROOT/pythonls-1找出cp38的 wheells-1*cp38*.whl安装前先升级基础打包工具python-mpipinstall--upgradepip wheel setuptools安装 TensorRT Python wheelpython-mpipinstall./*cp38*.whl如果目录里同时存在多个 wheel不要用模糊匹配一次性全装优先安装主 TensorRT wheel。更稳妥的方式是先确认文件名再显式安装例如python-mpipinstall./tensorrt-8.6.1.*-cp38-none-linux_x86_64.whl如果后续确实需要 lean 或 dispatch runtime再单独装python-mpipinstall./tensorrt_lean-8.6.1.*-cp38-none-linux_x86_64.whl python-mpipinstall./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.dmkdir-p/opt/conda/envs/pvn3d/etc/conda/deactivate.d创建激活脚本cat/opt/conda/envs/pvn3d/etc/conda/activate.d/tensorrt.shEOF 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.shEOF if [ -n ${_OLD_TRT_PATHx} ]; 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_PATHx} ]; 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 这一段为什么不能照旧写如果把退出脚本写成下面这种形式exportPATH$_OLD_TRT_PATHexportLD_LIBRARY_PATH$_OLD_TRT_LD_LIBRARY_PATH在下面这种场景里会出问题你已经在pvn3d环境里这时才新建activate.d和deactivate.d没有重新激活过环境就直接执行conda deactivate此时_OLD_TRT_PATH和_OLD_TRT_LD_LIBRARY_PATH其实还没有被激活脚本设置过。结果就是PATH可能被清空LD_LIBRARY_PATH可能被清空conda后续调用的dirname、ls、which等系统命令找不到这就是常见的报错来源bash: dirname: No such file or directory bash: dirname: command not found9.3 如果已经把PATH清空了先临时恢复一个最基本的系统PATHexportPATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin然后重新写入上面的两个脚本再执行conda deactivate conda activate pvn3dwhichtrtexececho$TRT_ROOT10. 验证安装结果10.1 验证trtexectrtexec--help|head10.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) PY10.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-mpipinstallonnx1.14.1onnxruntime1.16.3然后检查python -PY import onnx import onnxruntime as ort print(onnx:, onnx.__version__) print(onnxruntime:, ort.__version__) PY12. pip 里的 TensorRT 包有什么区别如果你查pip安装方法会看到不止一个 TensorRT 包名。这些包的定位不一样。12.1tensorrt这是完整开发包对应完整的 builder runtime 能力。适合场景需要在 Python 里构建 engine需要完整 TensorRT Python API需要做开发、调试、转换、验证对当前 PVN3D 部署链如果想走纯 pip 方案理论上应该装这一类。12.2tensorrt-cu11/tensorrt-cu12这是按 CUDA 大版本拆分的 pip 元包。区别不在 TensorRT 功能而在它会拉取哪一套 CUDA 主版本依赖。tensorrt-cu11面向 CUDA 11.xtensorrt-cu12面向 CUDA 12.x如果不显式写 CUDA 后缀官方较新的 pip 元包通常默认会偏向较新的 CUDA 主版本。对当前pvn3d-dev如果你强行走 pip 元包路线至少也应该选cu11不能选cu12。12.3tensorrt-lean这是精简运行时。特点只用于运行预先构建好的 engine体积更小不包含完整 builder 能力适合场景只做部署engine 已经在别处构建好了只需要推理运行时不适合当前这一步因为你现在还要在这个环境里构建 engine。12.4tensorrt-dispatch这是更小的 dispatch runtime。特点体积比 lean 更小也是运行时导向主要适合最小化部署占用它同样不适合当前阶段因为当前阶段需要的不只是“运行 engine”还需要“生成 engine”。12.5 这几个包在当前项目里怎么选对当前pvn3d-dev结论很明确不优先用pip install tensorrt更不建议直接装默认最新的tensorrt不用tensorrt-lean不用tensorrt-dispatch原因当前项目已经固定在Python 3.8 torch 1.10.0cu113 CUDA 11.3直接走 pip 元包容易把环境拉向更新的 TensorRT / CUDA 依赖你当前不仅要运行 engine还要构建 engine现阶段最稳的方式仍然是前面这套TensorRT 8.6.1 GA TAR cp38 wheel安装方法可以直接记成一句话当前项目安装 TensorRT用TAR cp38 wheelpip里的lean和dispatch只适合更后面的轻量运行时部署13. 安装后建议的首次联调顺序建议按下面顺序验证不要一步跳到 engine 构建which trtexecpython -c import tensorrt as trt; print(trt.__version__)python -c import onnx; import onnxruntimepython deploy/scripts/export_onnx.py --helppython deploy/scripts/build_trt_engine.py --helppython deploy/scripts/export_onnx.py ...python deploy/scripts/build_trt_engine.py --dry-runpython deploy/scripts/build_trt_engine.py ...14. 常见问题14.1which trtexec还是空优先检查TRT_ROOT是否写对PATH是否包含$TRT_ROOT/bin你是否重新执行了conda activate pvn3d14.2import tensorrt失败优先检查装的是不是cp38wheelLD_LIBRARY_PATH是否包含$TRT_ROOT/lib当前 shell 是否真的在pvn3d环境里14.3 wheel 装不上优先检查Python 版本是否真的是3.8wheel 文件名是否匹配cp38pip,setuptools,wheel是否已经升级14.4 安装完 TensorRT 后 PyTorch 出问题先不要立刻重装整个环境先检查是否误装了不匹配的 CUDA 12.x TensorRT Python 包是否把系统级 CUDA 路径覆盖到了当前环境是否改坏了LD_LIBRARY_PATH15. 回滚方法如果安装后要回滚按下面顺序处理删除 conda 激活脚本卸载tensorrtPython wheel删除/opt/tensorrt/TensorRT-8.6.1.x示例rm-f/opt/conda/envs/pvn3d/etc/conda/activate.d/tensorrt.shrm-f/opt/conda/envs/pvn3d/etc/conda/deactivate.d/tensorrt.sh python-mpip uninstall-ytensorrt tensorrt-lean tensorrt-dispatchrm-rf/opt/tensorrt/TensorRT-8.6.1*16. 参考NVIDIA TensorRT Installation Guidehttps://docs.nvidia.com/deeplearning/tensorrt/latest/installing-tensorrt/installing.htmlNVIDIA TensorRT 8.6.1 Installation Guidehttps://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-861/install-guide/index.htmlNVIDIA TensorRT Support Matrixhttps://docs.nvidia.com/deeplearning/tensorrt/latest/getting-started/support-matrix.htmlONNX Runtime Python 安装文档https://onnxruntime.ai/docs/get-started/with-python.html