Gpu资源测试通用报告

https://blog.bitllion.top/docs/%E4%BA%91%E8%AE%A1%E7%AE%97/gpu%E8%B5%84%E6%BA%90%E6%B5%8B%E8%AF%95%E9%80%9A%E7%94%A8%E6%8A%A5%E5%91%8A/

一、通用计算性能测试

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) layers1D=(32768), 2048 layers
最大分层2D纹理尺寸,(num) layers2D=(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
设备支持ECCEnabled
设备支持统一寻址 (UVA)Yes
设备支持受管内存Yes
设备支持计算抢占Yes
支持协作内核启动Yes
支持多设备协作内核启动Yes
设备PCI域ID / 总线ID / 位置ID0 / 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 DirectionTransfer Size (Bytes)Bandwidth (GB/s)
Host to Device3200000025.2
Device to Host3200000026.3
Device to Device320000001154.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\D01234567
011111111
111111111
211111111
311111111
411111111
511111111
611111111
711111111

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

D\D01234567
01274.4717.8712.4312.4220.6120.7820.8420.88
117.881284.9512.4312.4220.4320.3520.9020.87
212.5512.551283.898.3012.6112.6112.6112.59
312.5512.558.341287.0712.6112.6012.6012.59
420.5920.5912.4912.481289.1917.9020.8320.93
520.5720.8412.4912.4817.931292.3920.8220.97
620.4220.6612.4912.4820.8920.911292.3918.29
720.5120.4212.4912.4820.8420.9117.841291.32

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

D\D01234567
01286.01273.08274.19274.89275.20272.64275.20274.49
1273.701299.92275.18274.67274.69273.92274.49274.47
2273.39275.271296.68274.91274.99275.08274.38274.87
3274.09274.91275.011305.35275.47274.04273.62274.99
4274.19275.08274.51275.491307.53275.92274.70274.86
5274.70275.66273.96274.52275.541301.00275.40275.30
6275.15275.18275.02275.18275.61275.451305.35272.18
7275.18275.59271.25275.15274.13272.81275.401304.26

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

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

D\D01234567
01306.9819.7614.3414.3828.8929.4429.3629.27
119.891313.5814.3814.3829.0129.0229.0829.30
215.5115.481312.479.4615.5515.5615.5415.52
315.5815.579.501314.6815.5715.5815.5615.52
428.5728.9414.3814.411313.0319.8528.4528.88
528.5428.5114.3814.3919.891314.1328.4828.92
628.5828.9414.3714.4228.6728.691313.5820.08
728.5928.7814.3814.3729.3329.4720.031313.03

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

D\D01234567
01306.44447.94445.13445.26445.11445.49444.36445.00
1447.301308.08445.13444.88444.86444.99444.86445.67
2446.70446.941318.57518.03519.71519.37517.66521.20
3446.82447.00516.491313.58519.53518.34518.85520.45
4446.26447.03443.35444.351306.98445.26444.25445.64
5446.91447.17519.05518.19447.301320.79520.11519.59
6446.25447.70519.22520.07446.45518.221313.58519.59
7447.20447.32517.28519.74447.47519.08518.391311.37

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

(6)P2P=Disabled Latency Matrix (us)

GPU01234567
03.0121.4921.5121.5121.5620.2018.8621.56
121.602.9021.5821.5721.7021.5621.4721.57
221.5121.462.7021.5718.3318.8321.4020.60
321.4221.3721.562.5516.5121.5917.9521.14
421.5521.4821.5521.713.0021.4621.4621.46
521.5320.6421.4821.5621.552.6421.3921.28
621.4921.5421.5921.5921.5721.442.5421.46
721.7521.5621.6721.5821.4521.1521.572.66
CPU01234567
03.018.017.937.848.237.047.118.24
17.982.977.967.908.217.087.138.24
27.837.883.027.898.197.127.038.20
37.817.847.842.948.207.087.038.12
47.927.997.987.973.077.287.308.39
57.027.107.077.067.462.396.437.50
67.007.147.107.087.486.342.417.46
78.288.348.118.048.527.337.333.08

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

GPU01234567
03.012.892.902.902.882.902.902.90
12.962.912.912.962.922.922.912.91
22.792.732.712.752.732.742.802.72
33.103.063.032.983.003.033.033.07
42.952.953.022.973.012.962.962.96
52.612.622.602.642.612.642.632.71
62.682.642.702.702.622.602.532.62
72.632.582.562.632.552.772.632.65
CPU01234567
02.962.232.162.162.172.162.162.18
12.333.002.252.232.322.262.292.29
22.302.273.062.272.282.252.252.28
32.342.272.273.092.262.222.242.25
42.382.382.332.343.062.352.312.38
52.011.961.951.971.962.481.941.94
62.002.051.991.981.991.992.471.97
72.522.402.422.442.442.412.393.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-20240109155422277

设置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)
INT8501498.848973498848.973
FP16259236.967211236967.211
TF3211757.98057657980.576
FP6419.218.10058718100.587
FP6418.619.21209219212.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.测试结果

GPUsUpdates(平均)Epoch(平均)Updates/secTime-cost
150010.7482429.823
250010.812615.760
850011.578316.931

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

数据预处理参数
word-min-count2
pad-vocab-to-multiple-of8
max-seq-len95
num-samples-per-shard10000000
训练参数
num-layers6
transformer-model-size1024
transformer-attention-heads16
transformer-feed-forward-num-hidden4096
batch-typemax-word
batch-size5000
update-interval20
checkpoint-interval500
max-updates15000
optimizer-betas0.9:0.98
initial-learning-rate0.06325
learning-rate-scheduler-typeinv-sqrt-decay
learning-rate-warmup4000
seed1

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-20240110143455653

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

img

查看 nvlink 状态

image-20240110143534351

测试代码

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 1GPU 2GPU 3GPU 4GPU 5GPU 6GPU 7GPU 8
GPU 10464.9859565526.4730694526.2759531525.7450773525.9377422473.3910529526.7334102
GPU 2464.98595650436.0805066470.8014557529.4908943527.1316232528.5546556528.4599488
GPU 3526.4730694436.08050660528.6358067529.1016042529.6339894478.4399884529.2038167
GPU 4526.2759531470.8014557528.63580670478.959038529.4251015528.190651529.1245426
GPU 5525.7450773529.4908943529.1016042478.9590380529.1850375529.5608754529.8420447
GPU 6525.9377422527.1316232529.6339894529.4251015529.18503750469.9187813529.6298162
GPU 7473.3910529528.5546556478.4399884528.190651529.5608754469.91878130527.0560527
GPU 8526.7334102528.4599488529.2038167529.1245426529.8420447529.6298162527.05605270

GPU服务器内NVLINK带宽测试

6.测试结论

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注