第二章:环境搭建——CUDA/cuDNN环境配置、TensorRT安装、ONNX Runtime安装、Docker镜像构建

说实话,很多同学在INT8推理上栽跟头,不是因为模型量化有多难,而是环境没搭好。我见过太多人花了一周时间折腾驱动和库的版本兼容问题,最后心态崩了。这一章,咱们就把这些基础工作一次性搞定。

核心原则:版本匹配是环境搭建的灵魂。CUDA、cuDNN、TensorRT、ONNX Runtime这四个组件,版本必须严格对齐。差一个次版本号,都可能让你编译失败。

2.1 CUDA/cuDNN环境配置

CUDA是NVIDIA的并行计算平台,cuDNN是专门为深度学习优化的加速库。说白了,CUDA是底层算力,cuDNN是上层加速器。

2.1.1 检查硬件兼容性

动手之前,先看看你的显卡支持什么版本的CUDA。我有个同事曾经在GTX 1060上硬装CUDA 11.8,结果驱动报错——因为Maxwell架构最高只支持到CUDA 10.2。

# 查看显卡型号和驱动版本
nvidia-smi

# 查看CUDA版本
nvcc --version

输出里会显示Driver Version和CUDA Version。注意,驱动版本决定了你能装哪个CUDA Toolkit。比如驱动是470.xx,那CUDA 11.4就是上限。

2.1.2 安装CUDA Toolkit

我个人习惯用runfile安装,因为可以自定义路径,方便多版本共存。但如果你刚入门,用deb包更省心。

# 下载CUDA 11.8(以这个版本为例)
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run

# 执行安装
sudo sh cuda_11.8.0_520.61.05_linux.run

安装时注意:不要勾选Driver,除非你确定当前驱动版本低于安装包里的驱动。我曾经手滑选了覆盖驱动,结果系统重启后黑屏,折腾了半天才恢复。

小技巧:安装完成后,把以下内容加到~/.bashrc里,方便切换CUDA版本:

export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

2.1.3 安装cuDNN

cuDNN需要去NVIDIA官网注册下载,这里有个坑——cuDNN版本必须和CUDA版本严格对应。比如CUDA 11.8对应cuDNN 8.6或8.7,不能乱配。

# 解压cuDNN包
tar -xzvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz

# 复制文件到CUDA目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

验证是否安装成功:

cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

如果输出版本号,说明cuDNN装好了。

2.2 TensorRT安装

TensorRT是NVIDIA的推理优化引擎,INT8量化主要靠它。安装方式有两种:tar包和deb包。我推荐tar包,因为可以解压到任意目录,方便多版本管理。

2.2.1 下载并安装TensorRT

# 下载TensorRT 8.5 GA(对应CUDA 11.x)
wget https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/8.5.1/tars/TensorRT-8.5.1.7.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz

# 解压
tar -xzvf TensorRT-8.5.1.7.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz
sudo mv TensorRT-8.5.1.7 /opt/

配置环境变量:

export LD_LIBRARY_PATH=/opt/TensorRT-8.5.1.7/lib:$LD_LIBRARY_PATH
export PATH=/opt/TensorRT-8.5.1.7/bin:$PATH

2.2.2 验证TensorRT

运行自带的示例程序:

cd /opt/TensorRT-8.5.1.7/samples/sampleOnnxMNIST
make
./sampleOnnxMNIST

如果看到输出结果,说明TensorRT能正常工作了。嗯,这里要注意——编译示例需要安装CMake和g++,别漏了。

常见问题:运行时报错"libnvinfer.so.8: cannot open shared object file"。这通常是LD_LIBRARY_PATH没设置对,或者TensorRT的lib路径没加到系统库路径里。可以用ldconfig临时解决:

sudo ldconfig /opt/TensorRT-8.5.1.7/lib

2.3 ONNX Runtime安装

ONNX Runtime是微软开源的推理引擎,支持多种后端。做INT8量化时,我通常用它来做校准数据的预处理和精度验证。

2.3.1 安装方式选择

ONNX Runtime有三种安装方式:pip、conda、源码编译。对于大多数场景,pip安装就够了:

# 安装CPU版本
pip install onnxruntime

# 安装GPU版本(需要CUDA和cuDNN)
pip install onnxruntime-gpu

但如果你需要自定义算子或者特定优化,就得源码编译了。我曾经为了支持一个自定义的量化算子,花了两天编译ONNX Runtime——那感觉,酸爽。

2.3.2 验证安装

import onnxruntime as ort
print(ort.get_available_providers())

输出应该包含"CUDAExecutionProvider"和"TensorrtExecutionProvider"(如果你装了TensorRT)。如果只有"CPUExecutionProvider",说明GPU版本没装对。

版本匹配表:这是我整理的一个常用版本组合,经过多次项目验证:

CUDA cuDNN TensorRT ONNX Runtime
11.8 8.6 8.5 GA 1.14
12.0 8.9 8.6 EA 1.15
12.2 8.9 9.0 EA 1.16

2.4 Docker镜像构建

说实话,前面那些手动安装步骤,你只需要做一次。之后我强烈建议你用Docker——环境隔离、一键部署、版本管理,省心太多了。

2.4.1 基础镜像选择

NVIDIA官方提供了NGC容器,里面CUDA、cuDNN、TensorRT都预装好了。你想想看,这能省多少事?

# 拉取TensorRT容器
docker pull nvcr.io/nvidia/tensorrt:22.12-py3

这个镜像包含了CUDA 11.8、cuDNN 8.6和TensorRT 8.5,开箱即用。

2.4.2 编写Dockerfile

如果你需要定制化环境,可以自己写Dockerfile:

FROM nvcr.io/nvidia/tensorrt:22.12-py3

# 安装ONNX Runtime
RUN pip install onnxruntime-gpu==1.14.0

# 安装其他依赖
RUN pip install numpy opencv-python pillow matplotlib

# 设置工作目录
WORKDIR /workspace

# 复制项目文件
COPY . /workspace

构建镜像:

docker build -t int8-inference:1.0 .

2.4.3 运行容器

docker run --gpus all -it --rm \
  -v /path/to/data:/workspace/data \
  int8-inference:1.0 /bin/bash

--gpus all参数让容器能访问所有GPU。-v是挂载数据目录,这样模型和数据集就不用每次都复制进容器了。

避坑指南:我曾经在Docker里跑INT8量化时,发现精度和裸机不一样。排查了半天,原来是容器里的cuDNN版本和宿主机不一致。所以,尽量用NGC官方镜像,别自己拼凑版本。

2.5 本章知识体系

下面这张图展示了环境搭建的整体流程和组件关系:

INT8推理环境搭建知识体系 硬件层:NVIDIA GPU(Turing/Ampere/Hopper架构) 驱动层:NVIDIA Driver + CUDA Toolkit 加速库层:cuDNN + TensorRT 推理框架层:ONNX Runtime + TensorRT API 部署层:Docker容器化 + 版本管理 版本匹配要点 • CUDA ↔ 驱动版本 • cuDNN ↔ CUDA版本 • TensorRT ↔ CUDA版本 • ONNX Runtime ↔ CUDA+cuDNN版本 推荐:使用NGC 官方Docker镜像 避免手动拼凑

从这张图可以看出,环境搭建是分层依赖的。底层没配好,上层就别想跑。我建议你按照从下往上的顺序一步步来,每装完一层都验证一下,别一口气装完再debug——那样出了问题,你都不知道是哪层的问题。

好了,环境搭好之后,下一章咱们就开始动手做INT8量化了。记住,基础打牢了,后面才能跑得快。


想要更多资料,联系可可