Skip to content

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.02

2.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.dat

3.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 核心指标

  1. Time: 计算耗时 (90.14 s)。
  2. Total Gflops: 系统总算力。
    • 1.364e+05 = 136,400 Gflops = 136.4 TFLOPS
  3. Residual Check: 残差校验。
    • 必须显示 PASSED
    • 数值通常应远小于 16 (例如 0.000xxx)。

5. 优化建议

  1. NUMA 亲和性: 虽然 --bind-to none 是安全选项,但在追求极限性能时,应使用脚本控制每个 MPI Rank 绑定到离对应 GPU 最近的 CPU Core 上 (Local NUMA Domain)。
  2. 多节点测试: 多机运行时,需配合 hostfile,并确保容器内的 SSH 互信或通过 Slurm/K8s 调度。此时 --network host--ipc=host 尤为重要。

AI-HPC Organization