最近在Ubuntu 20.04上折腾TensorRT 8.x的安装,本以为轻车熟路,结果还是踩了不少坑。从CUDA版本冲突到Python包依赖问题,再到那些让人抓狂的动态链接库错误,整个过程简直像在玩扫雷游戏。这篇文章就是把我趟过的雷都标记出来,帮你快速通关TensorRT 8.x的安装。
安装TensorRT之前,版本对齐是重中之重。我最初就是在这里栽了跟头,导致后续各种莫名其妙的问题。TensorRT 8.x对CUDA和cuDNN的版本要求相当严格,不同小版本之间都可能存在兼容性问题。
首先确认你的NVIDIA驱动版本是否支持CUDA 11.x。运行以下命令检查:
bash复制nvidia-smi
你会看到类似这样的输出:
code复制+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.82.01 Driver Version: 470.82.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
关键点:
如果驱动版本过低,先升级驱动:
bash复制sudo apt install nvidia-driver-470
TensorRT 8.x的版本兼容性就像俄罗斯套娃,这里给出经过验证的稳定组合:
| TensorRT版本 | CUDA版本 | cuDNN版本 | Ubuntu版本 |
|---|---|---|---|
| 8.0.1.6 | 11.3 | 8.2.1 | 20.04 |
| 8.2.3.0 | 11.4 | 8.2.4 | 20.04 |
| 8.4.1.5 | 11.6 | 8.4.1 | 20.04 |
注意:不要盲目追求最新版本,特别是生产环境。我推荐使用TensorRT 8.2.3.0 + CUDA 11.4 + cuDNN 8.2.4这个组合,稳定性最佳。
安装CUDA时建议使用runfile方式,避免与系统自带驱动冲突:
bash复制sudo sh cuda_11.4.2_470.57.02_linux.run
安装时务必取消勾选Driver安装选项,除非你确定要更新驱动。
从NVIDIA官网下载对应版本的tar包后,解压命令看似简单却暗藏玄机:
bash复制tar -xzvf TensorRT-8.2.3.0.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
解压后你会得到这些关键目录:
lib:包含所有动态链接库include:头文件python:Python wheel包data和samples:示例数据与代码很多教程会告诉你直接修改.bashrc,但这在Ubuntu 20.04上可能不够。更可靠的做法是创建专门的conf文件:
bash复制sudo tee /etc/ld.so.conf.d/tensorrt.conf <<EOF
/path/to/TensorRT-8.2.3.0/lib
EOF
然后执行:
bash复制sudo ldconfig
验证是否生效:
bash复制ldconfig -p | grep nvinfer
应该能看到类似输出:
code复制libnvinfer.so.8 (libc6,x86-64) => /path/to/TensorRT-8.2.3.0/lib/libnvinfer.so.8
进入python目录后,不要直接pip install,先检查wheel文件名与你的Python版本是否匹配。常见的坑点:
cp38正确的安装流程:
bash复制cd TensorRT-8.2.3.0/python
pip install tensorrt-8.2.3.0-cp38-none-linux_x86_64.whl
如果遇到类似ImportError: libxxx.so: cannot open shared object file的错误,按这个顺序排查:
ldconfig -p | grep 缺失的库名查看库是否被系统识别一个典型的修复命令示例:
bash复制sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.2.4 /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
先来个简单的版本检查:
python复制import tensorrt as trt
print(trt.__version__) # 应该输出8.2.3.0
然后运行内置的MNIST示例:
bash复制cd TensorRT-8.2.3.0/samples/python/end_to_end_tensorflow_mnist
python model.py && python sample.py
建议用ONNX格式测试更复杂的模型。这里以ResNet50为例:
python复制import tensorrt as trt
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)
with open("resnet50.onnx", "rb") as f:
parser.parse(f.read())
遇到解析错误时,检查:
症状1:
code复制ImportError: libnvinfer.so.8: cannot open shared object file: No such file or directory
处方:
bash复制sudo ldconfig /path/to/TensorRT-8.2.3.0/lib
症状2:
code复制error while loading shared libraries: libcublas.so.11: cannot open shared object file
处方:
bash复制sudo ldconfig /usr/local/cuda-11.4/lib64
症状:
code复制tensorrt模块找不到,但pip list显示已安装
可能原因:
诊断命令:
bash复制which python
pip show tensorrt | grep Location
在builder配置中加入这些参数可以提升推理性能:
python复制config = builder.create_builder_config()
config.max_workspace_size = 1 << 30 # 1GB
config.set_flag(trt.BuilderFlag.FP16) # 启用FP16加速
对于Ampere架构GPU,还可以启用TF32:
python复制config.set_flag(trt.BuilderFlag.TF32)
当需要升级TensorRT版本时,建议的步骤顺序:
通过符号链接实现版本切换:
bash复制ln -sf /opt/TensorRT-8.2.3.0 /opt/TensorRT
然后在环境变量中引用/opt/TensorRT,切换版本时只需修改链接目标。
使用trtexec进行基准测试:
bash复制./trtexec --onnx=model.onnx --fp16 --workspace=4096
关键输出指标:
最后,分享一个真实项目的验证流程:
典型的质量控制标准:
我在实际项目中遇到过一个有趣的情况:TensorRT优化后的模型在某些边缘case上表现异常。后来发现是因为某个ReLU层被融合掉了,解决方法是在导出ONNX时添加keep_initializers_as_inputs=True参数。这种实战经验,才是真正宝贵的避坑指南。