从下载到验证: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. 常见问题排查

在实际安装过程中,我遇到了几个典型问题:

  1. CUDA版本不匹配错误

    错误信息:

    error while loading shared libraries: libcudart.so.12.1: cannot open shared object file
    

    解决方案:

    sudo ldconfig /usr/local/cuda-12.1/lib64
    
  2. Python接口导入失败

    如果import tensorrt时报错,可能是Python环境问题。尝试:

    pip uninstall tensorrt
    pip install tensorrt --no-cache-dir
    
  3. 推理性能异常

    如果发现推理速度不如预期,检查:

    • 是否启用了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集成到现有项目中时,有几个关键点需要注意:

  1. 模型转换流程 :

    • PyTorch/TensorFlow → ONNX → TensorRT
    • 使用框架提供的导出工具
    • 验证转换前后模型的输出一致性
  2. 内存管理 :

    # 创建执行上下文
    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()
    
  3. 多线程处理 :

    • 每个线程应该有自己的执行上下文
    • 避免在多线程间共享ExecutionContext
    • 考虑使用线程池管理推理任务

在最近的一个图像分类项目中,使用TensorRT后,我们的推理吞吐量从原来的150 FPS提升到了420 FPS,效果非常显著。不过也遇到了模型量化后精度下降的问题,通过调整校准集和量化参数最终解决了这个问题。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐