4. 环境准备:装好 Ubuntu、NVIDIA 驱动、CUDA Toolkit 与 cuDNN
好,咱们直接上手。要做 GPU 加速 BLAST,环境是第一步。这一步要是踩了坑,后面全白搭。
我个人习惯是把环境拆成四层:操作系统 → 显卡驱动 → CUDA 运行时 → cuDNN 库。一层叠一层,缺一个都跑不起来。你想想看,要是驱动版本跟 CUDA Toolkit 不匹配,后面编译啥的会报一堆莫名其妙的错。
4.1 装 Ubuntu 系统
我建议用 Ubuntu 20.04 LTS 或 22.04 LTS。别图新鲜装非 LTS 版本,搞科研的讲究稳定。
装系统的时候注意这几件事:
- 分区:给 / 分区至少 100 GB。如果数据多,再单独挂个 /data。
- 网络:确保能连外网,驱动和工具都得从 NVIDIA 官网下。
- SSH:装完先开 SSH 服务,方便远程连上去操作。
装好后执行:
sudo apt update && sudo apt upgrade -y
sudo apt install build-essential dkms linux-headers-$(uname -r) -y
这一步是为了后面编译内核模块做准备。不装的话,驱动安装时可能报 kernel header 缺失。
4.2 安装 NVIDIA 驱动
驱动是显卡能工作的基础。BLAST 对驱动版本有硬要求,别太旧。
获取驱动有两种方式:
- 官方 runfile:去 NVIDIA 官网下载对应显卡型号的驱动,手动安装。
- Ubuntu 源:用
ubuntu-drivers工具自动推荐版本。
我个人偏向第二种,省事。跑一遍:
sudo ubuntu-drivers autoinstall
或者手动指定版本号(推荐 525 或 535 系列):
sudo apt install nvidia-driver-535 -y
装完后重启,用 nvidia-smi 验证:
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
4.3 安装 CUDA Toolkit
CUDA Toolkit 是编译和运行 GPU 代码的核心。BLAST 调优时跑的那些 profile,都得靠它。
我之前做过一个项目,驱动是 525,结果装了 CUDA 11.8,编译倒是过了,一跑就崩。后来一查,驱动版本太低了,带不动 CUDA 11.8 的新特性。这就是教训。
版本对应对照表(我常用的组合):
| 显卡架构 | 推荐驱动 | 推荐 CUDA |
|---|---|---|
| Volta / Turing | 525 及以上 | 11.8 |
| Ampere (A100/A30) | 535 及以上 | 12.2 |
| Hopper (H100) | 545 及以上 | 12.3+ |
安装步骤(以 CUDA 12.2 为例):
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run
安装器启动后,会弹出字符菜单。注意:把 "Driver" 前面的勾取消掉,因为我们已经安过驱动了。只选 CUDA Toolkit 和 CUDA Samples。
装好以后配置环境变量(追加到 ~/.bashrc):
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
然后 source ~/.bashrc,验证:
nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed_Nov_22_10:17:15_PST_2023
Cuda compilation tools, release 12.2, V12.2.140
看到这些就说明 CUDA Toolkit 装好了。
4.4 安装 cuDNN
cuDNN 是深度神经网络加速库,但 BLAST 里用到的某些 GPU kernel 也会调用它,尤其是做大规模序列比对时涉及一些矩阵运算。
cuDNN 的安装其实很简单,就是把头文件和库文件丢到 CUDA 目录下。具体步骤如下:
- 去 NVIDIA 官网注册并下载 cuDNN for CUDA 12.x(tar 包,非 deb)。
- 解压后复制文件:
tar -xzvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证 cuDNN 版本:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 4
4.5 最终环境检查清单
所有装完以后,我习惯跑一遍下面的检查,确保每层都是通的:
echo "=== 内核版本 ===" && uname -r
echo "=== 驱动版本 ===" && nvidia-smi | grep "Driver Version"
echo "=== CUDA 版本 ===" && nvcc --version | grep "release"
echo "=== cuDNN 版本 ===" && cat /usr/local/cuda/include/cudnn_version.h | grep "CUDNN_MAJOR"
echo "=== GPU 列表 ===" && nvidia-smi --query-gpu=name --format=csv,noheader
echo "=== 编译测试 ===" && cd /tmp && cat < test_cuda.cu
__global__ void test() {}
int main() { test<<<1,1>>>(); cudaDeviceSynchronize(); return 0; }
EOF
nvcc test_cuda.cu -o test_cuda && ./test_cuda && echo "CUDA 编译运行 OK"
如果最后一行输出 "CUDA 编译运行 OK",那环境就准备好了。
多说一句:环境准备在这门课里占的篇幅不大,但它的重要程度是 100%。后面所有的编译、调优、跑 benchmark,全得靠这四层的正确配合。花一小时把环境扎扎实实搭好,后面能省下好几天头疼的时间。