NVIDIA GPU HPL 性能测试指南 (Docker)
摘要: 在容器化环境中运行 HPL (High-Performance Linpack) 是评估 GPU 集群算力的标准做法。本文基于 NVIDIA 官方镜像
nvcr.io/nvidia/hpc-benchmarks,详细介绍了如何通过 Docker 部署并执行 HPL 测试,涵盖了关键的性能调优参数。
1. 概述
相比于裸机编译,使用 NVIDIA 官方优化容器运行 HPL 具有以下优势:
- 环境一致性: 内置了经过高度优化的 CUDA、NCCL、OpenMPI 和 MKL 库。
- 开箱即用: 省去了繁琐的数学库编译和依赖解决过程。
- 性能优异: 官方镜像针对 Tensor Core 进行了专门优化。
测试镜像: nvcr.io/nvidia/hpc-benchmarks:25.02 (或最新版本)
2. Docker 容器启动
为了发挥硬件极致性能,启动容器时需要添加特定的特权和资源映射参数。
2.1 启动命令
bash
docker run -it --gpus all --ipc=host \
--ulimit memlock=-1 --ulimit stack=67108864 \
--privileged=true --network host \
--shm-size=20G \
-v /home/hpl-data:/workspace \
nvcr.io/nvidia/hpc-benchmarks:25.022.2 关键参数解析
| 参数 | 作用 | 为什么需要? |
|---|---|---|
--gpus all | 透传所有 GPU | 允许容器访问宿主机所有 GPU 资源。 |
--ipc=host | 共享宿主机 IPC | 关键: 允许高性能进程间通信 (如 NVSHMEM),显著降低多卡通信延迟。 |
--ulimit memlock=-1 | 取消内存锁定限制 | 关键: 允许 Pin Memory (锁定内存),这是 InfiniBand RDMA 通信的必要条件。 |
--ulimit stack=... | 增加栈大小 | 防止在大型矩阵分解时发生 Stack Overflow。 |
--privileged=true | 特权模式 | 允许访问 InfiniBand 设备及底层驱动接口。 |
--network host | 宿主机网络 | 绕过 Docker 网桥,提供最低的网络延迟 (对 IB 至关重要)。 |
--shm-size=20G | 增加共享内存 | 满足大型矩阵计算及 MPI 进程间缓冲区的需求。 |
3. HPL 测试执行
进入容器后,通常使用 mpirun 调用优化脚本 hpl.sh。
3.1 运行命令 (单机 8 卡示例)
bash
mpirun --bind-to none -np 8 \
-npernode 8 \
-x LD_LIBRARY_PATH \
/workspace/hpl.sh --dat /workspace/HPL-8GPUs.dat3.2 参数说明
--bind-to none: 重要。不让 MPI 强制绑定 CPU 核心。在容器内,CPU 拓扑可能与物理机不完全一致,让 OS 调度或手动控制亲和性通常更好。-np 8: 总进程数。对应 8 块 GPU。-npernode 8: 每个节点运行 8 个进程 (1 GPU = 1 Process)。-x LD_LIBRARY_PATH: 显式传递环境变量,确保能找到容器内的 CUDA/NCCL 库。
3.3 配置文件 (HPL.dat)
HPL.dat 决定了计算规模。对于 8x A800/H800,典型配置关注点:
- N (矩阵阶数):
264192(需根据显存大小调整,占用约 80%-90% 显存为佳)。 - NB (块大小):
1024(Tensor Core 优化的推荐值)。 - P x Q (进程网格):
4 x 2(建议 P < Q 或接近正方形,如 8 卡用 4x2 或 2x4)。
4. 结果分析
测试结束后,关注标准输出中的摘要信息:
text
================================================================================
T/V N NB P Q Time Gflops
--------------------------------------------------------------------------------
WR01C2R4 264192 1024 4 2 90.14 1.364e+05
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)= 0.000224 ...... PASSED
================================================================================4.1 核心指标
- Time: 计算耗时 (90.14 s)。
- Total Gflops: 系统总算力。
1.364e+05= 136,400 Gflops = 136.4 TFLOPS。
- Residual Check: 残差校验。
- 必须显示 PASSED。
- 数值通常应远小于 16 (例如 0.000xxx)。
5. 优化建议
- NUMA 亲和性: 虽然
--bind-to none是安全选项,但在追求极限性能时,应使用脚本控制每个 MPI Rank 绑定到离对应 GPU 最近的 CPU Core 上 (Local NUMA Domain)。 - 多节点测试: 多机运行时,需配合
hostfile,并确保容器内的 SSH 互信或通过 Slurm/K8s 调度。此时--network host和--ipc=host尤为重要。
