环境搭建:NVIDIA驱动、CUDA、cuDNN、TensorRT-LLM源码编译与安装

说实话,环境搭建这一步,往往是整个项目里最磨人的环节。我见过不少团队,模型选好了,架构设计也画了PPT,结果卡在装驱动上,一卡就是两天。嗯,咱们今天就把这事彻底捋清楚。

我个人习惯把环境搭建分成四个阶段:驱动打底 → CUDA铺路 → cuDNN加速 → TensorRT-LLM编译。每一步都有坑,咱们一个一个踩过去。

核心原则:版本匹配是第一要务。别想着「装个最新的肯定没错」,我吃过这个亏——有一次装了最新的CUDA 12.3,结果TensorRT-LLM还没适配,折腾了一整天回退版本。

1. NVIDIA驱动安装

驱动是地基。地基不稳,上面全白搭。

先确认你的GPU型号:

lspci | grep -i nvidia

如果是A100、H100、V100这些数据中心卡,建议用数据中心驱动(Data Center Driver),而不是Game Ready驱动。为什么?数据中心驱动更稳定,而且支持MIG(多实例GPU)特性。我在项目中遇到过,用Game Ready驱动跑多卡推理,偶尔会莫名其妙掉卡,换成数据中心驱动就再没出现过。

安装方式我推荐两种:

  • 官方runfile安装:最干净,但需要手动处理nouveau冲突
  • apt仓库安装:最省心,但版本可能不是最新的

我个人习惯用runfile,因为可控性更强:

# 先禁用nouveau
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
update-initramfs -u
reboot

# 安装驱动
chmod +x NVIDIA-Linux-x86_64-*.run
./NVIDIA-Linux-x86_64-*.run --no-opengl-files

注意:--no-opengl-files 这个参数很重要。如果你在服务器上装驱动,不需要图形界面,加上这个参数可以避免很多冲突。我曾经没加,结果重启后图形界面挂了,只能进救援模式修复。

装完后验证:

nvidia-smi

看到GPU列表和驱动版本,就说明成功了。

2. CUDA安装

驱动装好了,接下来是CUDA。这里有个容易混淆的点:驱动本身已经包含了一部分CUDA运行时,但完整的CUDA Toolkit还需要单独装。

我建议用runfile方式安装CUDA Toolkit,因为可以指定安装路径,方便多版本共存:

wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
sudo sh cuda_12.1.0_530.30.02_linux.run

安装时注意:

  • 不要勾选Driver(驱动我们已经装好了)
  • 选择Custom安装,把路径改成 /usr/local/cuda-12.1

配置环境变量:

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

验证:

nvcc --version

小技巧:我习惯在 ~/.bashrc 里写一个函数来切换CUDA版本。因为不同项目可能依赖不同版本的CUDA,手动改PATH太容易出错了。

3. cuDNN安装

cuDNN是深度神经网络的加速库。说白了,卷积、池化这些操作,cuDNN帮你用最优化方式跑在GPU上。

安装cuDNN需要NVIDIA开发者账号,下载对应CUDA版本的deb包或tar包。我推荐用tar包方式,因为更灵活:

tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64/
sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h /usr/local/cuda-12.1/lib64/libcudnn*

验证cuDNN版本:

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

避坑指南:我曾经直接把cuDNN的so文件覆盖到系统库目录,结果导致其他依赖旧版本cuDNN的程序崩溃。后来学乖了,用 LD_LIBRARY_PATH 来控制,或者用容器隔离。

4. TensorRT-LLM源码编译与安装

终于到了重头戏。TensorRT-LLM是NVIDIA针对大语言模型推理的优化库。说白了,它把Transformer里的各种算子(比如Attention、LayerNorm)都做了极致优化。

我建议从源码编译,而不是用pip安装。为什么?因为源码编译可以针对你的GPU架构做针对性优化,性能能提升10%-20%。

先拉代码:

git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
git submodule update --init --recursive

编译前,确认你的环境:

  • CUDA 12.1+
  • cuDNN 8.9+
  • GCC 11+
  • CMake 3.26+
  • Python 3.10+

编译命令:

# 设置GPU架构,A100是80,H100是90
export ARCH=80

# 开始编译
python3 scripts/build_wheel.py --cuda_arch ${ARCH} --clean

# 安装编译好的wheel
pip install ./build/tensorrt_llm*.whl

编译时间取决于机器性能,我见过快的20分钟,慢的2小时。嗯,这时候可以去喝杯咖啡。

注意:编译过程中如果报错 nvcc fatal: Unsupported gpu architecture 'compute_90',说明你的CUDA版本不支持H100。需要升级CUDA到12.0以上。我当初为了这个错误查了半天,最后发现是CUDA版本太老。

安装完成后验证:

python3 -c "import tensorrt_llm; print(tensorrt_llm.__version__)"

如果能看到版本号,恭喜你,环境搭建成功了。

5. 环境验证与常见问题

我整理了一个快速验证脚本,可以一次性检查所有组件:

#!/bin/bash
echo "=== NVIDIA Driver ==="
nvidia-smi | grep "Driver Version"

echo "=== CUDA ==="
nvcc --version | grep "release"

echo "=== cuDNN ==="
cat /usr/local/cuda-12.1/include/cudnn_version.h | grep "CUDNN_MAJOR"

echo "=== TensorRT-LLM ==="
python3 -c "import tensorrt_llm; print(tensorrt_llm.__version__)"

常见问题及解决:

问题 原因 解决
nvidia-smi找不到 驱动未安装或PATH未配置 检查驱动安装,或添加/usr/lib/nvidia到PATH
nvcc找不到 CUDA Toolkit未安装或PATH未配置 检查CUDA安装,配置PATH和LD_LIBRARY_PATH
cuDNN版本不匹配 cuDNN版本与CUDA不兼容 下载对应CUDA版本的cuDNN
TensorRT-LLM编译失败 依赖库版本不对 检查GCC、CMake、Python版本

我的建议:如果你是在团队中搭建环境,强烈建议写一个Dockerfile,把整个环境固化下来。这样新同学加入时,直接 docker pull 就能用,省去大量重复劳动。

6. 知识体系总览

下面这张图,是我自己画的环境搭建知识体系。你可以把它当作一个检查清单,每完成一项就打个勾。

TensorRT-LLM 环境搭建知识体系 GPU 硬件 NVIDIA 驱动 CUDA Toolkit cuDNN GCC / CMake / Python TensorRT-LLM 源码编译 环境验证 每一层都依赖下一层,版本匹配是关键

这张图其实就说明了整个环境搭建的依赖关系。你想想看,从GPU硬件到驱动,再到CUDA和cuDNN,最后才是TensorRT-LLM。每一层都像积木一样叠上去,哪一块没对齐,整个就塌了。

好了,环境搭建就讲到这里。记住我反复强调的那句话:版本匹配是第一要务。别贪新,别图省事,每一步都验证通过再往下走。


专注资料整理