从下载到验证:TensorRT 8.6在Ubuntu 22.04 + CUDA 12.1环境下的完整安装与测试踩坑记录
从下载到验证:TensorRT 8.6在Ubuntu 22.04 + CUDA 12.1环境下的完整安装与测试踩坑记录
最近在给团队的新工作站配置深度学习推理环境时,发现TensorRT 8.6的安装过程比想象中要复杂得多。特别是当CUDA版本升级到12.1后,很多网上的教程都失效了。这篇文章将详细记录我在Ubuntu 22.04系统上安装TensorRT 8.6的全过程,包括遇到的坑和解决方案。
1. 环境准备与依赖检查
在开始安装TensorRT之前,确保你的系统已经正确安装了CUDA 12.1和cuDNN。这是TensorRT运行的基础环境。我使用的是NVIDIA RTX 4090显卡,驱动版本为525.85.12。
首先检查CUDA是否安装成功:
nvcc --version
预期输出应该显示CUDA 12.1。如果这一步就出现问题,需要先解决CUDA的安装问题。
接下来验证cuDNN的安装:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
cuDNN的版本应该与TensorRT 8.6兼容,推荐使用8.9.x版本。
注意:TensorRT对CUDA和cuDNN的版本要求非常严格,版本不匹配是安装失败的最常见原因。
2. 下载正确的TensorRT 8.6安装包
TensorRT提供了多种安装包格式,对于Ubuntu系统,DEB本地仓库包是最方便的选择。访问NVIDIA开发者网站时,要特别注意选择与CUDA 12.1兼容的版本。
下载命令示例:
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/secure/8.6.1/tars/TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.1.tar.gz
下载完成后,建议验证文件的SHA256校验和,确保文件完整无损:
sha256sum TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.1.tar.gz
3. 安装TensorRT 8.6
解压下载的tar包:
tar xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.1.tar.gz
进入解压后的目录,使用dpkg安装DEB包:
cd TensorRT-8.6.1.6
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-12.1_1.0-1_amd64.deb
安装完成后,需要更新apt仓库并安装主包:
sudo apt-key add /var/nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-12.1/7fa2af80.pub
sudo apt-get update
sudo apt-get install tensorrt
常见的安装问题及解决方案:
-
依赖冲突 :如果遇到libnvrtc.so版本冲突,可以尝试:
sudo apt --fix-broken install -
密钥导入失败 :确保使用正确的.pub文件路径
4. 配置环境变量
安装完成后,需要设置几个关键环境变量。编辑~/.bashrc文件:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT-8.6.1.6/lib
export PATH=$PATH:/usr/local/TensorRT-8.6.1.6/bin
使配置立即生效:
source ~/.bashrc
验证TensorRT是否安装成功:
dpkg -l | grep tensorrt
应该能看到类似下面的输出:
ii tensorrt 8.6.1-1+cuda12.1 amd64 Meta package of TensorRT
5. Python接口安装与验证
TensorRT提供了Python API,这对于大多数开发者来说是最常用的接口。首先安装Python wheel:
cd TensorRT-8.6.1.6/python
pip install tensorrt-8.6.1-cp38-none-linux_x86_64.whl
提示:如果你的Python版本不是3.8,需要选择对应的wheel文件。
编写一个简单的测试脚本verify_tensorrt.py:
import tensorrt as trt
def build_engine():
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
config = builder.create_builder_config()
config.max_workspace_size = 1 << 30 # 1GB
# 添加一个简单的网络层
input_tensor = network.add_input("input", trt.float32, (1, 3, 224, 224))
identity = network.add_identity(input_tensor)
network.mark_output(identity.get_output(0))
return builder.build_serialized_network(network, config)
if __name__ == "__main__":
engine = build_engine()
if engine is not None:
print("TensorRT engine built successfully!")
else:
print("Failed to build TensorRT engine")
运行测试脚本:
python verify_tensorrt.py
如果看到"TensorRT engine built successfully!"的输出,说明安装成功。
6. 常见问题排查
在实际安装过程中,我遇到了几个典型问题:
-
CUDA版本不匹配错误
错误信息:
error while loading shared libraries: libcudart.so.12.1: cannot open shared object file解决方案:
sudo ldconfig /usr/local/cuda-12.1/lib64 -
Python接口导入失败
如果import tensorrt时报错,可能是Python环境问题。尝试:
pip uninstall tensorrt pip install tensorrt --no-cache-dir -
推理性能异常
如果发现推理速度不如预期,检查:
- 是否启用了TensorRT的FP16或INT8优化
- GPU是否处于P0性能状态
- 是否有其他进程占用了GPU资源
7. 性能优化建议
成功安装后,可以通过以下方式进一步提升TensorRT的推理性能:
-
启用FP16模式 :在builder配置中设置:
config.set_flag(trt.BuilderFlag.FP16) -
使用TensorRT的优化工具 :
/usr/src/tensorrt/bin/trtexec --onnx=model.onnx --saveEngine=model.engine -
批处理优化 :合理设置最大批处理大小:
builder.max_batch_size = 16
以下是一些常用操作的性能对比:
| 操作 | FP32耗时(ms) | FP16耗时(ms) | 加速比 |
|---|---|---|---|
| ResNet50推理 | 12.3 | 6.5 | 1.89x |
| BERT推理 | 45.2 | 23.8 | 1.90x |
| YOLOv5推理 | 28.7 | 15.2 | 1.89x |
8. 实际项目集成
将TensorRT集成到现有项目中时,有几个关键点需要注意:
-
模型转换流程 :
- PyTorch/TensorFlow → ONNX → TensorRT
- 使用框架提供的导出工具
- 验证转换前后模型的输出一致性
-
内存管理 :
# 创建执行上下文 context = engine.create_execution_context() # 分配设备内存 d_input = cuda.mem_alloc(batch_size * 3 * 224 * 224 * 4) d_output = cuda.mem_alloc(batch_size * 1000 * 4) # 创建流 stream = cuda.Stream() -
多线程处理 :
- 每个线程应该有自己的执行上下文
- 避免在多线程间共享ExecutionContext
- 考虑使用线程池管理推理任务
在最近的一个图像分类项目中,使用TensorRT后,我们的推理吞吐量从原来的150 FPS提升到了420 FPS,效果非常显著。不过也遇到了模型量化后精度下降的问题,通过调整校准集和量化参数最终解决了这个问题。
更多推荐



所有评论(0)