环境搭建: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. 知识体系总览
下面这张图,是我自己画的环境搭建知识体系。你可以把它当作一个检查清单,每完成一项就打个勾。
这张图其实就说明了整个环境搭建的依赖关系。你想想看,从GPU硬件到驱动,再到CUDA和cuDNN,最后才是TensorRT-LLM。每一层都像积木一样叠上去,哪一块没对齐,整个就塌了。
好了,环境搭建就讲到这里。记住我反复强调的那句话:版本匹配是第一要务。别贪新,别图省事,每一步都验证通过再往下走。