第二章:环境搭建——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 本章知识体系
下面这张图展示了环境搭建的整体流程和组件关系:
从这张图可以看出,环境搭建是分层依赖的。底层没配好,上层就别想跑。我建议你按照从下往上的顺序一步步来,每装完一层都验证一下,别一口气装完再debug——那样出了问题,你都不知道是哪层的问题。
好了,环境搭好之后,下一章咱们就开始动手做INT8量化了。记住,基础打牢了,后面才能跑得快。
想要更多资料,联系可可