Gpu资源测试通用报告

2024-01-09
8分钟阅读时长

一、通用计算性能测试

1.测试目的

  • 验证 CUDA ⼯具包是否可以正确安装和配置

  • 检查 CUDA 可以访 问的 GPU 设备的数量

  • 计算能⼒、核⼼数量、内存带宽等硬件规格信息,以及它们是否能正常⼯作,确保系统硬件配置的稳定性

2.环境配置

  • NVIDIA A100-SXM4-40GB *8

  • NVIDIA 驱动 535.129.03

  • CUDA 11.8

  • nvidia-fabricmanager服务

3.测试工具

deviceQuery,cuda ⼯具包中 samples/1_Utilities/deviceQuery

项目主页NVIDIA/cuda-samples: Samples for CUDA Developers which demonstrates features in CUDA Toolkit (github.com)

4.测试过程

# 下载samples项目
git clone https://github.moeyy.xyz/https://github.com/NVIDIA/cuda-samples.git
# 编译deviceQuery
cd cuda-samples/Samples/1_Utilities/deviceQuery && make
# 执行deviceQuery
./deviceQuery

5.测试结果

属性
设备 NVIDIA A100-SXM4-40GB
CUDA驱动版本 / 运行时版本 11.8/11.8
CUDA主/次版本号 8.0
全局内存总量 40339 MBytes (42298834944 bytes)
多处理器数量,CUDA核心/多处理器 (108) Multiprocessors, (064) CUDA Cores/MP: 6912 CUDA Cores
GPU最大时钟频率 1410 MHz (1.41 GHz)
内存时钟频率 1215 Mhz
内存总线宽度 5120-bit
L2缓存大小 41943040 bytes
最大纹理维度尺寸 (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
最大分层1D纹理尺寸,(num) layers 1D=(32768), 2048 layers
最大分层2D纹理尺寸,(num) layers 2D=(32768, 32768), 2048 layers
常量内存总量 65536 bytes
每块的共享内存总量 49152 bytes
每个多处理器的共享内存总量 167936 bytes
每块可用的寄存器总量 65536
线程束大小 32
每个多处理器的最大线程数 2048
每个块的最大线程数 1024
线程块的最大尺寸 (x,y,z) (1024, 1024, 64)
网格尺寸的最大尺寸 (x,y,z) (2147483647, 65535, 65535)
最大内存间距 2147483647 bytes
纹理对齐 512 bytes
并行复制和内核执行 Yes with 3 copy engine(s)
内核运行时限制 No
集成GPU共享主机内存 No
支持主机页锁定内存映射 Yes
表面对齐要求 Yes
设备支持ECC Enabled
设备支持统一寻址 (UVA) Yes
设备支持受管内存 Yes
设备支持计算抢占 Yes
支持协作内核启动 Yes
支持多设备协作内核启动 Yes
设备PCI域ID / 总线ID / 位置ID 0 / 207 / 0

6.测试结论

当前环境,NVIDIA驱动、CUDA工具包、nvlink服务均已正常安装和配置,系统硬件配置稳定

二、GPU显存带宽测试

1.测试目的

测试主机到GPU设备、GPU设备到主机、以及设备到设备之间的数据传输速度,可用于评估GPU设备与主机之间的带宽,以及用于优化GPU计算应用程序的数据传输性能

2.环境配置

  • 显卡规格:NVIDIA A100-SXM4-40GB *8
  • CUDA版本:11.7
  • NVIDIA驱动版本:525.125.06
  • nvidia-fabricmanager服务

3.测试工具

NVIDIA官方提供的命令行工具bandwidthTest

4.测试过程

cd cuda-samples/Samples/1_Utilities/bandwidthTest/
make
./bandwidthTest

5.测试结果

Transfer Direction Transfer Size (Bytes) Bandwidth (GB/s)
Host to Device 32000000 25.2
Device to Host 32000000 26.3
Device to Device 32000000 1154.8

测试主机到设备、设备到主机、设备到设备的带宽峰值值如上表所示,一般以 GB/s 为单位,该值越高则说明设备和主机之间的数据传输速度越快,系统整体带宽性能越好。其中设备到设备的速度测试实际测试内容为当前GPU的显存性能。

6.测试结论

数据传输的大小32000000 Bytes, A100 GPU主机到设备,设备到主机,设备与设备的显存带宽均低于理论封值,主机到设备、设备到主机影响参数太多,没有理论峰值速度。其中设备到设备的带宽A100 40GB SXM4显卡的理论显存带宽为1555 GB/s,实际测试仅有1154.8GB/s,设备到设备数据传输速度比官方理论峰值低25.79%。(实际带宽会受到多种因素的影响,比如说系统架构和配置、数据传输类型、驱动程序和其他软件等,所以实际带宽都会低于理论峰值)

三、GPU之间的P2P带宽和延迟测试

1.测试目的

评估两个GPU之间的连接性能,包括带宽和延迟,从而评估GPU之间的数据传输性能。在多GPU并行计算中,GPU之间的高速数据传输是保证计算性能的重要因素,因此评估GPU之间连接性能是非常重要的。

2.环境配置

  • 显卡规格:NVIDIA A100-SXM4-40GB *8
  • CUDA版本:11.7
  • NVIDIA驱动版本:525.125.06
  • nvidia-fabricmanager服务

3.测试工具

NVIDIA官方提供的命令行工具p2pBandwidthLatencyTest

4.测试过程

cd cuda-samples/Samples/5_Domain_Specific/p2pBandwidthLatencyTest
make
./p2pBandwidthLatencyTest

5.测试结果

(1)P2P Connectivity Matrix

D\D 0 1 2 3 4 5 6 7
0 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1

(2)Unidirectional P2P=Disabled Bandwidth Matrix (GB/s)

D\D 0 1 2 3 4 5 6 7
0 1274.47 17.87 12.43 12.42 20.61 20.78 20.84 20.88
1 17.88 1284.95 12.43 12.42 20.43 20.35 20.90 20.87
2 12.55 12.55 1283.89 8.30 12.61 12.61 12.61 12.59
3 12.55 12.55 8.34 1287.07 12.61 12.60 12.60 12.59
4 20.59 20.59 12.49 12.48 1289.19 17.90 20.83 20.93
5 20.57 20.84 12.49 12.48 17.93 1292.39 20.82 20.97
6 20.42 20.66 12.49 12.48 20.89 20.91 1292.39 18.29
7 20.51 20.42 12.49 12.48 20.84 20.91 17.84 1291.32

(3)Unidirectional P2P=Enabled Bandwidth (P2P Writes) Matrix (GB/s)

D\D 0 1 2 3 4 5 6 7
0 1286.01 273.08 274.19 274.89 275.20 272.64 275.20 274.49
1 273.70 1299.92 275.18 274.67 274.69 273.92 274.49 274.47
2 273.39 275.27 1296.68 274.91 274.99 275.08 274.38 274.87
3 274.09 274.91 275.01 1305.35 275.47 274.04 273.62 274.99
4 274.19 275.08 274.51 275.49 1307.53 275.92 274.70 274.86
5 274.70 275.66 273.96 274.52 275.54 1301.00 275.40 275.30
6 275.15 275.18 275.02 275.18 275.61 275.45 1305.35 272.18
7 275.18 275.59 271.25 275.15 274.13 272.81 275.40 1304.26

2个GPU间单向带宽是270GB左右

(4)Bidirectional P2P=Disabled Bandwidth Matrix (GB/s)

D\D 0 1 2 3 4 5 6 7
0 1306.98 19.76 14.34 14.38 28.89 29.44 29.36 29.27
1 19.89 1313.58 14.38 14.38 29.01 29.02 29.08 29.30
2 15.51 15.48 1312.47 9.46 15.55 15.56 15.54 15.52
3 15.58 15.57 9.50 1314.68 15.57 15.58 15.56 15.52
4 28.57 28.94 14.38 14.41 1313.03 19.85 28.45 28.88
5 28.54 28.51 14.38 14.39 19.89 1314.13 28.48 28.92
6 28.58 28.94 14.37 14.42 28.67 28.69 1313.58 20.08
7 28.59 28.78 14.38 14.37 29.33 29.47 20.03 1313.03

(5)Bidirectional P2P=Enabled Bandwidth Matrix (GB/s)

D\D 0 1 2 3 4 5 6 7
0 1306.44 447.94 445.13 445.26 445.11 445.49 444.36 445.00
1 447.30 1308.08 445.13 444.88 444.86 444.99 444.86 445.67
2 446.70 446.94 1318.57 518.03 519.71 519.37 517.66 521.20
3 446.82 447.00 516.49 1313.58 519.53 518.34 518.85 520.45
4 446.26 447.03 443.35 444.35 1306.98 445.26 444.25 445.64
5 446.91 447.17 519.05 518.19 447.30 1320.79 520.11 519.59
6 446.25 447.70 519.22 520.07 446.45 518.22 1313.58 519.59
7 447.20 447.32 517.28 519.74 447.47 519.08 518.39 1311.37

2个GPU间双向带宽400GB左右

(6)P2P=Disabled Latency Matrix (us)

GPU 0 1 2 3 4 5 6 7
0 3.01 21.49 21.51 21.51 21.56 20.20 18.86 21.56
1 21.60 2.90 21.58 21.57 21.70 21.56 21.47 21.57
2 21.51 21.46 2.70 21.57 18.33 18.83 21.40 20.60
3 21.42 21.37 21.56 2.55 16.51 21.59 17.95 21.14
4 21.55 21.48 21.55 21.71 3.00 21.46 21.46 21.46
5 21.53 20.64 21.48 21.56 21.55 2.64 21.39 21.28
6 21.49 21.54 21.59 21.59 21.57 21.44 2.54 21.46
7 21.75 21.56 21.67 21.58 21.45 21.15 21.57 2.66
CPU 0 1 2 3 4 5 6 7
0 3.01 8.01 7.93 7.84 8.23 7.04 7.11 8.24
1 7.98 2.97 7.96 7.90 8.21 7.08 7.13 8.24
2 7.83 7.88 3.02 7.89 8.19 7.12 7.03 8.20
3 7.81 7.84 7.84 2.94 8.20 7.08 7.03 8.12
4 7.92 7.99 7.98 7.97 3.07 7.28 7.30 8.39
5 7.02 7.10 7.07 7.06 7.46 2.39 6.43 7.50
6 7.00 7.14 7.10 7.08 7.48 6.34 2.41 7.46
7 8.28 8.34 8.11 8.04 8.52 7.33 7.33 3.08

(7)P2P=Enabled Latency (P2P Writes) Matrix (us)

GPU 0 1 2 3 4 5 6 7
0 3.01 2.89 2.90 2.90 2.88 2.90 2.90 2.90
1 2.96 2.91 2.91 2.96 2.92 2.92 2.91 2.91
2 2.79 2.73 2.71 2.75 2.73 2.74 2.80 2.72
3 3.10 3.06 3.03 2.98 3.00 3.03 3.03 3.07
4 2.95 2.95 3.02 2.97 3.01 2.96 2.96 2.96
5 2.61 2.62 2.60 2.64 2.61 2.64 2.63 2.71
6 2.68 2.64 2.70 2.70 2.62 2.60 2.53 2.62
7 2.63 2.58 2.56 2.63 2.55 2.77 2.63 2.65
CPU 0 1 2 3 4 5 6 7
0 2.96 2.23 2.16 2.16 2.17 2.16 2.16 2.18
1 2.33 3.00 2.25 2.23 2.32 2.26 2.29 2.29
2 2.30 2.27 3.06 2.27 2.28 2.25 2.25 2.28
3 2.34 2.27 2.27 3.09 2.26 2.22 2.24 2.25
4 2.38 2.38 2.33 2.34 3.06 2.35 2.31 2.38
5 2.01 1.96 1.95 1.97 1.96 2.48 1.94 1.94
6 2.00 2.05 1.99 1.98 1.99 1.99 2.47 1.97
7 2.52 2.40 2.42 2.44 2.44 2.41 2.39 3.25

p2pBandwidthLatencyTest测试结果主要包括两个指标:带宽和延迟。带宽是指两个GPU之间传输数据的速度,一般用GB/s作为单位。p2pBandwidthLatencyTest测试结果中,带宽值越高表示两个GPU之间传输数据的速度越快,性能越好。一般来说,如果两个GPU连接到同一个根节点,则带宽会比连接到不同根节点的GPU之间的带宽要快。延迟是指两个GPU数据传输所需要的时间,一般用us作为单位。p2pBandwidthLatencyTest测试结果中,延迟值越低表示数据传输所需要的时间越短,性能越好。一般来说,如果两个GPU连接到同一个根节点,则延迟会比连接到不同节点的GPU之间的延迟要低。

6.测试结论

GPU A100 各卡间通信正常,带宽比理论值低32.34%,卡间延迟无异常

四、浮点计算性能测试

1.测试目的

浮点运算实际性能

2.环境配置

  • 显卡规格:NVIDIA A100-SXM4-40GB *8
  • CUDA版本:11.8
  • NVIDIA驱动版本:525.125.06
  • nvidia-fabricmanager服务
  • pyTorch

3.测试工具

  • 方法一:NVIDIA官方的GEMM(General matrix multiplication)工具
  • 方法二:PyTorch 提供的 Benchmark

4.测试过程

测试前将GPU时钟频率调整到此GPU所支持的最大频率

查看GPU所支持的最大时钟频率

nvidia-smi -q -d clock

image-20241115151650104

设置GPU应用程序时钟频率 , 语法 nvidia-smi -ac <MEM clock, Graphics clock>

nvidia-smi -lgc 1215,1440

PyTorch方法

测试代码 flops.py

import torch
from torch.utils import benchmark

typ = torch.float16
n = 1024 * 16
a = torch.randn(n, n).type(typ).cuda()
b = torch.randn(n, n).type(typ).cuda()

t = benchmark.Timer(
      stmt='a @ b',
      globals={'a': a, 'b': b})

x = t.timeit(50)
print('float16 ,',2*n**3 / x.median /1e12)


typ = torch.float32
n = 1024 * 16
a = torch.randn(n, n).type(typ).cuda()
b = torch.randn(n, n).type(typ).cuda()

t = benchmark.Timer(
              stmt='a @ b',
                    globals={'a': a, 'b': b})

x = t.timeit(50)
print('float32 ,',2*n**3 / x.median /1e12)


typ = torch.float64
n = 1024 * 16
a = torch.randn(n, n).type(typ).cuda()
b = torch.randn(n, n).type(typ).cuda()

t = benchmark.Timer(
              stmt='a @ b',
                    globals={'a': a, 'b': b})

x = t.timeit(50)
print('float64 ,',2*n**3 / x.median /1e12)

gemm方法

#gemm程序需要更高版本的glibcxx,我们用cuda里自带的
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/nsight-compute-2022.3.0/host/linux-desktop-glibc_2_11_3-x64:$LD_LIBRARY_PATH
#INT 8:
./cublasMatmulBench -P=bisb_imma -m=8192 -n=3456 -k=16384 -T=1000 -ta=1 -B=0
#FP16:
./cublasMatmulBench -P=hsh -m=12288 -n=9216 -k=32768 -T=1000-tb=1 -B=0
#TF32:
./cublasMatmulBench -P=sss_fast_tf32 -m=8192 -n=3456 -k=16384-T=1000 -ta=1 -B=0
#FP32:
./cublasMatmulBench -P=ddd -m=3456 -n=2048 -k=16384 -T=1000-tb=1 -B=0
#FP64:
./cublasMatmulBench -P=sss -m=3456 -n=2048 -k=16384 -T=1000-tb=1 -B=0

5.测试结果

浮点类型 理论性能(TFLOPS) 实测性能(TFLOPS) 实测性能(GFLOPS)
INT8 501 498.848973 498848.973
FP16 259 236.967211 236967.211
TF32 117 57.980576 57980.576
FP64 19.2 18.100587 18100.587
FP64 18.6 19.212092 19212.092

6.测试结论

  1. 对于INT8浮点类型,实测性能略高于理论性能,这可能是由于硬件优化或者其他因素导致的。
  2. FP16和TF32浮点类型的实测性能都略低于其理论性能,这可能表明在这些类型上存在一些性能损失或者硬件限制。
  3. 而对于FP64浮点类型,实测性能与理论性能相比也有所下降,这可能是由于硬件限制或者测试条件的影响。

综上所述,测试结果表明在不同的浮点类型下,实测性能与理论性能之间存在一些差异,这可能受到硬件、优化以及测试条件等多种因素的影响。

五、Transformer+WMT’14

1.测试目的

测试长时间运行时的性能稳定性,以及整体性能。

2.环境配置

  • 显卡规格:NVIDIA A100-SXM4-40GB *8
  • CUDA版本:11.8
  • NVIDIA驱动版本:525.125.06
  • nvidia-fabricmanager服务
  • pyTorch

3.测试工具

pyTorch1.13.1、sockeye3.1.34

4.测试过程

5.测试结果

GPUs Updates(平均) Epoch(平均) Updates/sec Time-cost
1 500 1 0.748 2429.823
2 500 1 0.812 615.760
8 500 1 1.578 316.931

该程序主要使用pytorch的Transformer模型,数据集使用WMT’14英语翻译为德语数据并进行byte-pair encoding编码,测试训练耗时耗时。数据处理参数,训练参数在每次训练中均不改变。测试结果中GPUs表示的GPU数量,Updates表示参数更新次数,Epoch标示训练轮数,Updates/sec表示每秒钟的参数更新次数(模型训练的速度),Time-cost表示训练耗时。

数据预处理参数
word-min-count 2
pad-vocab-to-multiple-of 8
max-seq-len 95
num-samples-per-shard 10000000
训练参数
num-layers 6
transformer-model-size 1024
transformer-attention-heads 16
transformer-feed-forward-num-hidden 4096
batch-type max-word
batch-size 5000
update-interval 20
checkpoint-interval 500
max-updates 15000
optimizer-betas 0.9:0.98
initial-learning-rate 0.06325
learning-rate-scheduler-type inv-sqrt-decay
learning-rate-warmup 4000
seed 1

6.测试结论

。。。

六、NVLink测试

1.测试目的

测试NVLink使用状况,性能

2.环境配置

  • 显卡规格:NVIDIA A100-SXM4-40GB *8
  • CUDA版本:11.8
  • NVIDIA驱动版本:525.125.06
  • nvidia-fabricmanager服务
  • pyTorch

3.测试工具

NVSMI

4.测试过程

查看 nvswicth拓扑

image-20241115151658162

可以看到,任意2个GPU卡之间都是 NVLink12。应该是因为A100引入了 NVSwitch的关系

image-20241115151704328

查看 nvlink 状态

image-20241115151709797

测试代码

import torch
import numpy as np

device = torch.device("cuda")

n_gpus = 8
data_size = 1024 * 1024 * 1024  # 1 GB

speed_matrix = np.zeros((n_gpus, n_gpus))

for i in range(n_gpus):
    for j in range(i + 1, n_gpus):
        print(f"Testing communication between GPU {i} and GPU {j}...")
        with torch.cuda.device(i):
            data = torch.randn(data_size, device=device)
            torch.cuda.synchronize()
        with torch.cuda.device(j):
            result = torch.randn(data_size, device=device)
            torch.cuda.synchronize()
        with torch.cuda.device(i):
            start = torch.cuda.Event(enable_timing=True)
            end = torch.cuda.Event(enable_timing=True)
            start.record()
            result.copy_(data)
            end.record()
            torch.cuda.synchronize()
            elapsed_time_ms = start.elapsed_time(end)
        transfer_rate = data_size / elapsed_time_ms * 1000 * 8 / 1e9
        speed_matrix[i][j] = transfer_rate
        speed_matrix[j][i] = transfer_rate

print(speed_matrix)

5.测试结果

GPU 1 GPU 2 GPU 3 GPU 4 GPU 5 GPU 6 GPU 7 GPU 8
GPU 1 0 464.9859565 526.4730694 526.2759531 525.7450773 525.9377422 473.3910529 526.7334102
GPU 2 464.9859565 0 436.0805066 470.8014557 529.4908943 527.1316232 528.5546556 528.4599488
GPU 3 526.4730694 436.0805066 0 528.6358067 529.1016042 529.6339894 478.4399884 529.2038167
GPU 4 526.2759531 470.8014557 528.6358067 0 478.959038 529.4251015 528.190651 529.1245426
GPU 5 525.7450773 529.4908943 529.1016042 478.959038 0 529.1850375 529.5608754 529.8420447
GPU 6 525.9377422 527.1316232 529.6339894 529.4251015 529.1850375 0 469.9187813 529.6298162
GPU 7 473.3910529 528.5546556 478.4399884 528.190651 529.5608754 469.9187813 0 527.0560527
GPU 8 526.7334102 528.4599488 529.2038167 529.1245426 529.8420447 529.6298162 527.0560527 0

GPU服务器内NVLINK带宽测试

6.测试结论

A100 40GB SXM 理论GPU卡间带宽400GB/s,正常模式NVLink全互通带宽约为370GB基本符合预期。