3. 环境搭建:GPU驱动、CUDA Toolkit、cuDF、RAPIDS套件安装,Docker镜像配置与验证
说到单细胞多组学分析的加速,环境搭建是第一道坎。很多朋友买了 GPU 服务器,结果装完驱动发现 CUDA 版本对不上,或者 RAPIDS 跑起来报错,折腾一两天。我个人装机不下 20 次,踩过的坑足以写本小册子。今天咱们直奔主题,把这条链路理清楚。
3.1 整个环境长什么样?
先给个全景图,你心里有个谱。
3.2 GPU 驱动安装
驱动是地基。地基歪了,整栋楼都白搭。
3.2.1 确认你的 GPU
先查卡。在终端跑一句:
lspci | grep -i nvidia
如果输出里有 VGA/3D controller 字样,说明系统认到卡了。但这时驱动还没装,nvidia-smi 报错是正常的。我曾经遇到一台机器 lspci 能看到卡,但 nvidia-smi 死活不出,最后发现是 BIOS 里没开 Resizable BAR——折腾了我整整半天。
3.2.2 安装驱动(推荐 535 或 550 系列)
我一般直接用 NVIDIA 官方 .run 文件,干净利落。
# 1. 卸载旧驱动
sudo apt purge nvidia-* -y
# 2. 禁用 nouveau(开源驱动)
echo 'blacklist nouveau' | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
# 3. 重启后下载驱动
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run
chmod +x NVIDIA-Linux-x86_64-550.90.07.run
sudo ./NVIDIA-Linux-x86_64-550.90.07.run
# 4. 验证
nvidia-smi
输出类似下面这样,说明驱动成功了:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 550.90.07 Driver Version: 550.90.07 CUDA Version: 12.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla T4 Off | 00000000:00:04.0 Off | Off |
| 40% 54C P0 27W / 70W | 0MiB / 15360MiB | 0% Default |
+-----------------------------+----------------------+----------------------+
3.3 CUDA Toolkit 安装
RAPIDS 对 CUDA 版本有严格依赖。目前 cuDF 24.x 推荐 CUDA 11.8 或 12.0–12.4。我个人偏好 11.8,兼容性最稳。
# 下载 CUDA 11.8 runfile
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 --toolkit --silent --override
# 设置环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证
nvcc --version
看到 nvcc: NVIDIA (R) Cuda compiler driver 11.8 就对了。
3.4 RAPIDS 套件安装(cuDF + cuML + cuGraph)
RAPIDS 现在推荐用 conda 或 pip 安装。我测试下来,conda 的依赖解析更靠谱,尤其当你还要搭一个 scverse 环境的时候。
3.4.1 创建 conda 环境并安装
conda create -n rapids-24.06 python=3.10 -y
conda activate rapids-24.06
# 安装 RAPIDS(CUDA 11.8 版本)
conda install -c rapidsai -c conda-forge -c nvidia \
rapids=24.06 python=3.10 cuda-version=11.8 \
cudatoolkit=11.8 \
cuvs=24.06 \
-y
这个命令会把 cuDF、cuML、cuGraph 以及 cuVS 一键装好。装完之后,验证一下:
python -c "import cudf; print(cudf.__version__)"
python -c "import cuml; print(cuml.__version__)"
如果输出版本号 24.06(或 24.08),说明核心库正常。
3.4.2 验证 GPU 加速是否生效
写个最小例子跑一下:
import cudf
import cupy as cp
# 创建 1000 万行数据,走 GPU
df = cudf.DataFrame({'a': cp.random.randn(10_000_000),
'b': cp.random.randn(10_000_000)})
df['c'] = df['a'] + df['b']
print(df.head())
print(f"DataFrame 在 GPU 上? {df._column_names}")
应该 1 秒内跑完。如果用 pandas 跑同量级数据,怎么也得 3–5 秒。
3.5 Docker 镜像配置与验证
实话实说,生产环境里我强烈建议用 Docker。为什么呢?
- 依赖隔离——你换项目不用重新装驱动。
- 可复现——论文审稿人想复现,拉个镜像就行。
- 团队协作——新人不用从头配环境。
3.5.1 安装 Docker + NVIDIA Container Toolkit
# 安装 Docker
sudo apt install docker.io -y
sudo systemctl enable docker
# 安装 NVIDIA Container Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install nvidia-container-toolkit -y
sudo systemctl restart docker
3.5.2 拉取 RAPIDS 官方镜像并测试
NVIDIA NGC 上有现成的 RAPIDS 镜像,省去自己手配依赖的烦恼。
# 拉取 RAPIDS 24.06 镜像
docker pull nvcr.io/nvidia/rapidsai/rapidsai:24.06-cuda11.8-runtime-ubuntu22.04-py3.10
# 启动容器,挂载工作目录
docker run --gpus all -it --rm \
-v /home/user/project:/workspace \
nvcr.io/nvidia/rapidsai/rapidsai:24.06-cuda11.8-runtime-ubuntu22.04-py3.10 \
bash
# 容器内验证
nvidia-smi
python -c "import cudf; print('cuDF 就绪:', cudf.__version__)"
3.5.3 验证 GPU 在容器内可用
有时候 nvidia-smi 在宿主机正常,到了容器里却报错。这是容器没挂载 GPU 设备。检查方法:
# 在容器内执行
python -c "import cupy; print(cupy.cuda.runtime.getDeviceCount(), '块 GPU 可用')"
如果返回 0,说明 --gpus all 没生效,或者 nvidia-container-toolkit 没装好。
3.6 环境验证清单
装完别急着跑分析。先过一遍这个清单,保证每层都没问题。
| 检查项 | 命令 | 期望输出 |
|---|---|---|
| GPU 驱动 | nvidia-smi |
显示 GPU 型号、驱动版本、CUDA 版本 |
| CUDA Toolkit | nvcc --version |
Build cuda_11.8.r11.8/… |
| cuDF | python -c "import cudf; print(cudf.__version__)" |
24.06 |
| cuML | python -c "import cuml; print(cuml.__version__)" |
24.06 |
| GPU 可用性 | python -c "import cupy; print(cupy.cuda.runtime.getDeviceCount())" |
≥ 1 |
| Docker GPU 访问 | docker run --gpus all nvidia/cuda:11.8.0-base nvidia-smi |
与宿主机一致 |
3.7 常见问题与解决方案
- nvidia-smi 显示 "Failed to initialize NVML: Driver/library version mismatch"
驱动版本和内核模块版本不一致。重启机器通常能解决。如果重启后依然报错,说明驱动没装全,重装驱动即可。 - nvcc 找不到
没把 /usr/local/cuda/bin 加到 PATH。重新 source ~/.bashrc,或者直接在命令行 export 一下。 - cuDF import 报 "No module named 'cudf._lib'"
大概率是 pip 安装的 cuDF 和系统 CUDA 不匹配。卸掉换 conda 安装,conda 会自动帮你处理 cudatoolkit 的版本。 - Docker 容器里跑 nvidia-smi 报 "could not select device driver"
nvidia-container-toolkit 没装或没重启。执行sudo apt install nvidia-container-toolkit && sudo systemctl restart docker。