GPU基础汇总
1.GPU简介
1.1.什么是GPU
GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形象的理解为90%的ALU(运算单元),5%的Control(控制单元)、5%的Cache(缓存单元)GPU的设计原理——总结为大量的简单运算
2.GPU规格
GPU相关的规格参数查询https://www.techpowerup.com/gpu-specs/
消费卡相关的规格参数查询https://www.mydrivers.com/zhuanti/tianti/gpu/index_nvidia.html
2.1GPU分为消费级专业级企业级
消费级GPU:这类GPU主要用于个人电脑、游戏机等设备,专注于提供高质量的图形渲染能力,以满足游戏和多媒体应用的需求。NVIDIA的GeForce系列和AMD的Radeon系列是典型的消费级GPU。如:
RTX 40 系列
RTX 4090
RTX 4080
RTX 4070 Ti/4070
RTX 4060 Ti/4060
RTX 30 系列
RTX 3090 Ti/3090
RTX 3080 Ti/3080
RTX 3070 Ti/3070
RTX 3060 Ti/3060
RTX 3050
RTX 20 系列
GTX 16 系列
专业级GPU:专业级GPU通常用于专业图形工作站和高端设计领域,如建筑可视化、电影特效制作等。这类GPU提供更高的渲染精度和专业特性,如NVIDIA的Quadro系列。如:
NVIDIA RTX 6000
Ada Generation
NVIDIA RTX A6000
NVIDIA RTX A5500
NVIDIA RTX A5000
NVIDIA RTX A4500
NVIDIA RTX A4000
NVIDIA RTX A2000
NVIDIA RTX A2000 12GB
NVIDIA T1000
NVIDIA T1000 8GB
NVIDIA T400 4GB
Quadro GV100
企业级/计算级GPU:这类GPU专注于并行计算任务,广泛应用于数据中心和科研计算领域。它们通常具备更多的计算核心和优化的架构,以提高计算效率。NVIDIA的Tesla和AI系列,以及AMD的MI系列是计算级GPU的例子。
H100
H800
A100
A2
A10
A16
A30
L40
V100
2.2GPU服务器
4U8卡 PCIE GPU服务器
Nvlink GPU服务器
常见GPU卡形态
2.3 PLX 三种拓扑
Balance拓扑
适合GPU直通虚拟化
中/小规模深度学习训练、推理、仅有云和HPC
Common拓扑
AI训练性能优异
适用于多数的尝试学习训练场景
Cascade拓扑
部分AI训练模型性能最优。
适用于多参数模型的大规模深度学习训练场景
2.4PCIE与SXM参数区别
NVlink和SXM有什么区别
NVlink是链路技术是协议名称,SXM是接口名称,我们所说的NVink整机通常指的是SXM接口的GPU服务器。
PCIE GPU机型是可以通过NVink桥机器实现两卡的互联,客户采购Nvink机型时往往需要多问一句是全互联还是桥机器互联。
HGX模组
Nvlink机型各个厂商都基于英伟达的HGX-GPU模组设计,整机在高度上通常是6U或8U,其中最核心也是价格占比最高是英伟达的GPU模组,可以理解成是一个有8个物理GPU组成的一个大的逻辑
GPU
2.5 nvlink机型主板逻辑图
与PCIE机型的GPU服务器不同,Nvlink机型的主板不需要直接支持GPU。
主板通过四个PCIE Switch提供PCIE通道与HGX模组互联,每个PCIE Switch与2个GPU互联,到每个GPU的链路为PCIEx16。
Intel SPR CPU支持80个PCIE通道,CPU到每个PCIESwitch通常也是PCIEx16。
2个CPU到4个PCIE Switch采用对称设计,架构上实现了PCIE资源的均衡和CPU性能的平均。
HBM (High Bandwidth Memory):显存
HBM是一种高带宽的3D堆叠内存技术,它通过微凸块(Microbumps)和硅通孔(Through-Silicon Vias, TSVs)技术将多个DRAM层堆叠在一起,从而实现更高的数据传输速率和更低的功耗。HBM技术允许在紧凑的空间内提供更大的内存带宽,这对于需要处理大量数据的GPU来说非常重要。HBM内存非常适合于直接与CPU或GPU通信的高带宽应用,除了NVIDIA的高端计算卡(也包括最新推出的Titan V显卡)之外,AMD的Vega56/64也应用了HBM显存来提升显卡性能。每颗GPU搭载4个HBM堆栈式显存的情况下,最大显存容量可达96GB,总显存带宽1.2TB/s。
HGX (High-Performance GPU eXtended):
NVIDIA HGX 是一个计算平台,通过NVLink 和 NVSwitch将多个GPU串连起来,提供强大的AI运算能力。
HGX是一种专为大规模并行计算和AI加速设计的GPU封装技术。它通常指的是NVIDIA的高端数据中心GPU,如Tesla V100或A100,这些GPU采用HBM内存,提供极高的计算性能和内存带宽。HGX模块设计用于实现多GPU配置,通过NVLink技术实现GPU之间的高速连接。
DGX(Data Center GPU,数据中心GPU)
NVIDIA DGX是 AI 超级计算机。硬件方面包含:GPU、CPU、内存、硬盘、散热系统、软件、操作系统等等,也就是说,除了显示器、键盘、鼠标,它全都有。DGX 可定制性不如 HGX,硬件配置是固定的
DGX系统是NVIDIA的一体化AI超级计算机,通常以塔式机箱或机架式机箱的形式出现。
它们设计为开箱即用,集成了高性能的NVIDIA GPU、内存、存储和网络组件。
DGX系统的外观通常更为紧凑,以适应多种数据中心环境。
SXM (Tesla Scalable X-Module):
SXM是NVIDIA Tesla GPU的一种物理封装形式,特别适用于需要高密度计算和大规模并行处理的数据中心和HPC环境。SXM GPU通常具有更高的功率和性能,支持多GPU扩展,通过NVLink技术实现GPU之间的高速通信。SXM封装允许更灵活的系统设计,以适应不同的计算需求
SXM版本的GPU 发布的时候Nvidia配置了标准的HGX平台, 相当于把8张或者4张GPU在HGX平台做成一个模块,按照模块出售, OEM主机制造商相对比较容易的就把HGX一个模块集成到主机箱里面了。当然, 一个模块上的这8张或者4张显卡还是可以独立插拔的。
SXM版本的显卡功耗更高,机箱的体积、散热的要求都更高。
NvLink和SXM其实说的都是一个东西,只是从不同的角度说的。 NvLink是从互联的角度说的, SXM是从板子上面接口的角度说的。 SXM接口也在不断升级版本。
delta板
delta板+nvswitch+SXM=HGX
2.6算力理论值计算
- TFLOPS
TFLOPS,即每秒浮点运算次数(亦称每秒峰值速度)是每秒所执行的浮点运算次数(英文:Floating-point operations per second;缩写:FLOPS)的简称,被用来评估电脑效能,尤其是在使用到大量浮点运算的科学计算领域中。
FP32、FP16、BF16和FP8都是计算中使用的数字表示形式,特别是在浮点运算领域。这些格式主要通过它们使用的位数来区分,这影响了它们的精度、范围和内存要求。
FP16 半精度浮点数 (Half-precision Floating-point format)
FP32 单精度浮点数 (Single-precision Floating-point format)
FP64 双精度浮点数 (Double-precision Floating-point format)
BF16 Brain Floating Point
数据格式和应用场景
FP64:双精度,通常应用于HPC相关领域
FP32:单精度,训练场景的数据格式
TF32:从A100开始NVIDIA提出的新数据格式,比FP32精度低,比FP16精度高,主要用于深度。学习训练,理论上比FP32+FP16混合精度效果更优
BF16:Intelx86、ARM采用的,可用于训练和推理
FP16:主要用于推理
INT8:主要用于推理
通过降低精度而加快模型训练速度、降低显存占用率的方法——混合精度,使用较低精度的浮点数来表示神经网络中的权重和激活值,从而减少内存使用和计算开销,进而加速训练过程。
半精度:如果对运算的精度要求不高,那么就可以尝试使用半精度浮点数进行运算。这个时候,Tensor核心就派上了用场。Tensor Core专门执行矩阵数学运算,适用于深度学习和某些类型的HPC。Tensor Core执行融合乘法加法,其中两个44 FP16矩阵相乘,然后将结果添加到44 FP16或FP32矩阵中,最终输出新的4*4 FP16或FP32矩阵。NVIDIA将Tensor Core进行的这种运算称为混合精度数学,因为输入矩阵的精度为半精度,但乘积可以达到完全精度。Tensor Core所做的这种运算在深度学习训练和推理中很常见。
单精度:Float32 是在深度学习中最常用的数值类型,称为单精度浮点数,每一个单精度浮点数占用4Byte的显存。
双精度:双精度适合要求非常高的专业人士,例如医学图像,CAD。
常用选择原则
卷积网络和Transformer:Tensor核心数>单精度浮点性能>显存带宽>半精度浮点性能
循环神经网络:显存带宽>半精度浮点性能>Tensor核心数>单精度浮点性能
2.GPU算力计算
GPU算力计算
以A100为例:
A100的核心参数:
CUDA核心数:6912个
加速频率:1.41 GHz
GPU每核心单个周期浮点计算系数是2
A100的标准算力
FP32单精=6912x1.41x2=19491.84 Gflops=19.5Tflops
双精算力=19.5Tflops/2=9.7Tflops
CUDA核心数量:
CUDA是NVIDIA推出的统一计算架构,NVIDIA几乎每款GPU都有CUDA核心,CUDA核心是每一个GPU始终执行一次值乘法运算,一般来说,同等计算架构下,CUDA核心数越高,计算能力会递增。
TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算。FLOPS(Floating-point operations per second的缩写),即每秒浮点运算次数。
TOPS(Tera Operations Per Second的缩写),1TOPS代表处理器每秒钟可进行一万亿次(10^12)操作。
DMIPS:Dhrystone Million Instructions executed Per Second,每秒执行百万条指令,用来计算同一秒内系统的处理能力,即每秒执行了多少百万条指令。
TFLOPS(Tera Floating Point Operations Per Second)和 TOPS(Tera Operations Per Second)是两种衡量计算性能的单位:
TFLOPS:TFLOPS是每秒执行的万亿次浮点运算。这是衡量计算性能的传统方式,尤其用于需要大量浮点计算的任务,如图形处理和科学计算。
TOPS:TOPS是每秒执行的万亿次运算。这个术语更常用于衡量AI和机器学习硬件的性能,因为这些任务通常包括大量的整数和固定点运算,而不是传统的浮点运算。 TOPS特别适用于评估深度学习推理任务的性能。
总的来说,TFLOPS更多地关注浮点运算性能,而TOPS则涵盖了更广泛的运算类型,更适用于AI和深度学习应用
2.7英伟达GPU常见的各种核心
CUDA Core
英伟达GPU的参数中,最常看到的核心类型。Nvidia通常用最小的运算单元表示自己的运算能力,CUDA Core 指的是一个执行基础运算的处理元件。我们所说的CUDA Core数量,通常对应的是 FP32 计算单元的数量。
Tensor Core
核心特别大,用于机器学习加速,它可以把整个矩阵都载入寄存器中批量运算,实现十几倍的0效率提升,从Volta 架构发布以来,奠定了英伟达在AI训练的领军地位,每次升级都有新支持的数据类型。
RT Cores
正常数据中心级的GPU核心是没有RT Core的,主要是消费级显卡才为光线追踪运算添加了
RT Cores,考虑到芯片的空间有限,每个SM里面只有1个光追核心(为此还砍掉了大部分的FP64)。可以极大地提升了游戏渲染效率。
2.8英伟达 GPU 内部结构
主机接口:读取程指令并分配到对于的硬件单元;
它连接了GPU卡和PCI Express,
它主要的功能是读取程序指令并分配到对应的硬件单元,
例如某块程序如果在进行内存复制,那么主机接口会将任务分配到复制引擎上。
赋值引擎:完成GPU内存和CPU内存之间数据的传递;
当GPU上有复制引擎时,复制的过程是可以与核函数的计算同步进行的。
随着GPU卡的性能变得强劲,现在的瓶颈已经不在计算速度慢,
而是数据的读入,如何合理的调用复制引擎是一个值得思考的问题。
流处理器簇:GPU最核心地方
包括warp调度器、寄存器、Core、共享内存等。
它的设计和个数决定了GPU的计算能力,一个SM有多个core,每个core上执行线程,
core是实现具体计算的处理器,如果core多同时能够执行的线程就多,
但是并不是说core越多计算速度一定更快,最重要的是让core全部处于工作状态,而不是空闲
2.9显存
显存(Graphics Memory)是GPU中重要的组成部分,用于存储图像、计算结果、模型参数等数据。主流的显存技术有GDDR(Graphics Double Data Rate)和HBM(High Bandwidth Memory)。GDDR具有较大的容量和较低的成本,适用于大规模图形处理;而HBM则具有更高的带宽和更低的功耗,适用于高性能计算和深度学习等任务。
显存容量
显存容量:其主要功能就是暂时储存GPU要处理的数据和处理完毕的数据。显存容量大小决定了GPU能够加载的数据量大小。(在显存已经可以满足客户业务的情况下,提升显存不会对业务性能带来大的提升。在深度学习、机器学习的训练场景,显存的大小决定了一次能够加载训练数据的量,在大规模训练时,显存会显得比较重要。
例如,3060的显存芯片为GA106,这颗芯片的配置为192位的GDDR6显存,也就是3060的显存位宽为192bit。每个显存的位宽一般为32bit,容量一般为1G或者2G,192/32 = 6,所以3060的芯片决定了3060只能为6G或者12G显存
常用显存配置如下表:
显存位宽
显存位宽:显存在一个时钟周期内所能传送数据的位数,位数越大则瞬间所能传输的数据量越大,这是显存的重要参数之一,直接关系到显存的带宽
显存位宽是显存在一个时钟周期内所能传送数据的位数,位数越大则在周期时间内所能传输的数据量越大,这是显存的重要标准之一。l
市场上的显存位宽有64、128、192、256、384、448、512(极个别极品高端显卡)位七种,人们习惯上叫的64位显卡、128位显卡等等就是指其相应的显存位宽。对于一般的显卡而言,显存位宽越高,性能越好,价格也就越高。因此384位等以上位宽的显存更多应用于高端显卡,而主流显卡基本都采用128位显存,更高档次的甜点级显卡则采用256位显存。
显存带宽
显存带宽是指显示芯片与显存之间的数据传输速率,它以字节/秒为单位。显存带宽是决定显卡性能和速度最重要的因素之一。要得到精细(高分辨率)、色彩逼真(32位真彩)、流畅(高刷新速度)的3D画面,就必须要求显卡具有大显存带宽。
计算方式为:显存带宽=显存频率X显存位宽/8
在显存频率相当的情况下,显存位宽将决定显存带宽的大小。比如说同样显存频率为500MHz的128位和256位显存,那么它俩的显存带宽将分别为:128位=500MHz128∕8=8GB/s,而256位=500MHz256∕8=16GB/s,是128位的2倍,可见显存位宽在显存数据中的重要性。
3.GPU测试
3.1安装驱动
https://www.nvidia.cn/drivers/lookup/
1.查看GPU卡信息
查看GPU型号:nvidia-smi -q | grep -i “Product Name”
查看GPU槽位:lspci -vt
dmidecode -t slot | grep
开启gpu持久模式:nvidia-smi -pm 1
Persistence-M(Persistence Mode)是一个用户可设置的驱动程序属性的术语。启用持久性模式后,即使没有活动的客户端,NVIDIA驱动程序也会保持加载状态。这样可以最大程度地减少与运行依赖的应用程序(例如 CUDA 程序)相关的驱动程序加载延迟。
执行 nvidia-smi 命令,可查看Persistence Mode当前状态。Persistence-M的值为On时,持续模式为打开状态
查看是否为一拖八:nvidia-smi topo -m
2.驱动下载:
https://www.nvidia.cn/Download/Find.aspx?lang=cn
NVIDIA-Linux-x86_64-525.116.04.run
3.禁用nouveau驱动
安装NVIDIA驱动时,需要禁用nouveau驱动才可以
3.1直接移除
[root@localhost fw]# lsmod |grep -i nouveau
nouveau 1899494 0
video 24538 1 nouveau
mxm_wmi 13021 1 nouveau
wmi 21636 2 mxm_wmi,nouveau
i2c_algo_bit 13413 2 ast,nouveau
drm_kms_helper 186531 3 ast,nouveau,nvidia_drm
ttm 96673 2 ast,nouveau
drm 456166 7 ast,ttm,drm_kms_helper,nvidia,nouveau,nvidia_drm
[root@localhost fw]# rmmod nouveau
[root@localhost fw]# lsmod |grep -i nouveau
3.2或者可以写系统配置文件
vim /etc/modprobe.d/blacklist-nouveau.conf
#添加如下内容
blacklist nouveau
options nouveau modeset=0
#重启
reboot
#验证nouveau是否禁用成功
lsmod |grep nouveau
#没有输出信息表示禁用成功
4.更新驱动安装命令:
[root@localhost fw]# ./NVIDIA-Linux-x86_64-525.116.04.run --no-x-check
安装驱动直接执行run后缀名驱动包,如果装过需要卸载旧版本后安装新版本,
卸载命令nvidia-uninstall 卸载后需重启生效
如果安装始终有问题可以尝试开机时进入bios关闭secure boot
输入accept回车—Driver不打勾,install 回车
安装完成
3.2安装CUDA
1.下载安装
https://developer.nvidia.com/cuda-toolkit-archive
./cuda_11.8.0_520.61.05_linux.run
2.配置环境
修改配置文件,配置环境(用find / -name cuda命令查看cuda路径)
export PATH=/usr/local/cuda-11.8/bin/:
P
A
T
H
e
x
p
o
r
t
L
D
L
I
B
R
A
R
Y
P
A
T
H
=
/
u
s
r
/
l
o
c
a
l
/
c
u
d
a
−
11.8
/
l
i
b
64
:
PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:
PATHexportLDLIBRARYPATH=/usr/local/cuda−11.8/lib64:LD_LIBRARY_PATH
3.查看是否安装成功
nvcc -V
3.3 ipmitool抓取信息
Intelligent Platform Management Interface (IPMI)智能平台管理接口
https://linux.die.net/man/1/ipmitool
安装:yum install -y ipmitool
ipmitool 是一种可用在 linux 系统下的命令行方式的 ipmi 平台管理工具,它支持 ipmi 1.5 规范(最新的规范为 ipmi 2.0),通过它可以实现获取传感器的信息、显示系统日志内容、网络远程开关机等功能,通过内核驱动或者远程网络方式,收集FRU信息,LAN配置,传感器数据,以及远程控制功能
带内管理(in-band)命令:
ipmitool lan print #LAN配置
ipmitool sensor list #显示系统所有传感器列表
ipmitool fru list #显示系统所有现场可替代器件的列表
ipmitool sdr list #显示系统所有SDRRepository设备列表
ipmitool sel elist #显示所有系统事件日志
ipmitool sel clear #删除所有系统时间日志
ipmitool sel delete ID #删除第ID条SEL
ipmitool sel time get #显示当前BMC的时间
ipmitool sel time set XXX #设置当前BMC的时间
ipmitool pef list #显示系统平台时间过滤的列表
ipmitool user list # 查看用户信息
ipmitool user set name
ipmitool user set password
ipmitool user priv
ipmitool user enable/disable
ipmitool chassis bootdev <pxe/disk/cdrom/bios> 设置启动项
ipmitool mc info #显示BMC版本信息
ipmitool bmc reset cold #BMC 热启动
ipmitool bmc reset warmBMC #冷启动
配置BMC IP
ipmitool -I open lan set 1 ipsrc static
ipmitool -I open lan set 1 ipaddr 10.7.97.28
ipmitool -I open lan set 1 netmask 255.255.255.0
ipmitool -I open lan set 1 defgw ipaddr 10.7.97.1
ipmitool mc reset cold
Ipmitool lan print
ipmitool lan print 1 #显示channel1的网络配置信息
ipmitool lan set 1ipaddr 10.32.2.2 #设置channel1的IP地址
ipmitool lan set 1 netmask 255.255.0.0 #设置channel1的netmask
ipmitool lan set 4 defgw ipaddr255.255.0.254 #设置channel4的网关
ipmitool lan set 2 defgw macaddr
ipmitool lan set 2 ipsrc dhcp #设置channel2的ip 源在DHCP
ipmitool lan set 3 ipsrc static #设置channel2的ip是静态获得的
OOB指令/带外管理(out-of-band)命令
ipmitool -I lanplus -H $oob_ip -U root -P 密码 power off (硬关机,直接切断电源)
ipmitool -I lanplus -H $oob_ip -U root -P 密码 power soft (软关机,即如同轻按一下开机按钮)
ipmitool -I lanplus -H $oob_ip -U root -P 密码 power on (硬开机)
ipmitool -I lanplus -H $oob_ip -U root -P 密码 power reset (硬重启)
ipmitool -I lanplus -H $oob_ip -U root -P 密码 power status (获取当前电源状态)
ipmitool -I lanplus -H $oob_ip -U root -P 密码 chassis power cycle
(注意power cycle 和power reset的区别在于前者从掉电到上电有1秒钟的间隔,而后者是很快上电)
3.4 nvidia-smi
System Management Interface SMI (nvidia-smi)
基于 NVIDIA Management Library (NVML) 实现对NVIDIA设备的监控和管理
https://developer.nvidia.com/nvidia-system-management-interface
nvidia-smi: 它是一个随 NVIDIA 驱动一起安装的命令行程序。它会报告系统中每个 GPU 的基本监控数据和硬件参数、配置数据。 nvidia-smi 可以列出 ECC 错误计数 (Xid 48) 并指示电源线是否已拔出 (Xid 54) 等。同时运行“nvidia-smi –q”以获得全面输出。
1.nvidia-smi图示
-l 可实时刷新GPU使用情况
GPU:显卡编号,从0开始。
Fan:风扇转速,在0~100%之间变动。这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能就不会显示具体转速值。有的设备不会返回转速,因为它不依赖风扇冷却,而是通过其他外设保持低温,比如我们实验室的服务器是常年放在空掉房间里面的。
Name:显卡名,以上都是Tesla。
Temp:显卡内部的温度,以上分别是54、49、46、50、39摄氏度。
Perf:性能状态,从P0到P12,P0性能最大,P12最小 。
Persistence-M:持续模式的状态开关,持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少。以上都是Off的状态。
Pwr:能耗表示。
Bus-Id:涉及GPU总线的相关信息。
Disp.A:是Display Active的意思,表示GPU的显示是否初始化。
Memory-Usage:显存的使用率。
GPU-Util:GPU的利用率。
Compute M.:计算模式。
下面的Process显示每块GPU上每个进程所使用的显存情况
显示
说明
Fan
风扇转速(0%–100%),N/A表示没有风扇
Temp
GPU温度(GPU温度过高会导致GPU频率下降)
Perf
性能状态,从P0(最大性能)到P12(最小性能)
Pwr
GPU功耗
Persistence-M
持续模式的状态(持续模式耗能大,但在新的GPU应用启动时花费时间更少)
Bus-Id
GPU总线,domain🚌device.function
Disp.A
Display Active,表示GPU的显示是否初始化
Memory-Usage
显存使用率
Volatile GPU-Util
GPU使用率
ECC
是否开启错误检查和纠正技术,0/DISABLED, 1/ENABLED
Compute M.
计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
附加选项
说明
nvidia-smi -i xxx
指定某个GPU
nvidia-smi -l xxx
动态刷新信息(默认5s刷新一次)
nvidia-smi –f xxx
将查询的信息输出到具体的文件中,不在终端显示
- nvidia-smi -q
查询所有GPU的当前详细信息
命令
说明
nvidia-smi –q –u
显示单元而不是GPU的属性
nvidia-smi –q –i xxx
指定具体的GPU或unit信息
nvidia-smi –q –f xxx
将查询的信息输出到具体的文件中,不在终端显示
nvidia-smi –q –x
将查询的信息以xml的形式输出
nvidia-smi -q –d xxx
指定显示GPU卡某些信息,xxx参数可以为MEMORY, UTILIZATION, ECC, TEMPERATURE, POWER,CLOCK, COMPUTE, PIDS, PERFORMANCE, SUPPORTED_CLOCKS, PAGE_RETIREMENT,ACCOUNTING
nvidia-smi –q –l xxx
动态刷新信息,按Ctrl+C停止,可指定刷新频率,以秒为单位
nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version–format=csv
选择性查询选项,可以指定显示的属性选项。可查看的属性有:timestamp,driver_version,pci.bus,pcie.link.width.current等。(可查看nvidia-smi–help-query–gpu来查看有哪些属性)
- 设备修改选项
可以手动设置GPU卡设备的状态选项
命令
说明
nvidia-smi –pm 0/1
设置持久模式:0/DISABLED,1/ENABLED
nvidia-smi –e 0/1
切换ECC支持:0/DISABLED, 1/ENABLED
nvidia-smi –p 0/1
重置ECC错误计数:0/VOLATILE, 1/AGGREGATE
nvidia-smi –c
设置计算应用模式:0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
nvidia-smi –r
GPU复位
nvidia-smi –vm
设置GPU虚拟化模式
nvidia-smi –ac xxx,xxx
设置GPU运行的工作频率。e.g. nvidia-smi –ac2000,800
nvidia-smi –rac
将时钟频率重置为默认值
nvidia-smi –acp 0/1
切换-ac和-rac的权限要求,0/UNRESTRICTED, 1/RESTRICTED
nvidia-smi –pl
指定最大电源管理限制(瓦特)
nvidia-smi –am 0/1
启用或禁用计数模式,0/DISABLED,1/ENABLED
nvidia-smi –caa
清除缓冲区中的所有已记录PID,0/DISABLED,1/ENABLED
- nvidia-smi dmon
设备监控命令,以滚动条形式显示GPU设备统计信息。
GPU统计信息以一行的滚动格式显示,要监控的指标可以基于终端窗口的宽度进行调整。 监控最多4个GPU,如果没有指定任何GPU,则默认监控GPU0-GPU3(GPU索引从0开始)。
命令
说明
nvidia-smi dmon –i xxx
用逗号分隔GPU索引,PCI总线ID或UUID
nvidia-smi dmon –d xxx
指定刷新时间(默认为1秒)
nvidia-smi dmon –c xxx
显示指定数目的统计信息并退出
nvidia-smi dmon –o D/T
指定显示的时间格式D:YYYYMMDD,THH:MM:SS
nvidia-smi dmon –f xxx
将查询的信息输出到具体的文件中,不在终端显示
nvidia-smi dmon –s xxx
指定显示哪些监控指标(默认为puc),其中:
p:电源使用情况和温度(pwr:功耗,temp:温度)
u:GPU使用率(sm:流处理器,mem:显存,enc:编码资源,dec:解码资源)
c:GPU处理器和GPU内存时钟频率(mclk:显存频率,pclk:处理器频率)
v:电源和热力异常
m:FB内存和Bar1内存
e:ECC错误和PCIe重显错误个数
t:PCIe读写带宽
- nvidia-smi pmon
进程监控命令,以滚动条形式显示GPU进程状态信息。
GPU进程统计信息以一行的滚动格式显示,此工具列出了GPU所有进程的统计信息。要监控的指标可以基于终端窗口的宽度进行调整。 监控最多4个GPU,如果没有指定任何GPU,则默认监控GPU0-GPU3(GPU索引从0开始)。
命令
说明
nvidia-smi pmon –i xxx
用逗号分隔GPU索引,PCI总线ID或UUID
nvidia-smi pmon –d xxx
指定刷新时间(默认为1秒,最大为10秒)
nvidia-smi pmon –c xxx
显示指定数目的统计信息并退出
nvidia-smi pmon –o D/T
指定显示的时间格式D:YYYYMMDD,THH:MM:SS
nvidia-smi pmon –f xxx
将查询的信息输出到具体的文件中,不在终端显示
nvidia-smi pmon –s xxx
指定显示哪些监控指标(默认为u),其中:
3.5 shoc-master
The Scalable HeterOgeneous Computing (SHOC) 单双精度浮点型算力测试
基于 GEMM, FFT, and Stencil 等计算模式,综合 CUDA 与 OpenCL,MPI方式进行GPU算力计算 (兼容cuda 12之前版本)
https://github.com/vetter/shoc
1.安装
解压:unzip shoc-master.zip
cd shoc-master
./configure CUDA_CPPFLAGS="-gencode=arch=compute_
编译:make install -j 40
4090编译命令: ./configure CUDA_CPPFLAGS=“-gencode=arch=compute_89,code=sm_89” CXXFLAGS=" -g -O2 -L/usr/local/cuda/lib64 -lcudart -lcuda" --host=x86_64
40系列显卡是89,30系列显卡是86
如果报错找不到安装路径
locate libstdc++.so.6
cd /usr/lib64/
cp /usr/local/lib64/libstdc++.so.6.0.22 ./
ln -sf libstdc++.so.6.0.22 libstdc++.so.6
ldconfig
2.测试
设置睿频:performance:cpupower frequency-set -g performance
单卡:./bin/shocdriver -s 4 -cuda -d 0 > shoc_1card.log
4卡:./bin/shocdriver -s 4 -cuda -d 0 >>4R-0.log & ./bin/shocdriver -s 4 -cuda -d 1 >>4R-1.log & ./bin/shocdriver -s 4 -cuda -d 2 >>4R-2.log & ./bin/shocdriver -s 4 -cuda -d 3 >>4R-3.log
8卡:./bin/shocdriver -s 4 -cuda -d 0 >>8R-0.log & ./bin/shocdriver -s 4 -cuda -d 1 >>8R-1.log & ./bin/shocdriver -s 4 -cuda -d 2 >>8R-2.log & ./bin/shocdriver -s 4 -cuda -d 3 >>8R-3.log & ./bin/shocdriver -s 4 -cuda -d 4 >>8R-4.log & ./bin/shocdriver -s 4 -cuda -d 5 >>8R-5.log & ./bin/shocdriver -s 4 -cuda -d 6 >>8R-6.log & ./bin/shocdriver -s 4 -cuda -d 7 >>8R-7.log
-n:同时跑的节点数
-d:指定节点在哪个device上跑,多个显卡时用,隔开,如-d 0,1
-s:指定求解规模匹配具备大内存的 FirePro。
-cuda:用cuda来跑,-opencl:用opencl来跑
3.测试结果日志
3.6 cuda-samples
CUDA Samples
Samples for CUDA Developers which demonstrates features in CUDA Toolkit.
https://github.com/NVIDIA/cuda-samples/tree/master
1.Cuda-samples介绍
1.Simple Reference
基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.
2.Utilities Reference
演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。
3.Graphics Reference
图形化示例展现的是 CUDA, OpenGL, DirectX 之间的互通性
4.Imaging Reference
图像处理,压缩,和数据分析
5.Finance Reference
金融计算的并行处理
6.Simulations Reference
展现一些运用CUDA的模拟算法
7.Advanced Reference
用CUDA实现的一些先进的算法
8.Cudalibraries Reference
这类示例主要告诉我们该如何使用CUDA各种函数库(NPP, CUBLAS, CUFFT,CUSPARSE, and CURAND).
2.测试带宽 H2D\H2D
tar -zxvf cuda-samples-11.8.tar.gz
cd cuda-samples-11.8/Samples/1_Utilities/bandwidthTest/
make
单卡./bandwidthTest >> bandwidthTest.log
全卡./bandwidthTest -device=all >> bandwidthTest_all.log
Bandwidth测试—P2P Bandwidth
cd /cuda-samples-12.2/Samples/5_Domain_Specific/p2pBandwidthLatencyTest/
make
./ p2pBandwidthLatencyTest
H800参考值:400GB/s,达到80%即可
H100参考值:900GB/s,达到80%即可
查看结果:Bidirectional P2P=Enabled Bandwidth Matrix (GB/s)
Unidirectional P2P=Enabled Bandwidth Matrix (GB/s)
P2P=Disabled Latency Matrix (GB/s)
./ p2pBandwidthLatencyTest --device=0 指定卡测试指令device取值0,1,2,3,4,5,6,7,8
测试日志
3.7 gpu_burn压测
多 GPU CUDA 压力测试
https://github.com/wilicc/gpu-burn
1.压测前清日志
ipmitool sel clear
dmesg -C
echo > /var/log/mcelog
echo > /var/log/messages
dmesg -c > /dev/null && dmesg -w
2.测试
unzip gpu-burn-master.zip
cd gpu-burn-master/
make
执行gpuburn:
./gpu_burn 14400
三天:./gpu_burn 259200
压测一周命令:nohup ./gpu_burn 604800 &
抓取GPU压测温度功耗:nvidia-smi -l 10 --format=csv --filename=report.csv --query-gpu=timestamp,name,temperature.gpu,power.draw
GPU查看日志结果温度信息,需要低于nvidia-smi -q显示的“Max Operating Temp”;如果无Max Operating Temp显示则定90度
同时跑上fio和linpack iperf压测
功耗日志文件
查看系统日志有无报错
cat /var/log/messages | grep -iE “error|fail|warn”
dmesg | grep -iE “error|fail|warn”
测试结果整理出功耗温度频率折线图
3.8 stream_vectorized_double_test
NVIDIA提供的基于CUDA优化的STREAM测试工具,测试单个GPU的显存带宽。
https://www.cs.virginia.edu/stream/
显存吞吐测试
#解压GPU_stream_test.zip,然后增加可执行权限
chmod a+x stream_test
执行
./stream_test
3.9 Peak TOPS
NVIDIA提供的算力测试工具,tensor实现 FP8,INT8,FP16,BF16,TF32;FFMA 实现FP32。(只兼容hoper架构)
解压工具后:里面有run_hopper.bash和peakTOPS两个文件
更改run_hopper.bash文件中的NUM_SMs值为132/114/78(H100为132,H800为114,H20为78):
在peakTOPS目录里chmod +x *,然后./run_hopper.bash
单精度取值:FP32 FFMA下面的MMA throughput,如下图:
实测结果所有8张卡不能低于参考结果95%
测试脚本
echo “INT8”
./peakTOPS -mma igmma6425632_s8s8s32 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “FP8”
#./peakTOPS -mma qgmma6425632_e4m3e4m3fp16 -ctas {RUN_ITERS} ${ZEROGEMM}
./peakTOPS -mma qgmma6425632_e5m2e5m2fp16 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “FP16”
./peakTOPS -mma hgmma6425616_fp16fp16fp16 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “BF16”
./peakTOPS -mma hgmma6425616_bf16bf16fp32 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “TF32”
./peakTOPS -mma hgmma642568_tf32tf32fp32 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “FP64”
./peakTOPS -mma dmma1688_fp64fp64fp64 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “FP32 FFMA”
./peakTOPS -mma ffma_fp32fp32fp32 -ctas {RUN_ITERS} ${ZEROGEMM}
echo “FP64 DFMA”
./peakTOPS -mma dfma_fp64fp64fp64 -ctas {RUN_ITERS} ${ZEROGEMM}
测试结果 H100 SXM5
FP64:67.089134 TFlops
FP32:65.810593 TFlops
TF32:499.496979 TFlops
FP16:949.537659 TFlops
BF16:969.626343 TFlops
FP8:1915.741333 TFlops
INT8:2000.280884 TFlops
3.10 NVIDIA Field Diagnostic -fld
A和H用不同版本的工具
https://docs.nvidia.com/deploy/hw-field-diag/index.html
NVIDIA硬件诊断工具,确认 GPU 的数字处理能力、数据传输完整性以及对 CUDA 程序可用的全部内存地址空间进行测试覆盖。当运行诊断时,它会在屏幕上显示测试进度,格式如下:
“Running test X on GPU n - Y tests remaining |======= | Z %”
其中 X 是当前测试序号,n 是 GPU 编号,Y 是剩余测试数量,Z 是整体完成百分比17。
完成测试后,如果一切正常,诊断工具将返回 0 到 shell;如果出现错误,将返回 1;如果需要重测,则返回 2。同时,它还会在屏幕上打印“PASS”、“FAIL”或“RETEST”
通过的板卡日志文件名:“fieldiag_PASS_1234567.log”。
失败的板卡日志文件名:“fieldiag_FAIL_1234567.log”。
初始 SKU 配置失败的板卡日志文件名:“fieldiag_CONFIG_1234567.log”17
在运行 Field Diagnostics 之前,确保 NVIDIA 内核模块没有加载,以避免系统不稳定。为此,可能需要先pkill Xorg
yum install perl-Digest-SHA redhat-lsb.x86_64 tmux -y
wget 10.64.13.109/lihai/lh.TGZ
测试前后抓取lspci -vvv log
cd 629-24287-XXXX-FLD-39790/
./fieldiag.sh --no_bmc
大概一个半小时左右
测试日志
进行 Fieldiag 测试后,在 log 目录下查看结果日志中的 run.log 文件。
如图 所示,其中不同的 SN 总数为 7,可以根据文件中的 SN 号与实际 GPU 上的 SN 号对应。其中,可以在文件中找到 SN 的 GPU,是无故障 GPU;无法在文件中找到的那个 GPU,即为有故障的 GPU。
3.11 CUDA-Z
windows下使用GPU-Z,linux下使用CUDA-Z
3.11.1 linux 下使用CUDA-Z
整形和浮点的计算性能(如果支持FP32也会显示),显存容量和带宽。
https://cuda-z.sourceforge.net/
下载:https://sourceforge.net/projects/cuda-z/
下载后得到文件CUDA-Z-0.10.251-64bit.run
linux下需要先安装Xmanager
https://www.123pan.com/s/yYD5Vv-Bt7Vv.html
CUDA-Z-0.10.251-64bit.run是个绿色程序,添加可执行属性后直接运行即可,界面如下:
chmod 777 CUDA-Z-0.10.251-64bit.run
./CUDA-Z-0.10.251-64bit.run
3.11.2 Windows下的GPU-Z
下载:https://www.techpowerup.com/gpuz/
GPU-Z是一款显卡识别工具,绿色免安装(可选安装),界面直观,运行后即可显示GPU核心,以及运行频率、带宽、传感器信息等。
1.检测显卡GPU型号、步进、制造工艺、核心面积、晶体管数量,渲染器数量及生产厂商。
2.检测光栅和着色器处理单元数量及DirectX支持版本。
3.检测GPU核心、着色器和显存运行频率,显存类型(生产厂商)、大小及带宽。
4.检测像素填充率和材质填充率速度。
5.实时检测GPU温度、GPU/视频引擎使用率、显存使用率及风扇转速等相关信息。
6.检查显卡插槽类型和显卡所支持的附加功能与显卡驱动信息及系统版本。
7.显卡功率以及CPU温度等系统信息显示。
8.高级界面提供了详细的显卡系统信息、以及支持的编程接口(DirectX,Vulkan,OpenGL等)特性。
3.12 cublasMatmulBench
NVIDIA CUDA Basic Linear Algebra (cuBLAS) 库提供,用于测试单个GPU的general matrix multiplication (GEMM)性能
https://developer.nvidia.com/cublas
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/hpc-sdk/rhel/nvhpc.repo
$ sudo yum install -y nvhpc-24.5
官方测试case
#FP8 - 官方case
root@vng1:~# ./cublasMatmulBench -P=qqssq -m=4224 -n=2048 -k=16384 -T=1000 -ta=1 -B=0
testing cublasLt
args: ta=T tb=N m=4224 n=2048 k=16384 alpha = (0x3f800000, 1) beta= (0x00000000, 0)
args: lda=16384 ldb=16384 ldc=4224 ldd=4224 loop=1000
^^^^ gpu time statistics: runs 1000, mean 0.199977 ms, min 0.181056 ms, 20 percent 0.189856 ms, 50 percent 0.203680 ms, max 0.210592 ms
^^^^ CUDA : elapsed = 0.199977 sec, Gflops = 1417502.374
testing cublasLt pass
#INT8 - 官方case
root@vng1:~# ./cublasMatmulBench -P=bisb_imma -m=8192 -n=4224 -k=16384 -T=1000 -ta=1 -B=0
testing cublasLt
args: ta=T tb=N m=8192 n=4224 k=16384 alpha = (0x3f800000, 1) beta= (0x00000000, 0)
args: lda=16384 ldb=16384 ldc=8192 ldd=8192 loop=1000
^^^^ gpu time statistics: runs 1000, mean 0.735690 ms, min 0.645536 ms, 20 percent 0.736160 ms, 50 percent 0.740032 ms, max 0.761184 ms
^^^^ CUDA : elapsed = 0.73569 sec, Gflops = 1541234.778
testing cublasLt pass
FP16 - 官方case
root@vng1:~# ./cublasMatmulBench -P=hsh -m=12288 -n=9216 -k=32768 -T=1000 -tb=1 -B=0
testing cublasLt
args: ta=N tb=T m=12288 n=9216 k=32768 alpha = (0x3f800000, 1) beta= (0x00000000, 0)
args: lda=12288 ldb=9216 ldc=12288 ldd=12288 loop=1000
^^^^ gpu time statistics: runs 1000, mean 9.994215 ms, min 8.794272 ms, 20 percent 9.910592 ms, 50 percent 9.978304 ms, max 10.794752 ms
^^^^ CUDA : elapsed = 9.99422 sec, Gflops = 742599.941
testing cublasLt pass
TF32 - 官方case
root@vng1:~# ./cublasMatmulBench -P=sss_fast_tf32 -m=8192 -n=4224 -k=16384 -T=1000 -ta=1 -B=0
testing cublasLt
args: ta=T tb=N m=8192 n=4224 k=16384 alpha = (0x3f800000, 1) beta= (0x00000000, 0)
args: lda=16384 ldb=16384 ldc=8192 ldd=8192 loop=1000
^^^^ gpu time statistics: runs 1000, mean 2.552519 ms, min 2.399168 ms, 20 percent 2.521568 ms, 50 percent 2.525344 ms, max 2.845216 ms
^^^^ CUDA : elapsed = 2.55252 sec, Gflops = 444216.663
testing cublasLt pass
FP64 - 官方case
root@vng1:~# ./cublasMatmulBench -P=ddd -m=4224 -n=2048 -k=16384 -T=1000 -tb=1 -B=0
testing cublasLt
args: ta=N tb=T m=4224 n=2048 k=16384 alpha = (0x3ff0000000000000, 1) beta= (0x0000000000000000, 0)
args: lda=4224 ldb=2048 ldc=4224 ldd=4224 loop=1000
^^^^ gpu time statistics: runs 1000, mean 4.304164 ms, min 4.302112 ms, 20 percent 4.303392 ms, 50 percent 4.304160 ms, max 4.336928 ms
^^^^ CUDA : elapsed = 4.30416 sec, Gflops = 65858.985
testing cublasLt pass
测试
root@vng1:~# ./cublasMatmulBench -P=ddd -m=8192 -n=4224 -k=16384 -T=1000 -tb=1 -B=0
testing cublasLt
args: ta=N tb=T m=8192 n=4224 k=16384 alpha = (0x3ff0000000000000, 1) beta= (0x0000000000000000, 0)
args: lda=8192 ldb=4224 ldc=8192 ldd=8192 loop=1000
^^^^ gpu time statistics: runs 1000, mean 24.665437 ms, min 23.381697 ms, 20 percent 24.499647 ms, 50 percent 24.691584 ms, max 25.215391 ms
^^^^ CUDA : elapsed = 24.6654 sec, Gflops = 45970.049
testing cublasLt pass
结果日志
H20矩阵乘(GEMM)算力测试指令
INT8: ./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
3.13 nvbandwidth
nvbandwidth 是一个用于测量 NVIDIA GPU 带宽的工具,它能够测量不同链接上各种 memcpy 模式下的带宽。以下是如何解读 nvbandwidth 测试结果的一些步骤和提示:测量不同链接上使用复制引擎或内核复制方法的各种memcpy模式的带宽。
测试结果会显示不同测试案例的带宽数值,通常以 GB/s(千兆字节每秒)为单位。
单向测试(如 host_to_device_memcpy_ce)测量从 CPU 到 GPU 的带宽,
双向测试(如 host_to_device_bidirectional_memcpy_ce)同时测量两个方向上的带宽
–bufferSize 可以设置内存复制的缓冲区大小,–testSamples 可以设置测试的迭代次数,–useMean 可以选择使用平均值代替中位数来报告结果。 --testSamples 选项来覆盖重复次数
Commands to Run Test: sudo ./debian_install.sh make $ ./nvbandwidth
nvbandwidth 的常用参数及其说明31:
-h, --help: 显示帮助信息。
-b, --bufferSize arg (默认值=64): 设置 memcpy 缓冲区大小,单位为 MiB。
-l, --list: 列出所有可用的测试用例。
-t, --testcase arg: 运行指定的测试用例(通过名称或索引)。
-v, --verbose: 输出详细信息。
-s, --skipVerification: 跳过复制后的数据验证。
-d, --disableAffinity: 禁用自动 CPU 亲和性控制。
-i, --testSamples arg (默认值=3): 设置基准测试的迭代次数。
-m, --useMean: 使用算术平均值而非中位数作为结果。
2.12 NCCL测试
实测centos8.5
1.安装openmpi-4.1.5
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz
tar -zxf openmpi-4.1.5.tar.gz
mkdir openmpi-4.1.5/build
cd openmpi-4.1.5/build
如果是容器环境,建议放置在默认目录,非容器,建议单独目录,通过环境变量进行引用
…/configure
make -j all
make install
ldconfig
mpirun --version
2.安装nccl-rdma-sharp-plugins-master
git clone https://github.com/Mellanox/nccl-rdma-sharp-plugins
cd nccl-rdma-sharp-plugins-master/
./autogen.sh
./configure --with-cuda=/usr/local/cuda
make
make install
ldconfig
3.安装nccl-master
通过apt源进⾏安装,可确认版本
apt-cache show libnccl2 # 查找匹配的Nccl包
apt install libnccl2=cuda** #安装指定版本包
或者通过官⽅git安装,不太好判断版本,需要运⾏起之后知道
git clone https://github.com/NVIDIA/nccl
cd nccl-master
make -j src.build
#如果是容器环境,推荐放置默认⽬录,执⾏make install会默认安装⾄/usr/local/lib下。 make CC=指定编译路径
因为是容器,执⾏更新,可⾃⾏调整
make install
ldconfig # 更新动态库
4.安装nccl-tests-master
#通过git直接clone,或者下载源码包拷贝
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests-master
#mpi_home,指定至include上一层目录即可,如果是默认安装,可忽略
#cuda_home,指定至cuda顶层目录即可,如果默认安装,可忽略
nccl_home, 指定至nccl build目录即可,如果默认安装,可忽略
make MPI_HOME=/root/zhangli17/nccl/openmpi-4.1.5 CUDA_HOME=/usr/local/cuda NCCL_HOME=/root/zhangli17/nccl/nccl-master/build
5.安装nvidia-fabric-manager
https://developer.download.nvidia.cn/compute/cuda/repos/rhel8/x86_64/
查看driver版本
下载安装与系统同版本fabric-manager
rpm -ivh nvidia-fabric-manager-devel-535.154.05-1.x86_64.rpm
rpm -ivh nvidia-fabric-manager-535.154.05-1.x86_64.rpm
systemctl start nvidia-fabricmanager.service
systemctl status nvidia-fabricmanager.service
如果显示fail重启机器看看
6.测试指令
使用编译好的测试程序来评估不同的集合通信操作的性能。例如,运行 all-reduce 性能测试:
设置一下环境:LD_LIBRARY_PATH=/root/zhangli17/nccl/nccl-master/build/lib/
./build/all_reduce_perf -b 8 -e 256M -f 2 -g
./build/all_reduce_perf -b 8M -e 8G -f 2 -g 8 #单机性能测试
这里 -b 指定最小数据量,-e 指定最大数据量,-f 指定数据量增长的倍数,-g 指定 GPU 数量。
如果使用 MPI 环境,可以通过 mpirun 命令启动测试:
mpirun -np
mpirun -np 32 --allow-run-as-root ./all_reduce_perf -b 8M -e 256M -f 2 -g 8
压测指令:./all_reduce_perf -b 512M -e 4G -g 8
这里 -np 指定进程数节点数,< num processes > 应与总 GPU 数量匹配,-g 1 表示每个进程使用一张 GPU。
all_gather_perf:测试 all-gather 操作的性能。
all_reduce_perf:测试 all-reduce 操作的性能。
alltoall_perf:测试 all-to-all 操作的性能。
broadcast_perf:测试 broadcast 操作的性能。
gather_perf:测试 gather 操作的性能。
reduce_perf:测试 reduce 操作的性能。
reduce_scatter_perf:测试 reduce-scatter 操作的性能。
scatter_perf:测试 scatter 操作的性能。
在nccl-test常用命令:
#所在GPU单机进行 all_reduce 性能测试
./build/all_reduce_perf -b 8 -e 8192M -f 2 -g 8
#多机多进程进群测试命令(未使用SHARP方式) 方式1:IP方式
mpirun --allow-run-as-root -x NCCL_NET_GDR_READ=1 -x NCCL_DEBUG_SUBSYS=GRAPH -x NCCL_IB_HCA=mlx5_0,mlx5_1 -x NCCL_IB_DISABLE=0 --allow-run-as-root -x NCCL_ALGO=RING --host 10.12.38.32,10.12.37.135 -np 2 ./build/all_reduce_perf -b 2048M -e 4096M -f 2 -g 8
#多机多进程进群测试命令 (未使用SHARP方式)方式1:hostsfile方式:
mpirun --allow-run-as-root -npernode 8 -hostfile abc(本路径文件) -x NCCL_SOCKET_IFNAME=bond0 -x ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 -t 1 -n 20
#多机多进程集群测试命令:(使用SHARP方式)
mpirun --allow-run-as-root -npernode 8 -hostfile abc(本路径文件) -x NCCL_SOCKET_IFNAME=bond0 -x NCCL_COLLNET_ENABLE=1 -x ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 -t 1 -n 20
H200 nccl测试结果
7.nccl测试性能调优
对性能有影响的主要方面:训练框架,nccl设置,rdma网络设置,网卡设置
1.网络开启pfc流控:
RDMA网络对丢包是极其敏感的,丢包会导致网络性能大幅下降。
所以咱们要实现参数面网络为无损网络(不丢包),就得开启PFC流控策略。这需要网络的所有环节全部开启pfc,即:源服务器网口,交换机入口,交换机出口,目的服务器网口。
2.设置合适的 buffer_size 大小
开启pfc后,就受到网口缓存的影响,即:当接收缓存快满了,就会发出“请暂停发包”的pfc帧通知发送方,来暂缓发包。所以我们可以尽量将网络上各个环节的网口缓存调大一些。
以下是服务器网卡相关的:
查询buffer_size
cat /sys/class/net/enp80s0f0/qos/buffer_size
Port buffer size = 1027728
Spare buffer size = 851616
Buffer Size xoff_threshold xon_threshold
0 20016 0 0
1 156096 86976 66960
可以看到,总共有8个buffer,分别对应8个优先级队列。(注:xoff阈值那列,下文会讲)
缓存跟优先级队列对应齐关系:
cat /sys/class/net/enp106s0f0/qos/prio2buffer
Priority Buffer
可以看到,咱们是队列4开启的pfc,队列4对应buffer缓存是1. 而1的空间是156096字节。咱们增大队列4对应的缓存空间就行:
修改网卡队列4的 buffer_size:(这里我通过不断增大第2个参数,来逼近“最大值”。最大buffer取决于具体的硬件型号和驱动程序版本)
echo 20016,589823,0,0,0,0,0,0 > /sys/class/net/enp106s0f0/qos/buffer_size
如:
按理,调大对带宽保持高利用率是有好处的。
3.设置合适的MTU(最大传输单元)
最大传输单元(Maximum Transmission Unit)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。我们在使用互联网时进行的各种网络操作,都是通过一个又一个“数据包”传输来实现的。而MTU指定了网络中可传输数据包的最大尺寸,在我们常用的以太网中,MTU默认是1500字节,超过此大小的数据包就会将多余的部分拆分再单独传输,我们知道网卡发出去的单个报文越大,带宽利用率可以更高。但是RoCE网卡的发出报文实际MTU是受到2个因素影响:
RoCE的MTU可选的值有:256, 512, 1024, 2048 or 4096 bytes. (2^N 次)
但同时,又必须小于网卡设置的MTU。(即:2^N = 最终值 < 接口MTU)
所以网卡设置的MTU推荐如下:
为了使用MTU为4096 - 配置网卡MTU为4200
为了使用MTU为2048 - 配置网卡MTU为2200
临时修改
可以通过类似如下命令,临时修改本地特定网卡的MTU,但修改后重启将失效。
ifconfig ib0 mtu 65520 #将ib0网卡的MTU参数修改为65520
永久修改
可以通过类似如下命令,永久修改本地特定网卡的MTU,但是修改后需要重启网卡生效。
通过vim /etc/sysconfig/network-scripts/ifcfg-ib0命令,打开网卡参数文件,并添加MTU=65520条目;
通过service network restart命令,重启网卡服务使参数生效。
合理的设置MTU值,就是让本地的MTU值与网络的MTU值一致,既能完整发挥传输性能,又不让数据包拆分。网卡本身没有必要置过大的MTU。比如设置为9000,会浪费内存(因为实际生效是4096,所以网卡MTU其实4200就够了)。
查询网卡实际生效的MTU值:
/root # ibv_devinfo -d mlx5_0
hca_id: mlx5_0
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 4096 (5)
/root # ifconfig ib1 #查看网口mtu值
4.设置合适的网线长度
依然是pfc流控相关的。我们知道,缓存空间“快满”时,会发“别再发啦”的通知帧。那到底什么是“快满”了呢?
Xon/Xoff就是表示,触发「满」到「空闲」的值。如果能调大 Xoff值,就可以接收更多的数据,从而延缓发送“暂停发包”的pause帧。
然而,Xoff阈值,并不能单独配置(不是一个百分之多少的参数)。而是根据“网线长度,网卡速率,MTU大小”相关的公式算出来的。
如下:
xoff = ((301+2.16 * len [m]) * max(speed [Gbps], 40Gbps) + 2.72 MTU [B])
xoff_threshold = buffer size - xoff
xon_threshold = xoff_threshold - 9216
由第一行可以看出:
网线长度越小,就可以使得xoff越小,然后xoff阈值更大 ==》可以收更多的报文,更迟的触发pause帧。
所以,设置正确的网线长度,也可以影响性能。
查询网线信息:
mst cable add
mlxcables -d xx
设置:
mlnx_qos -i ens1f0 --cable_len 10
(默认值是7米。可以根据实际机房情况,选购稍微短一点的网线长度,或者故意将此值设置的比真实网线小一点,来忽悠驱动放大xoff阈值,使得缓存可以接收更多的报文)
5.交换机侧调优
- PFC调优
pfc除了服务器测,交换机侧也同样重要。同样是“缓存空间”相关的参数为主:
设置合适的 alpha 值
设置合适的缓冲区大小,Cells
如果是双网卡聚合(Bond)口,设置合适的hash分担策略
例如:
dcb pfc buffer 4 xoff dynamic 4 hdrm 3000 cells
- 路由均衡
由于CLOS网络连接的拓扑,我们不希望所有服务器的报文全部压到同一台交换机的某个口上面。最好是均匀的分散到所有交换机上。
所以,这里需要合理的分配服务器网卡的IP地址+网段。一般要求,网段和IP要在不同的服务器间均衡的错开。
6.NCCL参数调整
在RDMA网络配置已经设置好的情况下(一般网络管理员都配置好了,咱们没法参与修改),那咱们就通过NCCL相关参数来调优:
- 网卡配置
前面辛辛苦苦设置好参数面网络中,队列4开启PFC流控策略,那么我们就得确保我们的报文,都是匹配队列4的。所以这些参数需要设置:
NCCL_IB_TC=128
指定报文Traffic Class类似,以便使用pfc队列4。
NCCL_IB_HCA=mlx5
前缀匹配,指定需要使用的RoCE网卡。
NCCL_IB_GID_INDEX=3
默认值0,这里必须设置为3。 0和1表示ipv6的。 2和3才是ipv4。
2表示使用 RoCE V1协议,3表示使用RoCE V2协议。所以我们这里要选3。
- 性能配置
在pfc流控参数设置好后,接下里就是NCCL调优了。以下是收集的可能影响NCCL性能的参数,仅供参考:
NCCL_IB_RETRY_CNT=15 #默认值7,可以适当调大,以规避偶尔出现的异常。
NCCL_IB_TIMEOUT=18 #可选1-22,默认值18, 2.14版本前默认 14。好像我们主要调上个参数(RETRY次数),这个超时时间没怎么调,自己测试看看吧。
NCCL_IB_QPS_PER_CONNECTION=8 #默认值1, 不少地方推荐4
NCCL_IB_SPLIT_DATA_ON_QPS=0 #默认1
NCCL_BUFFSIZE #默认4M
NCCL_IB_AR_THRESHOLD=5242880 #AR功能,还没有怎么研究,具体效果需要自己验证。
NCCL_MAX_NCHANNELS #大于32
NCCL_NET_GDR_LEVEL=2 #该参数会根据环境自动确定,你也可以根据DEBUG信息,主动设置。
剩下两个是Socket相关的,影响较小(RDMA通信前的“握手”信息),但是蚊子腿也是肉。
NCCL_SOCKET_NTHREADS=4 #默认值1,官网说100G网络,该值可以设为4
NCCL_NSOCKS_PERTHREAD=4 #默认值1,官网说100G网络,该值可以设为4
- 集合通信算法
除了上面的参数,还有个集合通信算法,也会有影响:
NCCL_ALGO=Tree
NCCL_ALGO=RING
3.14 batchCUBLAS
Batch CUBLAS(CUDA Basic Linear Algebra Subprograms)测试是用于评估 NVIDIA GPU 在执行线性代数运算时的性能的工具。CUBLAS 是 NVIDIA 提供的一个库,它实现了在 GPU 上运行的基本线性代数运算,比如矩阵乘法、向量点乘等。
https://github.com/NVIDIA/cuda-samples/blob/master/Samples/4_CUDA_Libraries/batchCUBLAS
理论峰值= GPU芯片数量GPU Boost主频核心数量*单个时钟周期内能处理的浮点计算次数
双精度理论峰值= FP64 Cores * GPU Boost Clock * 2
= 1792 *1.48GHz*2 = 5.3 TFlops
H800单精度测试工具: batchCUBLAS
batchCUBLAS位于cuda-samples-12.2/Samples/4_CUDA_Libraries/batchCUBLAS
make SMS=“90 90”#编译,会生成batchCUBLAS 可执行文件。 #90 90 是H100,其他型号根据情况调整
export CUDA_VISIBLE_DEVICES=0
./batchCUBLAS -m16384 -n16384 -k16384 #默认跑10次矩阵乘法计算。
也可以用export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
然后./batchCUBLAS -m16384 -n16384 -k16384 -device=0 #写相应的GPU ID号即可
batchCUBLAS参数:
mnk:矩阵大小 取值2的n次方,可调优参数
N:乘法的次数
device:所测GPU的ID号
查看Running N=10 with streams里面的值,sgemm为单精度浮点型的结果,dgemm为双精度浮点型的结果
测试类型:结果会指明进行的是哪种类型的线性代数运算,例如 SGESV(单精度浮点数的线性系统求解)、DGESV(双精度浮点数的线性系统求解)、SGEMM(单精度浮点数的矩阵乘法)等。
矩阵维度:对于矩阵运算,结果会显示矩阵的行数和列数。
FLOPS:每秒浮点运算次数,衡量 GPU 性能的一个关键指标。对于线性代数运算,通常会报告 TFLOPS(每秒万亿次浮点运算)。
带宽:数据传输速率,通常以 GB/s(千兆字节每秒)为单位。对于矩阵运算,带宽是衡量数据传输效率的重要指标。
执行时间:完成测试所需的实际时间,通常以秒或毫秒为单位。
性能指标:测试结果可能会包括一些性能指标,如 GFLOPS/s(每秒十亿次浮点运算)或 GFLOPS/W(每瓦特的浮点运算次数)。
矩阵维度:-N、-M、-K:指定矩阵的维度。例如,-N 1024 设置矩阵 A 的维度为 1024xK。
矩阵数据类型:–datatype:指定矩阵数据类型,如 float(float)、double(double)、complex float(cuComplex)等。
测试批次大小:–batch:指定测试的批次大小,即连续运行的测试次数。
测试重复次数:–repeats:指定每个测试重复的次数。
使用的 GPU:–gpu:指定使用哪个 GPU 进行测试。
内存对齐:–align:指定内存对齐的字节数。
CUDA 流:–stream:指定使用的 CUDA 流。
–lda、–ldb、–ldc:指定矩阵 A、B 和 C 的领先维度。
矩阵初始化:–init:指定矩阵初始化模式,例如使用单位矩阵或随机数。
性能输出:–performance:输出性能结果,如 GFLOPS。
错误检查:–check:在测试完成后检查错误。
使用 cuBLAS API:–api:指定使用的 cuBLAS API,例如 v2 或 v3。
使用 Tensor Cores:–tensorOp:指定是否使用 Tensor Cores 进行计算,适用于支持的 GPU。
3.15 Unixbench测试
Unixbench 是一个基准测试工具,它通过一系列测试来评估 Unix 系统的性能。Unixbench 测试套件包括对 CPU、内存、磁盘 I/O、系统调用等的测试。maxCopies 是 Unixbench 中的一个参数,它用于控制测试中数据复制的最大次数。
https://soft.lnmp.com/test/unixbench/
把Unixbench-5.1.3.tar.gz工具拷贝到系统目录下
解压tar -zxvf UnixBench-5.1. 3.tar.gz
make clean (清除上次的make命令所产生的后缀为“.o”的object文件及可执行文件)
cd results
rm -rf *运行测试前清除系统下log和工具results目录下的文件
yum install -y libgl1-mesa-dev libx11-dev
修改Run.sh文件,将’maxCopies’ => 16 ,改为’maxCopies’ => n (n指实际CPU最大核数)
单线程、多线程一起跑:./Run –c 1 –c n (将n替换为实际核数)
centos 8.5使用此工具,需要安装perl-Time-HiRes.x86_64(本地cdrom包含)
./Run #执行整机单核性能测试 ./Run -c n #n代表着测试设备的核心数 ./Run graphics #执行2D单核性能测试 ./Run graphics -c n#执行2D多核性能测试
测试结果日志
时间(Time):每个测试的运行时间,单位通常是秒。较短的时间通常表示更好的性能。
性能指标(Performance Index):UnixBench 会为每个测试提供一个性能指标,通常是通过将运行时间转换为一个相对值来表示。这个值越高,表示性能越好。
系统调用(System Call)测试:测试系统调用的性能,如 open、close、read 和 write 等。
CPU 测试:包括 pi(计算 π 的值)、whetstone(执行一系列算术运算)等。
内存测试:如 dhrystone 和 perlbench,测试内存访问和处理速度。
字符串处理和正则表达式:例如 regex 测试,评估字符串处理能力。
文件系统测试:如 execl、pipe 等,测试文件系统操作的性能。
I/O 测试:包括 filecopy 和 sysfile 等,评估磁盘 I/O 性能。
整体评分:UnixBench 会计算一个整体的评分,这个评分是基于所有测试结果的综合评估。
system benchmarks index score总分是基于每个子测试的分数加权平均计算得出的,其中每个子测试的分数通过原始测试结果和预设的基准值计算得出,使用的公式是 score = exp(product / 2),其中product是原始测试结果和基准值的乘积
3.16 perftest
perftest是一组基于uverbs编写的测试程序,是RDMA性能相关的benchmark。可用于软硬件调优以及功能测试。可以测试gpu到ib链路使用 ib_write_bw 和 ib_write_lat 来测试 RDMA 写入的带宽和延迟
https://github.com/linux-rdma/perftest
解压tar -zxvf perftest-24.04.0-0.41.gd1b3607.tar.gz
cd perftest/
./autogen.sh && ./configure CUDA_H_PATH=
./configure CUDA_H_PATH=/usr/local/cuda-11.8/targets/x86_64-linux/include/cuda.h
yum install -y pciutils-devel
make
安装
yum install -y install perftest
测试
使用编译好的 perftest 工具来运行测试。例如,使用以下命令可以测试 RDMA 写入带宽:
./ib_write_bw -d
其中 是你的 InfiniBand 设备名称, 是你想要使用的 GPU 索引。
./ib_send_bw -d mlx5_0 --use_cuda=0 -a
./ib_send_bw -d mlx5_0 --use_cuda=0 -a 127.0.0.1
服务端:ib_send_bw -d rxe_0
客户端:ib_send_bw -d rxe_0 <server_ip>
设置mtu
ifconfig ens33 mtu 4200
查看网卡端口ibstat -> CA ‘mlx5_0’
查看GPU号 nvidia-smi -> 0,1,2,3
3.17 DCGM实现GPU的性能分析
1.DCGM介绍
dcgmi 是 Nvidia datacenter-gpu-manager 的命令行程序,可以用来采集 GPU 各类子资源的利用率数据,揭示的数据比 nvidia-smi 更详细,也更便于对接监控系统(比如 Prometheus)。主要可用它来看模型训练过程中的 NVLink 带宽使用情况。NVIDIA GPU上存在一些硬件计数器,这些计数器可以用来收集一些设备级别的性能指标,例如GPU利用率、内存使用情况等。借助NVIDIA提供的NVML(NVIDIA Management Library)库或DCGM(Data Center GPU Manager)工具能够查询这些硬件层提供的指标。NVIDIA Data Center GPU Manager (DCGM) 是一套用于管理和监控数据中心 NVIDIA GPU 的工具集。
DCGM: nvidia data center gpu manager是一套用于在集群环境中管理和监控 NVIDIA 数据中心 GPU 的工具。它包括主动健康监控、全面诊断、系统警报和治理策略(包括电源和时钟管理)。 DCGM 诊断是一款运行状况检查工具,可以检查基本的 GPU 运行状况,包括是否存在 ECC 错误、PCIe 问题、带宽问题以及运行 CUDA 程序的常见问题。
NVML的操作命令是nvidia-smi,DCGM的操作命令为dcgmi。安装驱动后,一般会自带nvidia-smi。而dcgmi需要单独安装。
NVML是对GPU硬件的监控,可以查看GPU的温度、功率、风扇等信息。
而DCGM更倾向于对集群的监控管理,可以健康检查、配置策略、与k8s之类的工具集成。
预置环境
如果服务器上有 NVSwitch,比如 A100/800,或者部分 V100,需要先安装 nvidia-fabric-manager,注意 nvidia-fabric-manager 的版本要和 GPU 驱动版本严格一致,包括小版本号(nvidia-smi 显示的驱动版本)。
如果服务器上有 NVSwitch,还需要安装 libnvidia-nscq,版本也要和驱动严格一致
DCGM支持多种GPU型号,包括:
所有Kepler(K80)及更新的NVIDIA数据中心(之前称为Tesla)GPU 5
NVSwitch上的DGX A100、HGX A100及更新版本
所有Maxwell及更新的非数据中心GPU(例如GeForce或Quadro)
CUDA 7.5及以上版本和NVIDIA驱动R450及以上版本
裸机和虚拟化环境(仅限全通道直通)
2.安装DCGM
a.下载安装包安装
NVML:https://developer.nvidia.com/nvidia-management-library-nvml
DCGM:https://developer.nvidia.com/dcgm
下载:https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/
安装 rpm -ivh datacenter-gpu-manager-3.3.6-1-x86_64.rpm
启动服务systemctl --now enable nvidia-dcgm
启用并启动 nvidia-fabricmanager
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
查看安装成功dcgmi -v
b.或者网络仓库安装 DCGM:
DCGM 可以通过 CUDA 网络仓库直接安装。例如,在 Ubuntu LTS 系统上,可以设置 CUDA 网络仓库元数据和 GPG 密钥,然后安装 DCGM310。
Ubuntu 20.04 on x86_64:
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb
$ sudo add-apt-repository “deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /”
$ sudo apt-get update && sudo apt-get install -y datacenter-gpu-manager
Red Hat
$ sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
$ sudo dnf clean expire-cache && sudo dnf install -y datacenter-gpu-manager
$ sudo systemctl --now enable nvidia-dcgm
3.DCGM功能介绍
监控 GPU 健康状态:DCGM 提供了低开销、非侵入式的健康监控,可以在作业运行时监控 GPU 状态,而不会影响应用程序的行为和性能
集成管理生态系统:DCGM 可以轻松部署在 Kubernetes 集群环境中,并与各种 ISV 解决方案(如 Bright Cluster Manager、IBM Spectrum LSF)以及开源工具(如 Prometheus、collectd)集成310。
使用 DCGM API:DCGM 提供了 C、Python 和 Go 等语言的 API 绑定,可以通过这些 API 收集 GPU 遥测数据310。
监控 GPU 利用率:DCGM 可以监控 GPU 的利用率,包括张量核心、FP64 单元等关键指标313。
内存和互连流量指标:DCGM 还提供了内存和互连流量的监控指标,帮助用户了解 GPU 的资源使用情况313。
集成 Kubernetes 生态系统:DCGM 通过 dcgm-exporter 与 Kubernetes 生态系统集成,允许用户在容器化环境中收集 GPU 遥测数据313。
安装和配置 Prometheus:使用 Helm 安装 Prometheus Operator,并通过 Prometheus 收集 GPU 监控数据。Prometheus 可以与 Grafana 集成,创建丰富的监控仪表板313。
使用 dcgm-exporter:dcgm-exporter 是一个项目,它使用 DCGM API 从 DCGM 收集 GPU 遥测数据,并为 Prometheus 公开指标313。
生成负载:使用 dcgmproftester 生成确定性的 CUDA 工作负载,用于读取和验证 GPU 度量。dcgmproftester 可以容器化并在 Docker 中运行313。
分析 GPU 性能:通过 DCGM 提供的硬件计数器,可以收集 GPU 利用率、内存使用情况等设备级别的性能指标。这些指标可以帮助运维人员和开发人员进行性能分析和优化314。
优势与局限性:硬件层面的性能分析提供了 GPU 卡级别的性能分析能力,完全透明的数据收集过程,不依赖于上层使用的 AI 框架类型,并支持连续的、实时的性能监控。然而,它无法了解应用具体使用 GPU 的情况,CPU 和 GPU 之间不能高效地协同工作,也不能明确指出具体核函数的运行速度和资源使用状
dcgmi discovery -l # 查看识别到的gpu卡
#验证结果
dcgmi dmon -e 1011 # 可以查看当前传输。具体可以用dcgmi dmon -h看
验证link 状态
dcgmi nvlink -s # 未安装启动fabricmanager时应该都是D
安装nvidia-fabricmanager
查看当前驱动版本
nvidia-smi | grep -i version
| NVIDIA-SMI 460.27.04 Driver Version: 460.27.04 CUDA Version: 11.2 |
driver version。对应下方的下载version,否则启动服务失败,提示驱动版本不兼容
下载nvidia-fabricmanager,注意460.27.04,需要根据上一步驱动版本确认
wget https://developer.download.nvidia.cn/compute/cuda/repos/$distribution/x86_64/nvidia-fabricmanager-460_460.27.04-1_amd64.deb
安装 nvidia-fabricmanager
dpkg -i nvidia-fabricmanager-460_460.27.04-1_amd64.deb
设置nvidia-fabricmanager 服务启动
systemctl enable --now nvidia-fabricmanager.service
检查nvidia-fabricmanager 服务状态
systemctl status nvidia-fabricmanager.service
验证
nvidia-smi topo -m # 此时应该可看到有nv关键字
验证link 状态
dcgmi nvlink -s # 此时应该都是U
4.配置dcgmi遇到的问题
a.nvidia-dcgm 服务启动成功,但又没完全成功
启动服务时候没有报错,但是执行监控命令时出错,其实启动的时候 /var/log/nv-hostengine.log 就已经出现无法加载 nscq 库的错误,只不过没影响服务的启动。因为 nscq 是对 nvswitch 的查询,用户如果不需要查询 nvswitch 的数据,可以接受这个错误。
Could not load NSCQ. dlwrap_attach ret: Can not access a needed shared library (-79): If this system has NvSwitches, please ensure that the package libnvidia-nscq is installed on your system and that the service user has permissions to access it.
datacenter-gpu-manager 对 libnvidia-nscq 也有隐式的版本依赖。虽然在文档和包依赖中完全没有体现这种依赖关系,但我通过降级 datacenter-gpu-manager 到与 libnvidia-nscq 时间上更接近的版本解决了这个找不到 so 的问题。之所以想到去尝试降级版本,还是因为 Nvidia 各种环境和驱动版本的强绑定
b.查询部分指标 DCGM_FI_PROF_ 时出错*
在执行 dcgmi dmon -e 449,1011,1012 时,命令行显示如下错误:
Error setting watches. Result: The third-party Profiling module returned an unrecoverable error
导致这个错误的原因是对于这些 Profile 指标(1001-1014 ),NV 的 Profiler 对每个硬件使用了一个唯一锁。当你启动了超过 1 个的 nv-hostengine (包括内建的),比如使用 NCGM-Exporter 容器时,已经启动了一个内建的 nv-hostengine,然后又在主机上又启动了一个 nv-hostengine 服务,在访问这些指标时,就会出现这种访问失败。解决方案就是一台服务器仅启动一个 nv-hostengine 服务,然后所有的客户端都用本地或者远程的方式去访问它(5555 端口)
c.DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL 的单位
这个指标的单位是 B/s,LoL!
后来仔细查 NCGM 的文档,发现 NCGM-Exporter 的所有指标其实都源自 NCGM 的接口,但还是没看到这个指标的单位和计算逻辑。
最后使用 dcgmi dmon -e 449,1011,1012 做了一下对比,才发现其输出头中有个不起眼的 MB 字样:
#Entity NBWLT NVLTX NVLRX
ID MB/
我做了一下数字的校验,基本可以明确 DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL[449] 约等于 (DCGM_FI_PROF_NVLINK_TX_BYTES[1011] + DCGM_FI_PROF_NVLINK_RX_BYTES[1012]) / 1048576,所以单位应该是 MB/s
d.NCGM-Exporter 的采集延迟和精度
用 docker 跑 NCGM-Exporter 镜像时,发现指标的输出非常慢,输出的值看起来也很奇怪。后来自己构建了一下,研究了一下命令行参数,才发现默认采集的周期是 30s 一次。这种采样精度下,输出的指标值能准确才怪了。正常 dcgmi 采样的频率是 1s 一次,最低可以配置到 100ms 一次。NCGM-Exporter 有命令行参数可以调整这个采样频率,但需要你自己用修改 Dockerfile 去重建镜像。或者可以考虑启动的时候将启动脚本映射到外部文件?没尝试。
3.18 DLIO benchmark 模拟AI模型应用对于存储IO的性能
1.DLIO介绍
DLIO(Distributed Linux I/O)benchmark 是一个用于测试分布式存储系统 I/O 性能的工具,它特别适用于评估在 AI 模型训练和推理等高性能计算场景中的存储性能。DLIO Benchmark 是行业里非常有名的,针对深度学习应用负载的 I/O 性能检测工具。它通过精确模拟训练过程中的 I/O 行为,帮助开发人员快速找到系统架构中的 I/O 瓶颈,并指导优化训练性能。
DLIO Benchmark 的测试涵盖多种深度学习模型任务,如图像分类、自然语言处理、宇宙结构探究等等。通过这些测试,我们可以得到基于具体的硬件配置和运行参数,在不同深度学习框架,如 TensorFlow、PyTorch 等,在特定任务上的 I/O 性能表现。
DLIO Benchmark 内置了多个标准模型训练任务脚本,包括:
BERT:Bidirectional Encoder Representations from Transformers,由 Google 在2018年提出的预训练语言模型。它基于 Transformer 架构,能够同时从左到右和从右到左读取文本,从而更好地理解上下文。因其出色的性能和广泛的应用,在自然语言处理领域备受瞩目。
CosmoFlow :是一个高度可扩展的深度学习应用程序,它基于TensorFlow框架构建,通过将深度学习技术应用于数据密集型的宇宙学研究中,特别是处理大规模的三维宇宙学数据集,加深科学家对宇宙的理解。
ResNet-50:Residual Network 50 是一种深度残差网络模型,由微软实验室的何恺明等人在2015年提出,并在当年的 ILSVRC 图像分类竞赛中获得第一名。ResNet50网络在解决传统卷积神经网络(CNN)在堆叠到一定深度时出现的性能退化问题上取得了显著突破,成为了计算机视觉领域的重要基石。
UNet3D:或 3D UNet,是一种用于医学图像分析的深度学习网络,基于 PyTorch 框架构建。它是 UNet 架构的一个变体,以更好地适应三维医学图像数据(如CT或MRI扫描),有效提取图像中各种器官、组织和病变的轮廓和边缘信息,有助于医生进行疾病诊断和治疗。
2.主要特点
易用性:通过 YAML 文件进行配置,模拟不同深度学习应用的 I/O 过程。
数据生成器:能够生成不同格式、不同数据组织和布局的合成数据集。
透明度:通过 DLIO 分析器提供 I/O 访问的日志记录和分析,具有不同级别的透明度。
支持分布式训练:支持模拟顺序训练和分布式数据并行训练
3.DLIO Benchmark测试
安装:
DLIO Benchmark 可以通过 pip 安装,也可以从源代码安装。推荐使用最新版本或稳定版本:
bashpip install dlio_benchmark
或从源代码安装:
bash复制git clone https://github.com/argonne-lcf/dlio_benchmark
cd dlio_benchmark/
python setup.py install
生成数据:
使用 DLIO Benchmark 生成数据:
DATA_DIR=~/dlio_datasets/temp
OPTS=(-f tfrecord -fa multi -nf 1024 -sf 1024 -df ${DATA_DIR} -rl 262144 -gd 1 -k 1)
python ./dlio_benchmark.py ${OPTS[@]}
运行测试:
在已生成的数据上运行测试:
DATA_DIR=~/dlio_datasets/temp
OPTS=(-f tfrecord -fa multi -nf 1024 -sf 1024 -df ${DATA_DIR} -rl 262144 -gd 0 -k 1)
python ./dlio_benchmark.py ${OPTS[@]}
测试配置:DLIO Benchmark 支持多种数据格式和访问模式。
例如,使用 HDF5 格式和共享文件访问模式:
bashmpirun -n 1 python {APP_DATA_DIR} -gd 1 -go 1 -k 1
-f 或 --file_format:指定数据文件的格式,例如 hdf5, tfrecord, csv, npy 等 。
-fa 或 --file_access:定义数据文件的访问模式,如 shared 或 multi。shared 表示多个进程访问同一个文件,而 multi 表示每个进程访问不同的文件 。
-nf 或 --num_files:设置数据文件的总数 。
-sf 或 --file_size:定义单个数据文件的大小 。
-rl 或 --records_per_file:指定每个文件中的记录数 。
-bs 或 --block_size:设置读取操作的块大小 。
-ec 或 --epochs:定义训练过程中要执行的 epoch 数 。
-cs 或 --cache_size:设置缓存大小,用于模拟缓存对性能的影响 。
-df 或 --data_dir:指定存储生成数据的目录 。
-gd 或 --generate_data:开关参数,用于指示是否生成数据 。
-go 或 --only_generate:开关参数,仅生成数据而不运行基准测试 。
-k 或 --keep_data:保留生成的数据以供后续使用
测试不同的深度学习模型:DLIO Benchmark 内置了多个标准模型训练任务脚本,包括 BERT、CosmoFlow、ResNet-50 和 UNet3D。这些脚本模拟了不同深度学习框架(如 TensorFlow、PyTorch)在特定任务上的 I/O 性能表现
4.使用 DLIO Benchmark 来优化分布式训练性能
步骤:
理解 DLIO Benchmark:DLIO Benchmark 可以模拟不同的 I/O 模式和行为,理解它如何工作以及如何配置是优化的第一步。
安装 DLIO Benchmark:确保 DLIO Benchmark 正确安装在你的系统上。可以通过 pip 安装或从 GitHub 仓库克隆并设置。
生成测试数据:使用 DLIO Benchmark 的数据生成器创建合成数据集,这些数据集模拟了实际深度学习应用中的数据布局和格式。
配置测试:根据你的分布式训练环境,使用 YAML 文件配置 DLIO Benchmark。指定数据格式、数据组织、训练配置等参数。
模拟分布式数据并行训练:DLIO Benchmark 支持模拟分布式数据并行训练。配置适当的参数来模拟你的分布式环境,如节点数、每个节点的 GPU 数量等。
执行基准测试:运行 DLIO Benchmark 来模拟 I/O 负载。观察在不同配置下的 I/O 性能,如 IOPS、吞吐量和延迟。
分析结果:分析测试结果,识别性能瓶颈。DLIO Benchmark 提供了透明度,可以通过日志记录和分析工具来帮助理解 I/O 访问模式。
调整存储系统配置:根据分析结果,调整存储系统的配置,如 RAID 级别、缓存大小、存储介质等。
优化数据布局:根据测试结果优化数据布局,例如,使用更有效的数据分区或格式化策略来减少 I/O 争用。
调整分布式训练策略:可能需要调整分布式训练策略,如批处理大小、学习率、模型并行化等,以更好地适应存储系统的 I/O 性能。
使用现代分析工具:利用 TensorBoard、Darshan 等现代分析工具来进一步分析和可视化 DLIO Benchmark 的测试结果。
迭代优化:性能优化是一个迭代过程。根据每次测试的结果不断调整和优化,直到达到满意的性能水平。
考虑硬件升级:如果软件优化达到极限,考虑升级硬件,如使用更快的 SSD、增加内存容量或使用更高性能的网络。
3,19 NVQUAL测试
英伟达只向 OEM 和 SIP 合作伙伴提供 NVQUAL 测试工具访问权限。英伟达建议其他用户使用 NVVS,OEM厂商受英伟达限制不外发给客户使用
具体的测试步骤和指南可能因不同的 NVIDIA GPU 型号和 NVQUAL 版本而有所不同 ,H800用H800对应的工具版本,H100用H100对应的工具版本
1.赋权
以root用户身份在系统上运行NVQUAL,在NVQUAL目录中执行chmod命令,以提供完整的读/写访问权限:
/> cd NVQUAL_DIRECTORY
/> chmod -R 777 *
2.安装nvdia显卡驱动
某些NVIDIA测试需要NVIDIA显示驱动程序。所以需要安装显卡驱动:
/> rmmod mods #unload mods driver before installing display driver
/> sudo ./NVIDIA-Linux-<driver_ver>.run
3.测试
NVQUAL可以在无需人工干预的非交互式模式下运行。NVQUAL 中包含运行测试脚本。可以为NVQUAL提供测试编号和可选参数,以指定特定的gpu索引和测试循环数。如果未指定循环参数,则只运行测试的一个循环。
例如:
yum install -y libnsl*
List all GPUs detected on the system
/>./nvqual --list
Run test 2 on GPU with ID 0 for 3 loops
/>./nvqual --test 2 --index 0 --loops 3
Run test 2 on GPU at pci slot 04:00.0
/>./nvqual --test 2 --pcibus 04:00.0
./nvqual -h 查看帮助命令
测试过程是以顺序执行方式来执行每一张卡的压力,单张卡测试时间大约15分钟左右,八卡测试时间累加
4.故障问题
4.1 GPU_COMPUTE对照表
https://developer.nvidia.com/cuda-gpus
科学计算显卡的两个主要性能指标:
1、CUDA compute capability,这是英伟达公司对显卡计算能力的一个衡量指标;
2、FLOPS 每秒浮点运算次数,TFLOPS表示每秒万亿(10^12)次浮点计算;
3、另外,显存大小也决定了实验中能够使用的样本数量和模型复杂度。
一个MFLOPS(megaFLOPS)等于每秒一百万(=10^6)次的浮点运算,
一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算,
一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算,(1太拉)
一个PFLOPS(petaFLOPS)等于每秒一千万亿(=10^15)次的浮点运算,
一个EFLOPS(exaFLOPS)等于每秒一百京(=10^18)次的浮点运算,
一个ZFLOPS(zettaFLOPS)等于每秒十万京(=10^21)次的浮点运算。
4.2 GPU状态
lspci | grep -iE nvidia
lspci -s 1b:00.0 -vvv
RxErr+ (Receiver Error): 接收器错误,表示设备在接收数据时检测到错误。
BadTLP+ (Bad Transaction Layer Packet): 错误的事务层数据包,表示接收到的数据包格式不正确。
BadDLLP+ (Bad Data Link Layer Packet): 错误的数据链路层数据包,表示接收到的数据包头信息错误。
Rollover- (Rollover Error): 溢出错误,表示接收到的数据包超出了接收缓冲区的容量。
Timeout+ (Timeout Error): 超时错误,表示等待数据包完成传输的时间过长。
AdvNonFatalErr- (Advanced Non-Fatal Error): 高级非致命错误,表示发生的可纠正错误,不会导致设备崩溃,但可能会影响性能。
-
DLP (Data Link Protocol Error): 数据链路层协议错误,表示数据包在传输过程中出现了问题。
-
SDES (Surprise Down Error): 意外掉线错误,表示设备意外断开连接。
-
TLP (Transaction Layer Packet Error): 事务层数据包错误,表示在发送或接收数据包时出现了问题。
-
FCP (Flow Control Protocol Error): 流控制协议错误,表示流量控制机制出现问题。
-
CmpltTO+ (Possible Misinterpretation):
-
该部分可能为误读。CmpltTO 本身没有标准定义,具体含义取决于使用的系统。
-
一些推测:
-
可能来自非标准的系统,TO 代表超时 (Timeout)。
-
也许是 CmpltTO 和 CmpltAbrt (完成中止) 的组合表示。
-
CmpltAbrt (Completion Abort): 完成中止错误,表示在完成数据传输之前操作被中止。
-
UnxCmplt (Unexpected Completion): 意外完成错误,表示在未完成数据传输的情况下收到完成信号。
-
RxOF (Receiver Overflow): 接收器溢出错误,表示接收器来不及处理收到的数据。
-
MalfTLP (Malformed TLP): 格式错误的 TLP,表示接收到的数据包格式不正确。
-
ECRC (Error Correcting Code Error): 错误纠正码错误,表示纠错码检测到数据传输错误。
-
UnsupReq (Unsupported Request): 不支持的请求错误,表示设备收到不支持的请求。
-
ACSViol (Address Space Violation): 地址空间冲突错误,表示访问了非法的内存地址。
CorrErr- (Correctable Error): 可纠正错误,表示设备检测到错误并能够自行纠正,不会导致设备崩溃 (与 CESta 信息类似)。
NonFatalErr- (Non-Fatal Error): 非致命错误,表示设备遇到错误但不会崩溃,可能需要软件干预 (与 CESta 信息类似)。
FatalErr- (Fatal Error): 致命错误,表示设备遇到严重错误,可能导致崩溃或无法正常工作 (与 UESta 信息类似)。
UnsupReq- (Unsupported Request): 不支持的请求错误,表示设备收到不支持的请求。
- 设备属性
RlxdOrd+ (Relaxed Ordering): 放松排序,表示设备对事务完成顺序没有严格要求。
ExtTag+ (Extended Tag Field): 扩展标签字段,表示设备支持更大的标签用于标识事务。
PhantFunc- (Phantom Function): 幻影功能,表示该功能并非物理存在,而是由软件模拟的。
AuxPwr- (Auxiliary Power): 辅助供电,表示设备需要额外的供电才能正常工作。
NoSnoop+ (No Snoop): 无侦听,表示设备不会侦听其他设备的总线流量。
FLReset- (Function Level Reset): 功能级复位,表示可以独立复位设备的某个功能。
MaxPayload 128 bytes, MaxReadReq 512 bytes: 最大有效载荷 128 字节,最大读取请求 512 字节。 这表示设备一次可以处理的最大数据量。
Completion Timeout: 50us to 50ms, TimeoutDis-: 完成超时时间: 50 微秒到 50 毫秒,禁用超时中断。
这表示设备完成一个事务的最短时间是 50 微秒,最长是 50 毫秒。
TimeoutDis- 表示禁用了完成超时中断。如果没有收到完成信号,不会产生中断通知 CPU。
LTR-: 可靠事务 (LTR) 支持。这是一种可选功能,可以提高事务完成的可靠性。
OBFF Disabled: 输出缓冲区满 (OBFF) 禁用。这表示设备没有输出缓冲区,或者该功能被禁用。
AtomicOpsCtl: ReqEn-: 原子操作控制: 请求启用。这表示设备支持原子操作,可以在一个操作中读取和修改内存。
CorrErr+ (可纠正错误): 此标志设置,表明设备遇到可纠正错误。这些错误通常由设备本身处理,不会造成重大问题。
NonFatalErr- (非致命错误): 此标志未设置,意味着设备未遇到非致命错误。非致命错误可能需要软件干预,但不会导致完全崩溃。
FatalErr- (致命错误): 此标志未设置,这是一个好消息。设置此标志表示可能导致设备故障或崩溃的关键错误。
UnsupReq- (不支持的请求): 此标志未设置,表示设备未收到任何不支持的请求。如果软件尝试使用设备没有的功能,可能会发生不支持的请求。
AuxPwr- (辅助电源): 此标志设置,表明设备除了标准的 PCIe 插槽电源外,还需要辅助电源。
TransPend- (事务挂起): 此标志设置,意味着设备至少有一个尚未完成的待办事项。这可能是由于各种原因,例如正在进行的数据传输或等待响应。
Capabilities: b0 MSI-X: Enable- Count=9 Masked- 描述了与中断处理相关的 PCI Express (PCIe) 设备功能。以下是详细解释:
功能: 此部分表示设备除了基本的 PCI 功能之外,还支持各种功能。
MSI-X: 这表示设备支持带有扩展的消息信号中断 (MSI-X)。MSI-X 是一种中断处理机制,与传统的 INTx 方法相比具有以下优势:
增加中断数量: 传统 INTx 提供有限数量的中断线。MSI-X 允许更多数量的中断,提高了具有多个功能的设备的可扩展性。
减少 CPU 开销: MSI-X 使用特定的消息传递到目标 CPU 核心,从而减少了总体中断处理开销。
Enable-: 这表示 MSI-X 功能当前已在设备上启用。
Count=9: 该设备最多可处理 9 个单独的 MSI-X 中断。
Masked-: 这表明 MSI-X 中断目前被屏蔽,这意味着它们不会被传递给 CPU 直到取消屏蔽。屏蔽中断对于控制设备何时可以中断 CPU 很有用。
First Error Pointer: 0e: 此值(十六进制中的 0e)可能指向设备中存储有关第一个检测到的可纠正错误的信息的内存位置。此值的具体含义取决于设备的文档。
ECRCGenCap+ (ECRC 生成功能): 此标志设置,表示设备能够为其传输的数据生成错误纠正码 (ECRC)。ECRC 是一种数据完整性检查机制,可帮助检测数据传输过程中的错误。
ECRCGenEn- (ECRC 生成启用): 此标志未设置,这意味着设备目前已禁用传输数据的 ECRC 生成。
ECRCChkCap+ (ECRC 检查功能): 此标志设置,表示设备可以检查其接收到的数据的 ECRC。这允许设备识别数据传输过程中引入的潜在错误。
ECRCChkEn- (ECRC 检查启用): 此标志未设置,表示设备目前已禁用接收数据的 ECRC 检查。
PCI Express (PCIe) 设备的 IO 虚拟化控制寄存器 (IOVCtl) 的信息。它指示设备与 I/O 虚拟化相关的各种功能。让我们分解每个元素:
Enable-: 此标志设置,表示 I/O 虚拟化功能当前已在设备上启用。
以下是如何根据其余标志启用 I/O 虚拟化的功能:
Migration-: 此标志在此情况下可能不存在或未设置。如果存在,则表示设备支持在同一 PCIe 设备内的不同物理功能 (PF) 之间迁移虚拟 I/O 资源。
Interrupt-: 此标志在此情况下可能不存在或未设置。如果存在,则表明设备支持虚拟 I/O 请求的中断消息重映射 (IRM)。IRM 允许重新映射虚拟机使用的中断向量。
MSE- (多段引擎): 此标志设置,表示设备支持多段引擎 (MSE) 功能。MSE 有助于提高涉及多个内存段的数据传输效率。
ARIHierarchy- (高级请求者 ID 层级): 此标志设置,表示设备支持高级请求者 ID (ARI) 层级。ARI 层级提供了一种机制来识别使用设备的不同虚拟机或进程。
4.3XID errors 清单
1.XID 错误
XID消息是来自NVIDIA驱动程序的错误报告,该报告打印到操作系统的内核日志或事件日志上。 XID消息表明发生了一般的GPU错误,通常是由于驱动程序错误地编程或者发送给 GPU 的命令被损坏 所导致的。Xid可以指示GPU硬件问题,NVIDIA软件问题或用户应用程序问题。xid提供给用户和 NVIDIA厂商 都可以使用的诊断信息,极大帮助了诊断问题。
XID 错误是 NVIDIA GPU 驱动程序中的一种错误报告机制,用于向操作系统的内核日志报告 GPU 相关的错误。这些错误可能由多种原因引起,包括硬件问题、驱动程序问题或用户应用程序问题。
硬件错误:例如GPU掉卡,GPU温度过高,GPU PCIe线路脱落;
软件错误:例如Nvidia驱动不匹配,cuda版本不支持等;
用户业务代码错误:导致无法使用GPU。
驱动程序问题:可能是由于驱动程序对 GPU 编程不正确或发送到 GPU 的命令被损坏。
硬件问题:可能涉及 GPU 芯片、显存、风扇、电源或其他硬件部位的故障。
用户应用程序问题:应用程序可能尝试执行非法操作,如访问无效内存或执行非法指令。
系统内存损坏:系统内存的问题也可能导致 XID 错误。
总线错误:PCIe 总线问题可能影响 GPU 与系统的通信。
热问题:GPU 过热可能导致错误。
固件问题:GPU 内部微控制器或固件可能存在问题。
因此我们可以借助nvidia xid errors来进行判断错误类型
2.为了预防 XID 错误,可以采取以下措施:
确保 GPU 驱动程序与您的硬件和操作系统兼容,并且是最新版本。
定期检查和更新系统 BIOS 和 GPU 固件。
监控系统和 GPU 温度,确保散热系统正常工作。
使用经过充分测试的应用程序,避免运行未知或不稳定的代码。
确保系统内存是稳定的,并且没有损坏。
如果使用虚拟化技术,请确保虚拟化环境和相关工具(如 NVIDIA Container Runtime 和 Device Plugin)配置正确。
对于 ECC 错误,如果可能,请使用支持错误校正的内存。
遵循 NVIDIA 的 GPU 调试指南,包括使用 nvidia-smi 工具监控 GPU 状态,并在出现问题时采取适当的故障排除步骤
3.列举生产中常见的xid事件:
XID 13: GR: SW Notify Error:常见原因:一般为用户应用程序故障。通常这是一个数组下标越界错误。也有可能是非法指令,非法寄存器等其他情况。极少数情况下 会出现硬件故障或者软件错误导致XID 13
XID 31: Fifo: MMU Error:常见原因: 一般为应用程序级别故障。 当MMU上报故障时,当gpu芯片上的应用程序进行非法地址访问时,会触发此类故障并记录。
XID 32: PBDMA Error:常见原因: 一般是硬件问题。当 DMA 控制器报告故障时,会记录此事件,该控制器通过 PCI-E 总线管理 NVIDIA 驱动程序和 GPU 之间的通信流。这些故障主要涉及PCI的质量问题,一般不是由用户应用程序操作引起的。解决方式: 联合硬件运维处理
XID 43: RESET CHANNEL VERIF ERROR:常见原因:基本是用户应用程序故障。不影响GPU的健康状况解决方式: 联合开发同事处理
XID 45: OS: Preemptive Channel Removal:常见原因: 通常这并代表发生故障。用户程序退出中止,control-C cpu reset sigkill 都会导致此类事件
XID 48: DBE (Double Bit Error) ECC Error:常见原因:怀疑硬件故障。当gpu检测到不可修正的错误,会记录该事件。
XID 63, 64: ECC Page Retirement or ROW REMAPPING:常见原因: ECC显存故障,常见于硬件故障。 当应用程序遭遇到 GPU 显存硬件错误时,NVIDIA 自纠错机制会将错误的内存区域retire 或者 remap,retirement 和remapped 信息需要记录到 infoROM 中才能永久生效。A 系列显卡开始支持row remappingA系列之前的显卡,例如T4 V100 P100 支持dynamic page retirement解决方式:联合硬件同事排查
XID 74: Nvlink ERROR:常见原因:多半为硬件故障。多卡GPU之间使用nvlink进行通讯时出现问题,链路故障或者g卡故障都会导致。解决方式:可自行通过gpu reset 或者重启节点 进行恢复。如果此时还无法恢复,需要进行维修处理。
XID 79: GPU has fallen off the bus:常见原因: 多半是硬件问题。具体现象为当gpu驱动尝试通过PCI-e总线访问GPU,访问失败。此事件通常由PCIe链路上的硬件故障引起,导致GPU由于链路中断而无法访问。解决方式:硬件维修
XID 93: Non-fatal violation of provisioned inforom wear limit:常见原因: 当GPU驱动程序因违反使用nvflash-elsesessionstart导致更新infoROM失败。大多数情况下,这并不是软件驱动故障。
XID 94, 95: CONTAINED/UNCONTAINED ECC ERRORs:常见原因:当应用程序遭遇到 GPU 不可纠正的显存 ECC 错误时,NVIDIA 错误抑制机制会尝试将错误抑制在踩到硬件故障的应用程序,而不会让错误导致 GPU 上的所有应用程序受到影响。当抑制机制成功抑制错误时,会产生Xid 94事件,仅影响遭遇了不可纠正 ECC 错误的应用程序。 Xid95 代表抑制失败,此时表明运行在该 GPU 上的所有应用程序都已受到影响。解决方式: 联合硬件同事处理
XID 110 SECURITY FAULT ERROR:常见原因:硬件故障。解决方式: 恢复最近所有的系统硬件修改,并冷启动系统。需联系硬件处理。
XID 119, 120: GSP RPC Timeout / GSP Error:常见原因: 当在 GPU 的 GSP 核心上运行的代码中发生错误/或在等待 GPU 的 GSP 核心响应 RPC 消息时发生超时时。解决方式: 可以尝试重启节点或者重置GPU。如果还不行联系硬件处理
1.nvidia-smi确认gpu是否有ecc 或者不识别情况
2.nvidia-smi topo -m确认topo是否正常
3.检查nvidia-fabric manager服务
4.检查nvidia_peermem模块加载情况
5.检查ACSCtl是否关闭
lspci -vvv | grep ACSCtl
#如果发现很多,超过4行带+号,证明没关
4.4 拆装机操作注意事项
1.拆装机前保存服务器数据,关闭操作系统,拔掉电源 sync使操作系统把所有数据从内存缓冲区同步到硬盘
2.防止静电释放,穿静电衣,装防静电袋,勿触摸焊接点引脚或裸露的电路
3.GPU和CPU连接器针脚较脆弱,更换过程中请勿碰撞连接器针脚,防止造成连接器针脚弯曲损坏。
4.拆出导风罩时注意超级电容,如有电容要断开超级电容线缆
5.按照斜对角的顺序拆装SXM5螺丝,否则可能导致GPU受压力损坏
6.超微机器BMC出厂默认用户名密码在机箱前面侧边夹缝中或者主板上标签
7.拔插delta板注意保护背板金手指,对齐插入,运输前拔出delta板与机箱分开包装
8.单颗风扇失效时,其他风扇会拉满转;如果直接热插入新风扇,新风扇无法克服其余5颗风扇满转的吸风,无法正常起转,易烧毁
新风扇+风扇仓铁件(包含胶钉、螺丝) 风扇需要提前组装好
重新插入坏风扇后,约6~8秒后风扇转速降低(声音明显下降),此时,迅速(10秒内)拔出坏风扇,插入新风扇
如果没听到风扇转速降低,重复第一步
在线更换注意事项:
1、必须在风扇全部绿灯时进行热插拔操作,如有风扇红灯报警,请勿进行热插拔操作,需要先更换亮红灯的风扇。
2、替换过程要迅速,严禁长时间风扇槽位空置,做到一手拔出来,另一只手迅速补上新风扇。
3、按照快速更换的手法操作,风扇 LED 灯不会出现红灯情况,始终为绿灯,转速始终不高;
4、如果操作略慢(空档期超过 10S),新插入风扇 LED 会亮红灯,风扇全部满转,此时为正常情况,请多等待1min,等风扇绿灯亮起,风扇转速降低并稳定。再进行下一颗风扇更换:5、检査所有风扇 LED 灯状态,绿灯亮为正常,近距离感受风扇出风量,6 颗风扇风量均匀,无单颗风扇转速异常高的情况,BOX下查看风扇信息(有条件)。
9.PCIE模组把手断裂 --后置5个风扇故障,导致GPU卡温度高
4.5 nvitop
安装pip3 install --upgrade nvitop
nvitop是一款交互式NVIDIA-GPU设备性能&资源&进程的实时监测工具。
相比于nvidia-smi命令,nvitop在实时监控GPU设备资源&性能上具备全方位优势:
以更美观的颜色,和更直观的进度条实时展示某块GPU卡所处进程的GPU&CPU内存以及利用率占比
作为资源监控器,它包括如下功能:树状视图、环境变量查看、进程过滤、进程指标检测等
可追踪某个单项进程在GPU&CPU上内存和利用率占比的历史纪录,并利用Bar直观展示
可直观展示某块GPU的使用者、使用时间、使用命令行、GPU和CPU占用率记录
可使用工具提供的API搭建自定义监控工具
4.6 nvidia-settings
显示GPU设备的详细配置信息,包括显卡型号、GPU核心时钟、内存时钟、电压等信息。使用该命令可以配置GPU设备的参数,例如GPU的核心时钟、内存时钟、电压等参数
可以用于调整 GPU 参数、优化性能、配置多显示器设置等。以下是一些 nvidia-settings 的常用功能和操作:
- 调整显示设置:
◦ 用户可以通过 nvidia-settings 调整分辨率、刷新率、颜色深度等显示属性。 - 管理多个显示器:
◦ 它允许用户配置多显示器的布局,如设置主副显示器、调整显示器排列顺序等。 - 3D 设置:
◦ 用户可以配置 3D 应用程序的设置,如立体视觉、垂直同步(VSync)等。 - PRIME 配置:
◦ 在支持 PRIME 的系统中,nvidia-settings 可以用来切换集成显卡和 NVIDIA GPU。 - CUDA 核心和内存时钟频率调整:
◦ 用户可以调整 GPU 的核心和内存时钟频率,以优化性能或降低功耗。 - 电源管理模式:
◦ 可以设置 GPU 的电源管理模式,如自适应电源管理、优选最大性能等。 - 查看 GPU 状态:
◦ nvidia-settings 提供了实时监控 GPU 状态的功能,包括 GPU 温度、使用率、时钟频率等。 - 配置 NVIDIA 控制面板:
◦ 用户可以通过 nvidia-settings 访问 NVIDIA 控制面板,进行更详细的配置。 - 安装和更新驱动程序:
◦ 虽然 nvidia-settings 本身不直接用于驱动程序安装,但它可以检测驱动程序更新并提供链接。 - 配置 NVIDIA 网络设置:
◦ 对于支持 GPU 直连的网络设备,nvidia-settings 可以用来配置相关网络设置。
要启动 nvidia-settings,你可以在终端中输入以下命令:
nvidia-settings
nvidia-smi topo -m
显示GPU拓扑结构和连接关系,可用于识别GPU间连接的带宽和延迟等信息。使用该命令可以了解GPU设备之间的连接关系和拓扑结构,以及GPU设备之间的带宽和延迟等信息。
nvidia-smi --query-gpu=name,temperature.gpu,utilization.gpu,memory.total,memory.used,memory.free --format=csv
显示当前系统上所有Nvidia GPU设备的使用情况,并输出到CSV文件中,方便后续分析。使用该命令可以显示当前系统上所有Nvidia GPU设备的使用情况,例如GPU的温度、利用率、显存使用情况等信息,并将信息输出到CSV文件中,方便后续分析。