1 使用nvidia-smi管理你的GPU卡
nvidia-smi
命令是NVIDIA系统管理接口,之前提到使用nvidia-docker
实际上底层也是调用的该接口。该接口可以查看到当前主机上的相关GPU设备,任务以及当前状态等信息,熟练使用该接口能够更好的管理好GPU系统资源。
2 开启持久模式
在Linux上,你需要将GPUs设置为持久模式persistence mode
来保证你的NVIDIA
驱动即使没有应用正在运行也是出于加载状态的。这个在你有一些短生命周期的job类型应用运行时是非常有用的。持久模式比较耗电,但是它会防止每次启动GPU应用程序时发生的相当长的延迟。当然如果你使用设定了时钟频率或功率限制的GPUs的话(当驱动不加载的话,这些设置会丢失),持久模式将是非常有必要的。通过如下命令设置持久模式:
nvidia-smi -pm 1
在Windows上,改接口不支持设置持久模式,但是可以设置为TCC
模式。
3 查看GPU状态
3.1 GPU设备概要信息
由以下输出可以看到驱动版本为:375.39
,以及GPU基本信息。
sh-4.2# nvidia-smi
Wed Oct 18 11:58:03 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.39 Driver Version: 375.39 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla M40 24GB On | 0000:04:00.0 Off | 0 |
| N/A 23C P8 17W / 250W | 0MiB / 22939MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla M40 On | 0000:05:00.0 Off | 0 |
| N/A 26C P8 17W / 250W | 0MiB / 11443MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 Tesla M40 24GB On | 0000:06:00.0 Off | 0 |
| N/A 22C P8 17W / 250W | 0MiB / 22939MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 Tesla M40 On | 0000:07:00.0 Off | 0 |
| N/A 23C P8 16W / 250W | 0MiB / 11443MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
# Temp 标识GPU设备的温度
# Memory-Usage 表示内存使用率
# GPU-Util 表示GPU使用率
3.2 查看当前系统可用的GPU设备列表
$ nvidia-smi -L
GPU 0: Tesla M40 24GB (UUID: GPU-eb4e4871-504d-feb7-ba59-xxxxxxxxxx)
GPU 1: Tesla M40 (UUID: GPU-6c2cb0c9-acba-1dab-6525-xxxxxxxxxx)
GPU 2: Tesla M40 24GB (UUID: GPU-85551fe5-68ea-15b3-76c1-6fe1sas2w 1)
GPU 3: Tesla M40 (UUID: GPU-8fe0a30b-7faa-0537-e3a5-53ba5c8a61wesd)
3.3 查看GPU以及单元信息
$ nvidia-smi -q
3.4 查看每一个GPU指定详细信息
# nvidia-smi --query-gpu=index,name,uuid,serial --format=csv
index, name, uuid, serial
0, Tesla M40 24GB, GPU-eb4e4871-504d-feb7-ba59-xxxxxxxx, xxxxxxxxxx
1, Tesla M40, GPU-6c2cb0c9-acba-1dab-6525-xxxxxxxx, xxxxxxxxxx
2, Tesla M40 24GB, GPU-85551fe5-68ea-15b3-76c1-xxxxxxxx, xxxxxxxxxx
3, Tesla M40, GPU-8fe0a30b-7faa-0537-e3a5-xxxxxxxx, xxxxxxxxxx
3.5 指定GPU查看相关信息
# nvidia-smi --query-gpu=index,name,uuid,serial --format=csv --id=0
index, name, uuid, serial
0, Tesla M40 24GB, GPU-eb4e4871-504d-feb7-ba59-d15a66d6faa7, 0322816142509
3.6 查看GPU全部信息
# nvidia-smi -a -i 3
==============NVSMI LOG==============
Attached GPUs : 8
GPU 00000000:11:00.0
Product Name : Tesla P40
Product Brand : Tesla
Display Mode : Enabled
Display Active : Disabled
Persistence Mode : Enabled
Accounting Mode : Disabled
Accounting Mode Buffer Size : 1920
Driver Model
Current : N/A
Pending : N/A
Serial Number : 0323617075184
GPU UUID : GPU-b5d2fd9e-648b-8cd6-d0c2-dd1665cfb043
Minor Number : 3
VBIOS Version : 86.02.23.00.01
MultiGPU Board : No
Board ID : 0x1100
GPU Part Number : 900-2G610-0300-030
Inforom Version
Image Version : G610.0200.00.03
OEM Object : 1.1
ECC Object : 4.1
Power Management Object : N/A
GPU Operation Mode
Current : N/A
Pending : N/A
GPU Virtualization Mode
Virtualization mode : None
PCI
Bus : 0x11
Device : 0x00
Domain : 0x0000
Device Id : 0x1B3810DE
Bus Id : 00000000:11:00.0
Sub System Id : 0x11D910DE
GPU Link Info
PCIe Generation
Max : 3
Current : 1
Link Width
Max : 16x
Current : 16x
Bridge Chip
Type : N/A
Firmware : N/A
Replays since reset : 0
Tx Throughput : 0 KB/s
Rx Throughput : 0 KB/s
Fan Speed : N/A
Performance State : P8
Clocks Throttle Reasons
Idle : Not Active
Applications Clocks Setting : Not Active
SW Power Cap : Active
HW Slowdown : Not Active
Sync Boost : Not Active
SW Thermal Slowdown : Not Active
FB Memory Usage
Total : 22912 MiB
Used : 10 MiB
Free : 22902 MiB
BAR1 Memory Usage
Total : 32768 MiB
Used : 2 MiB
Free : 32766 MiB
Compute Mode : Default
Utilization
Gpu : 0 %
Memory : 0 %
Encoder : 0 %
Decoder : 0 %
Encoder Stats
Active Sessions : 0
Average FPS : 0
Average Latency : 0
Ecc Mode
Current : Enabled
Pending : Enabled
ECC Errors
Volatile
Single Bit
Device Memory : 0
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : 0
Double Bit
Device Memory : 0
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : 0
Aggregate
Single Bit
Device Memory : 2111
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : 2111
Double Bit
Device Memory : 255
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : 255
Retired Pages
Single Bit ECC : 0
Double Bit ECC : 4 #由于一个double bit ECC error,GPU device 内存页被重试的次数
Pending : Yes
Temperature
GPU Current Temp : 47 C
GPU Shutdown Temp : 95 C
GPU Slowdown Temp : 92 C
GPU Max Operating Temp : N/A
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
Power Readings
Power Management : Supported
Power Draw : 12.41 W
Power Limit : 250.00 W
Default Power Limit : 250.00 W
Enforced Power Limit : 250.00 W
Min Power Limit : 125.00 W
Max Power Limit : 250.00 W
Clocks
Graphics : 544 MHz
SM : 544 MHz
Memory : 405 MHz
Video : 544 MHz
Applications Clocks
Graphics : 1303 MHz
Memory : 3615 MHz
Default Applications Clocks
Graphics : 1303 MHz
Memory : 3615 MHz
Max Clocks
Graphics : 1531 MHz
SM : 1531 MHz
Memory : 3615 MHz
Video : 1379 MHz
Max Customer Boost Clocks
Graphics : 1531 MHz
Clock Policy
Auto Boost : N/A
Auto Boost Default : N/A
Processes : None
4 监控和管理GPU Boost
管理员和用户可以使用这种方式来观察GPUs的状态。 以下显示了每个GPU的可用时钟频率(Tesla M40)。
$ nvidia-smi -q -d SUPPORTED_CLOCKS
GPU 0000:07:00.0
Supported Clocks
Memory : 3004 MHz
Graphics : 1114 MHz
Graphics : 1088 MHz
Graphics : 1063 MHz
Graphics : 1038 MHz
Graphics : 1013 MHz
Graphics : 987 MHz
Graphics : 962 MHz
Graphics : 949 MHz
Graphics : 924 MHz
Graphics : 899 MHz
Graphics : 873 MHz
Graphics : 848 MHz
Graphics : 823 MHz
Graphics : 797 MHz
Graphics : 772 MHz
Graphics : 747 MHz
Graphics : 721 MHz
Graphics : 696 MHz
Graphics : 671 MHz
Graphics : 645 MHz
Graphics : 620 MHz
Graphics : 595 MHz
Graphics : 557 MHz
Graphics : 532 MHz
Memory : 405 MHz
Graphics : 324 MHz
以上显示中只有两个内存时钟(memory clock)被支持:3004 MHz和405 MHz.运行在前者的内存,有24个支持GPU时钟频率。后者只有一个GPU频率,且是空闲状态的。在Tesla K80上,GPU Boost会自动管理这些频率,来让他们运行的尽可能快。而在其他一些模块中,比如Tesla K40,必须由管理员来指定GPU时钟频率。
查看当前GPU的时钟频率,默认的时钟加速和最小的时钟频率
$ nvidia-smi -q -d CLOCK
GPU 0000:07:00.0
Clocks
Graphics : 949 MHz
SM : 949 MHz
Memory : 3004 MHz
Video : 873 MHz
Applications Clocks
Graphics : 947 MHz
Memory : 3004 MHz
Default Applications Clocks
Graphics : 947 MHz
Memory : 3004 MHz
Max Clocks
Graphics : 1114 MHz
SM : 1114 MHz
Memory : 3004 MHz
Video : 1024 MHz
SM Clock Samples
Duration : 10989718.85 sec
Number of Samples : 46
Max : 1063 MHz
Min : 324 MHz
Avg : 948 MHz
Memory Clock Samples
Duration : 10989718.85 sec
Number of Samples : 46
Max : 3004 MHz
Min : 405 MHz
Avg : 3003 MHz
Clock Policy
Auto Boost : On
Auto Boost Default : On
理想状态中,你想让所有的时钟都一直运行在比较高的速度,但是对于所有的应用来说是不可能的。可以使用PERFORMANCE参数来查看每个GPU卡当前的状态以及时钟慢下来的原因。
$ nvidia-smi -q -d PERFORMANCE/performance
GPU 0000:07:00.0
Performance State : P0
Clocks Throttle Reasons
Idle : Not Active
Applications Clocks Setting : Active
SW Power Cap : Not Active
HW Slowdown : Not Active
Sync Boost : Not Active
Unknown : Not Active
如果任何一个GPU时钟都以比较慢速度运行的话,那么上面的Clocks Throttle Reasons
中的一个或多个将会被标记为active状态。最需要关注的是HW Slowdown
和Unknown
是否是active状态,如果那样的话很可能是电源或者冷却系统的问题。其余的需要关注设备卡是否是空闲的或者是由管理员手动设置为slower
模式。
使用nvidia-smi
还可以去监控其他相关指标,-d参数支持MEMORY UTILIZATION ECC TEMPERATURE POWER CLOCK COMPUTE PIDS PERFORMANCE SUPPORTED_CLOCKS PAGE_RETIREMENT ACCOUNTING
查看每块GPU卡的内存使用:
$ nvidia-smi -q -d memory
GPU 0000:06:00.0
FB Memory Usage
Total : 22939 MiB
Used : 21800 MiB
Free : 1139 MiB
BAR1 Memory Usage
Total : 32768 MiB
Used : 2 MiB
Free : 32766 MiB
GPU 0000:07:00.0
FB Memory Usage
Total : 11443 MiB
Used : 10876 MiB
Free : 567 MiB
BAR1 Memory Usage
Total : 16384 MiB
Used : 2 MiB
Free : 16382 MiB
指定GPU卡查看相关指标:
nvidia-smi -i 0 -q -d MEMORY,UTILIZATION,POWER,CLOCK,COMPUTE
5 查看系统的拓扑结构
要适当的利用更先进的NVIDIA GPU优势(例如GPU Direct),因此系统的拓扑结构的正确配置是非常重要的。拓扑结构涉及到PCI-Express
(GPUs, InfiniBand HCAs, storage controllers, etc)设备如何连接到其他设备,以及如何连接到系统CPU的。如果配置不正确,可能某些特定的功能性能会比较低甚至不能正常工作。为了解决如上问题,nvidia-smi
最近的版本包含了一个可用查看系统拓扑的命令。
# 显示GPU拓扑(-m参数可以看到GPU交流矩阵以及CPU亲和性绑定)
$ nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 CPU Affinity
GPU0 X PIX PIX PIX 0-0,2-2,4-4,6-6,8-8,10-10,12-12,14-14,16-16,18-18,20-20,22-22
GPU1 PIX X PIX PIX 0-0,2-2,4-4,6-6,8-8,10-10,12-12,14-14,16-16,18-18,20-20,22-22
GPU2 PIX PIX X PIX 0-0,2-2,4-4,6-6,8-8,10-10,12-12,14-14,16-16,18-18,20-20,22-22
GPU3 PIX PIX PIX X 0-0,2-2,4-4,6-6,8-8,10-10,12-12,14-14,16-16,18-18,20-20,22-22
Legend:
X = Self
SOC = Connection traversing PCIe as well as the SMP link between CPU sockets(e.g. QPI)
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
PXB = Connection traversing multiple PCIe switches (without traversing the PCIe Host Bridge)
PIX = Connection traversing a single PCIe switch
NV# = Connection traversing a bonded set of # NVLinks
以上配置显示我们有四块GOU卡,并且都链接在服务器的第一颗CPU上(物理机2颗6核cpu并开启超线程)。该工具建议推荐我们将job运行在偶数标记的cpu上。并且以上四块GPU卡都是互相通过PCIe switch直连的。
一个可用的GPU矩阵表示如下:
- X = 表示GPU本身
- SOC = 表示贯穿PCIe总线和CPU sockets之间的SMP链接。
- PHB = 贯穿PCIe总线和PCIe Host Bridge
- PXB = 贯穿多个PCIe switch(不通过PCIe Host Bridge)
- PIX = 链接单个PCIe switch
- NV# = 贯穿一组NVLinks设备
划重点啦:其实由上面的GPU拓扑可以看出来,我们系统上的4块设备是两两互相直连的架构!因为4块卡是通过一个PCIe switch来互相通信的。
补充:查看GPU卡之间的邻居和链接关系
# nvidia-smi topo 命令有个参数-n可以用来指定gpu卡以及互联结构来查看和它互联结构
# 0 = a single PCIe switch on a dual GPU board
# 1 = a single PCIe switch
# 2 = multiple PCIe switches
# 3 = a PCIe host bridge
# 4 = a socket-level link
# 查看每个GPU卡所在的socket上链接的其他GPU卡设备
for uuid in `nvidia-smi --query-gpu=uuid --format=csv | grep GPU | xargs`;do nvidia-smi topo -i $uuid -n 4;done
# 查看每个GPU卡所在的PCIe host bridge 上链接的其他GPU卡设备
for uuid in `nvidia-smi --query-gpu=uuid --format=csv | grep GPU | xargs`;do nvidia-smi topo -i $uuid -n 3;done
# 查看每个GPU卡所在的PCIe switch 上链接的其他GPU卡设备
for uuid in `nvidia-smi --query-gpu=uuid --format=csv | grep GPU | xargs`;do nvidia-smi topo -i $uuid -n 1;done