1. 目标
本文面向当前设备上的容器化部署,给出一套适用于本仓库 deploy/ 目录的 PVN3D TensorRT 环境配置方案。
这份指南只覆盖第一阶段推荐路线:
RGB Backbone导出为 ONNX / TensorRTFusion Head导出为 ONNX / TensorRTPointNet2保持 PyTorch + 自定义 CUDA Extension 原生执行
2. 当前可用容器环境
后续部署、导出与测试统一基于现有容器环境进行,不再重新创建训练环境。
通过实际进入容器核验,当前状态如下:
- 容器名称:
pvn3d-dev - 进入容器命令:
docker exec -it pvn3d-dev bash - Conda 环境:
conda activate pvn3d - 仓库路径:
/workspace/workflow/self/PVN3D - Python:
3.8.20 - PyTorch:
1.10.0+cu113 - TorchVision:
0.11.1+cu113 torch.version.cuda:11.3- GPU:
NVIDIA GeForce RTX 4060 Laptop GPU - Driver Version:
580.126.09 nvidia-smi报告的 CUDA Version:13.0python-pcl:已安装cv2:可用,版本4.13.0open3d:可用,版本0.15.2- PointNet++ / PointNet2 CUDA 扩展:已可用
onnx:未安装onnxruntime:未安装tensorrtPython 包:未安装trtexec:当前不在PATH
结论要分开看:
- PVN3D 原生 CUDA 推理环境是可用的
- TensorRT 部署环境还没有补齐,当前缺的是 ONNX/TensorRT 相关组件
因此当前更合理的下一步不是重建 PVN3D 环境,而是只补 TensorRT 导出链所需依赖,然后再进入 ONNX -> engine 阶段
建议统一使用下面的进入方式:
bash
docker exec -it pvn3d-dev bash
conda activate pvn3d
cd /workspace/workflow/self/PVN3D
这一路径已经通过实际核验确认存在。
3. 部署原则
本仓库不适合一开始就走"整网端到端 TensorRT"。
原因很直接:
pvn3d/lib/pvn3d.py中的主体网络混合了 CNN 与 PointNet2- PointNet2 依赖本地编译的 CUDA 扩展
- 这些自定义算子不能直接被标准 ONNX -> TensorRT 流程稳定接收
因此当前设备上的容器部署,应该按下面的分层方式准备环境:
- 宿主机负责 NVIDIA Driver
- 容器通过 NVIDIA Container Toolkit 继承 GPU 能力
- 容器内部安装 CUDA 运行时、TensorRT、PyTorch、ONNX 相关依赖
- 容器内部编译 PVN3D 的 PointNet2 CUDA 扩展
4. 推荐版本策略
当前容器里的核心基线是:
- Python
3.8.20 - PyTorch
1.10.0+cu113 - TorchVision
0.11.1+cu113 - CUDA Runtime 侧以
cu113为主
仓库原始 README.md 仍以 CUDA 10.2 为主,不适合直接照搬。
这里直接给出推荐组合:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| TensorRT | 8.6.1 |
优先选这一版 |
| ONNX Runtime | 1.16.3 |
仅用于 ONNX 校验,建议先用 CPU 版 |
| ONNX | 1.14.1 |
与当前导出链更稳妥 |
推荐依据:
- NVIDIA TensorRT 8.6.1 官方支持矩阵覆盖 Linux x86-64、Python API,并支持 CUDA
11.3 update 1到12.1 update 1 - ONNX Runtime 官方文档当前对 GPU/TensorRT 组合的重点版本已经转向 CUDA
11.8/12.x - 你的容器里 PyTorch 还是
cu113,所以 ONNX Runtime 不建议作为 GPU 主执行后端使用,先把它固定为 CPU 校验工具更稳
这部分判断里有一条是推断:
onnxruntime==1.16.3不是官方"唯一指定版本",而是基于你当前Python 3.8 + torch 1.10 + cu113环境做的保守选择,目的只是稳定做 ONNX 校验,避免把 ORT GPU/TensorRT 兼容性问题引进来
不建议在这个容器里直接上 TensorRT 10.x 或以 CUDA 12.x 为前提的 ORT GPU 组合,原因不是它们不能工作,而是它们会把当前环境带出 torch 1.10 + cu113 的稳定区。
5. 运行前核验
由于你的容器已经就绪,本文不再展开"如何创建容器",而是聚焦"进入现有容器后如何确认可以开始 TensorRT 部署"。
建议每次开始部署前,都先完成一轮快速核验。
5.1 宿主机核验
bash
nvidia-smi
至少确认:
- GPU 型号
- Driver Version
- CUDA Version
- 显存容量
5.2 容器内核验
进入容器后执行:
bash
docker exec -it pvn3d-dev bash
conda activate pvn3d
cd /workspace/workflow/self/PVN3D
nvidia-smi
which trtexec
python --version
再补一组 Python 侧检查:
bash
python - <<'PY'
import torch
print("torch:", torch.__version__)
print("torch_cuda:", torch.version.cuda)
print("cuda_available:", torch.cuda.is_available())
if torch.cuda.is_available():
print("gpu:", torch.cuda.get_device_name(0))
PY
验收标准:
nvidia-smi正常torch.cuda.is_available()为True
当前实测结果:
nvidia-smi:正常torch.cuda.is_available():Truetrtexec:未找到onnx/onnxruntime/tensorrt:均未安装
6. 当前环境建议
由于你的容器里 python-pcl、PointNet++ 扩展、CUDA、PyTorch 都已经正常,不建议再重复做以下动作:
- 不要重新安装旧版训练依赖
- 不要重复编译 PointNet2 扩展,除非源码或 PyTorch / CUDA 版本发生变化
- 不要为了兼容旧
README.md去强行降级到CUDA 10.2
当前更合理的做法是保留现有容器环境,只补下面这一组组件:
onnx==1.14.1onnxruntime==1.16.3- TensorRT
8.6.1
7. 容器内环境配置
以下步骤建议全部在 pvn3d-dev 容器的 pvn3d conda 环境中执行。
7.1 基础系统依赖
如果当前容器已经能正常训练 / 推理 PVN3D,这一节通常不需要重复执行。
只有在缺少 ONNX / TensorRT Python 侧依赖时,再按需补装。
7.2 Python 基础依赖
建议仅在当前环境缺包时补装:
bash
python -m pip install --upgrade pip setuptools wheel
7.3 安装 ONNX / TensorRT Python 侧依赖
bash
python -m pip install onnx==1.14.1 onnxruntime==1.16.3
这里建议先装 CPU 版 onnxruntime,用途是:
- 检查 ONNX 是否能被正常加载
- 做导出后结构校验
- 避免把 ORT 的 CUDA/TensorRT 依赖引进当前容器
7.4 安装 TensorRT 组件
当前容器里既没有 trtexec,也没有 tensorrt Python 包,因此 TensorRT 组件需要单独补齐。
推荐版本:TensorRT 8.6.1
原因:
- 对当前
torch 1.10.0+cu113环境更稳 - 官方支持 CUDA
11.3 update 1 - 第一阶段只需要
trtexec和 Python API,不需要引入 TensorRT 10 的新兼容面
建议安装后至少确认下面两项:
bash
which trtexec
python - <<'PY'
import tensorrt as trt
print(trt.__version__)
PY
如果 trtexec 仍不可用,当前的 build_trt_engine.py 无法直接执行。
7.5 推荐安装顺序
建议按这个顺序补齐:
bash
python -m pip install onnx==1.14.1 onnxruntime==1.16.3
然后安装 TensorRT 8.6.1,再检查:
bash
which trtexec
python - <<'PY'
import onnx
import onnxruntime as ort
import tensorrt as trt
print("onnx:", onnx.__version__)
print("onnxruntime:", ort.__version__)
print("tensorrt:", trt.__version__)
PY
7.6 仓库部署侧依赖建议
本仓库 requirements.txt 较旧,不建议在当前稳定容器中无差别重装。建议只围绕部署链按需补齐依赖。
至少需要保证以下包可用:
torchtorchvisionnumpycythonopencv-pythonpyyamleasydict
8. PointNet2 扩展状态确认
你的环境里 PointNet++ 扩展已经可用,因此这里改为"确认",不是"重新编译"。
建议在部署前做一次快速验证:
bash
python - <<'PY'
from pvn3d.lib.pointnet2_utils import _ext
print(_ext)
PY
如果这里失败,再回退到重新编译:
bash
python setup.py build_ext --inplace
成功后应在 pvn3d/lib/pointnet2_utils 下看到 _ext*.so。
9. 部署目录对应的实际执行流程
本仓库已经在 deploy/ 下提供了第一阶段 TensorRT 脚本,流程应严格按下面顺序推进。
进入环境:
bash
docker exec -it pvn3d-dev bash
conda activate pvn3d
cd /workspace/workflow/self/PVN3D
9.1 导出 ONNX
bash
python deploy/scripts/export_onnx.py \
--checkpoint weights/ycb_pvn3d_best.pth.tar \
--output-dir deploy/models/onnx \
--target all \
--num-classes 22 \
--num-points 4096 \
--height 480 \
--width 640 \
--device cuda
说明:
rgb_backbone.onnx和fusion_head.onnx会被导出PointNet2不在本步骤导出范围内- 第一阶段建议固定 shape,不要先开
--dynamic
9.2 检查导出结果
bash
ls -lh deploy/models/onnx
cat deploy/models/onnx/export_manifest.json
至少应有:
deploy/models/onnx/rgb_backbone.onnxdeploy/models/onnx/fusion_head.onnxdeploy/models/onnx/export_manifest.json
9.3 构建 TensorRT engine
bash
python deploy/scripts/build_trt_engine.py \
--onnx-dir deploy/models/onnx \
--engine-dir deploy/models/engine \
--target all \
--fp16 \
--height 480 \
--width 640 \
--num-points 4096
如果只想先确认命令拼装正确,可先执行:
bash
python deploy/scripts/build_trt_engine.py \
--onnx-dir deploy/models/onnx \
--engine-dir deploy/models/engine \
--target all \
--fp16 \
--height 480 \
--width 640 \
--num-points 4096 \
--dry-run
9.4 构建结果验收
bash
ls -lh deploy/models/engine
至少应有:
deploy/models/engine/rgb_backbone.enginedeploy/models/engine/fusion_head.engine
10. 推荐验收顺序
为了降低定位成本,不要一步到位。推荐按下面顺序验收:
- 宿主机
nvidia-smi正常 - 容器内
nvidia-smi正常 torch.cuda.is_available()为Truefrom pvn3d.lib.pointnet2_utils import _ext成功import onnx成功import onnxruntime成功which trtexec有结果python deploy/scripts/export_onnx.py ...成功python deploy/scripts/build_trt_engine.py ...成功
任意一步失败,都不要继续往后推。
11. 常见问题
11.1 容器内 nvidia-smi 失败
优先检查:
- 宿主机驱动是否正常
- 容器是否用
--gpus all启动 - 宿主机是否安装了 NVIDIA Container Toolkit
11.2 trtexec 找不到
当前脚本 build_trt_engine.py 会直接检查 trtexec。如果失败:
- 先确认 TensorRT 是否真的安装到了容器里
- 确认
trtexec是否在PATH - 或通过
--trtexec /path/to/trtexec显式指定路径
11.3 torch 已安装但 cuda_available=False
通常是以下原因之一:
- 装成了 CPU 版 PyTorch
- 容器没有拿到 GPU
- PyTorch 与容器内 CUDA 运行时不匹配
11.4 PointNet2 扩展编译失败
优先检查:
torch.version.cudanvcc --version- 编译器版本
- 容器镜像里的 CUDA 头文件和运行时是否完整
如果只是导入失败,但你确认该环境以前可用,先检查是不是没有正确执行 conda activate pvn3d。
12. 结论
针对当前设备,已经存在一个可复用的 PVN3D 容器化基线环境,因此本文的重点不是"重建训练环境",而是"在现有环境上补齐 TensorRT 部署链"。
当前最现实的路线仍然不是直接"把 PVN3D 全部转 TensorRT",而是继续沿用混合部署方案:
- TensorRT 负责
rgb_backbone和fusion_head - PointNet2 继续保留 CUDA Extension
pvn3d-dev+conda activate pvn3d作为统一入口- 先验证
nvidia-smi、torch.cuda.is_available()、onnx、trtexec,再执行导出与构建
就当前实测结果看,阻塞点已经很明确:
- PVN3D 原生环境可用
- TensorRT 部署环境不完整
- 建议补齐的版本是
onnx==1.14.1、onnxruntime==1.16.3、TensorRT8.6.1
把这一步补齐后,才能进入 deploy/scripts/export_onnx.py 和 deploy/scripts/build_trt_engine.py 的真实验证。