4. 环境准备:装好 Ubuntu、NVIDIA 驱动、CUDA Toolkit 与 cuDNN

好,咱们直接上手。要做 GPU 加速 BLAST,环境是第一步。这一步要是踩了坑,后面全白搭。

我个人习惯是把环境拆成四层:操作系统 → 显卡驱动 → CUDA 运行时 → cuDNN 库。一层叠一层,缺一个都跑不起来。你想想看,要是驱动版本跟 CUDA Toolkit 不匹配,后面编译啥的会报一堆莫名其妙的错。

环境准备四层结构图 Ubuntu 20.04 / 22.04 LTS NVIDIA 驱动 (≥ 525.85.05) CUDA Toolkit 12.x cuDNN 8.x / 9.x for CUDA 12 依赖关系:下层是上层的基础,版本号必须对齐

4.1 装 Ubuntu 系统

我建议用 Ubuntu 20.04 LTS 或 22.04 LTS。别图新鲜装非 LTS 版本,搞科研的讲究稳定。

小提示:如果机器上已经有 Windows,可以用 U 盘做双系统;或者直接上 Ubuntu Server,省掉桌面占用的资源。

装系统的时候注意这几件事:

  • 分区:给 / 分区至少 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 对驱动版本有硬要求,别太旧。

获取驱动有两种方式:

  1. 官方 runfile:去 NVIDIA 官网下载对应显卡型号的驱动,手动安装。
  2. 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     |
|-------------------------------+----------------------+----------------------+
注意:看到 "CUDA Version: 12.2" 这行,这不是说你装了 CUDA Toolkit,它只表示驱动能支持到那个版本的 CUDA。Toolkit 还得单独装。

4.3 安装 CUDA Toolkit

CUDA Toolkit 是编译和运行 GPU 代码的核心。BLAST 调优时跑的那些 profile,都得靠它。

我之前做过一个项目,驱动是 525,结果装了 CUDA 11.8,编译倒是过了,一跑就崩。后来一查,驱动版本太低了,带不动 CUDA 11.8 的新特性。这就是教训。

版本对应对照表(我常用的组合):

显卡架构推荐驱动推荐 CUDA
Volta / Turing525 及以上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 目录下。具体步骤如下:

  1. 去 NVIDIA 官网注册并下载 cuDNN for CUDA 12.x(tar 包,非 deb)。
  2. 解压后复制文件:
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
避坑:我曾经因为把 cuDNN 的 tar 包解压后直接放到了 /usr/lib,导致系统里有两套 cuDNN 库,BLAST 运行时加载了旧版本,性能直接腰斩。所以统一放到 CUDA 目录下,别乱撒。

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,全得靠这四层的正确配合。花一小时把环境扎扎实实搭好,后面能省下好几天头疼的时间。