2. 压测环境搭建
好,咱们直接进入正题。压测环境搭建这件事,说白了就是给核函数找个「跑得稳、测得准」的窝。我见过太多团队,代码写得漂亮,结果环境没配好,压测数据全是噪音——白忙活一场。
今天我把这套流程拆成四块来讲:驱动、CUDA Toolkit、Docker 镜像、监控工具。每一块都有我踩过的坑,你跟着走一遍,基本不会翻车。
1. NVIDIA 驱动:别小看这层「地基」
驱动是 GPU 和操作系统之间的翻译官。翻译官不行,再好的核函数也跑不动。
选版本,我有个习惯:别追最新,追「稳定最新」。去 NVIDIA 官网的驱动下载页面,找 Data Center / Tesla 系列,选 Recommended 标签的版本。我个人偏好 535 或 545 系列,这两个分支在 A100/H100 上表现很稳。
核心命令速查:
# 查看当前驱动版本
nvidia-smi
# 查看推荐驱动版本(针对你的 GPU)
nvidia-smi --query-gpu=driver_version --format=csv
# 安装驱动(以 Ubuntu 为例)
sudo apt-get install nvidia-driver-535-server
⚠️ 我曾经踩过的坑: 有一次在 CentOS 7 上装了最新 550 驱动,结果 CUDA 11.8 不兼容,核函数跑起来直接报 CUDA_ERROR_UNKNOWN。查了两天才发现是驱动和 Toolkit 版本不匹配。所以记住:驱动版本 ≥ CUDA Toolkit 所需的最低驱动版本,这是铁律。
装完驱动,重启,跑 nvidia-smi。看到 GPU 型号、显存、驱动版本都正常显示,这步就算过了。
3. CUDA Toolkit:核函数的「编译器和运行时」
CUDA Toolkit 包含 nvcc 编译器、CUDA 运行时库、以及各种开发工具。你写的 __global__ 核函数,全靠它编译成 GPU 能懂的机器码。
版本选择策略:
- 如果你用 PyTorch/TensorFlow,看框架官方支持的 CUDA 版本。比如 PyTorch 2.0 官方推荐 CUDA 11.8。
- 如果你自己写 CUDA C++,选你驱动支持的最新版本。比如驱动 535 可以支持 CUDA 12.2。
- 我个人习惯在机器上装两个版本:一个稳定版(比如 11.8),一个尝鲜版(比如 12.2),通过
update-alternatives切换。
💡 小技巧: 装完 Toolkit 后,一定要配环境变量。我一般写在 ~/.bashrc 里:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda
然后 source ~/.bashrc,跑 nvcc --version 验证。看到版本号出来,就对了。
4. Docker 镜像:让环境「一次构建,到处运行」
集群压测最怕什么?环境不一致。这台机器驱动版本高一点,那台机器 CUDA 路径不一样,压测结果根本没法比。Docker 就是来解决这个问题的。
我的推荐镜像方案:
- 基础镜像:
nvidia/cuda:11.8.0-devel-ubuntu22.04。这个镜像自带 CUDA Toolkit 和驱动兼容层。 - 运行时镜像:
nvidia/cuda:11.8.0-runtime-ubuntu22.04。如果你只需要跑编译好的程序,用这个更轻量。 - 自定义镜像: 在基础镜像上装你的压测工具(比如 nsys、ncu、自定义核函数)。
Dockerfile 示例:
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
# 安装系统依赖
RUN apt-get update && apt-get install -y \
python3-pip \
git \
vim \
&& rm -rf /var/lib/apt/lists/*
# 安装压测工具
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 复制你的压测代码
COPY ./benchmark /workspace/benchmark
WORKDIR /workspace/benchmark
CMD ["python3", "run_benchmark.py"]
⚠️ 注意: 启动容器时一定要加 --gpus all 参数,否则容器里看不到 GPU。我刚开始用 Docker 时忘了加,查了半天为什么 torch.cuda.is_available() 返回 False——嗯,这种低级错误犯一次就够了。
5. 集群监控工具:压测时的「仪表盘」
压测跑起来,你不能闭着眼等结果。你得实时看到:GPU 利用率多少?显存占了多少?有没有掉频率?有没有 ECC 错误?
我常用的监控工具组合:
| 工具 | 用途 | 安装方式 |
|---|---|---|
nvidia-smi |
基础监控:利用率、显存、温度、功率 | 随驱动自带 |
nvtop |
类 htop 的 GPU 监控,多进程一目了然 | apt install nvtop |
dcgmi |
NVIDIA DCGM 工具,支持集群级监控 | 随 CUDA Toolkit 或单独安装 |
Prometheus + Grafana |
集群级可视化监控,历史数据回溯 | Docker 部署 |
我个人最常用的组合是: 单机压测用 nvtop + nvidia-smi dmon。集群压测用 DCGM 导出指标到 Prometheus,Grafana 上画仪表盘。这样压测过程中,哪个节点掉链子,一眼就能看出来。
💡 实战经验: 压测时我习惯开两个终端:一个跑压测程序,另一个跑 watch -n 1 nvidia-smi。这样每秒刷新一次,看到利用率突然掉到 0%,就知道核函数可能出错了。比等程序跑完再看日志,效率高得多。
6. 整体架构:一张图看懂
下面这张图,把整个压测环境的关系画清楚了。你照着搭,不会乱。
这张图里,从下往上依次是:硬件 → 驱动 → CUDA Toolkit → 容器。监控工具贯穿全栈,每一层的问题都能被及时发现。
7. 快速验证:环境搭好了吗?
环境搭完,别急着跑压测。先跑个「Hello World」验证一下:
# 1. 验证驱动
nvidia-smi
# 2. 验证 CUDA Toolkit
nvcc --version
# 3. 验证 Docker GPU 支持
docker run --gpus all nvidia/cuda:11.8.0-runtime-ubuntu22.04 nvidia-smi
# 4. 验证监控工具
nvtop # 或者 dcgmi discovery -v
四条命令都跑通,说明环境没问题。如果哪条卡住了,回头检查对应的层。
总结一下: 压测环境搭建,核心就四个字——分层验证。驱动层用 nvidia-smi,Toolkit 层用 nvcc,容器层用 docker run,监控层用 nvtop。每一层都确认无误,压测数据才有说服力。
嗯,环境搭好了,下一步就是写核函数、跑压测了。不过那是后面的事,先把今天这套流程走一遍,你会发现后面省心很多。