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.0Product Name : Tesla P40Product Brand : TeslaDisplay Mode : EnabledDisplay Active : DisabledPersistence Mode : EnabledAccounting Mode : DisabledAccounting Mode Buffer Size : 1920Driver ModelCurrent : N/APending : N/ASerial Number : 0323617075184GPU UUID : GPU-b5d2fd9e-648b-8cd6-d0c2-dd1665cfb043Minor Number : 3VBIOS Version : 86.02.23.00.01MultiGPU Board : NoBoard ID : 0x1100GPU Part Number : 900-2G610-0300-030Inforom VersionImage Version : G610.0200.00.03OEM Object : 1.1ECC Object : 4.1Power Management Object : N/AGPU Operation ModeCurrent : N/APending : N/AGPU Virtualization ModeVirtualization mode : NonePCIBus : 0x11Device : 0x00Domain : 0x0000Device Id : 0x1B3810DEBus Id : 00000000:11:00.0Sub System Id : 0x11D910DEGPU Link InfoPCIe GenerationMax : 3Current : 1Link WidthMax : 16xCurrent : 16xBridge ChipType : N/AFirmware : N/AReplays since reset : 0Tx Throughput : 0 KB/sRx Throughput : 0 KB/sFan Speed : N/APerformance State : P8Clocks Throttle ReasonsIdle : Not ActiveApplications Clocks Setting : Not ActiveSW Power Cap : ActiveHW Slowdown : Not ActiveSync Boost : Not ActiveSW Thermal Slowdown : Not ActiveFB Memory UsageTotal : 22912 MiBUsed : 10 MiBFree : 22902 MiBBAR1 Memory UsageTotal : 32768 MiBUsed : 2 MiBFree : 32766 MiBCompute Mode : DefaultUtilizationGpu : 0 %Memory : 0 %Encoder : 0 %Decoder : 0 %Encoder StatsActive Sessions : 0Average FPS : 0Average Latency : 0Ecc ModeCurrent : EnabledPending : EnabledECC ErrorsVolatileSingle BitDevice Memory : 0Register File : N/AL1 Cache : N/AL2 Cache : N/ATexture Memory : N/ATexture Shared : N/ACBU : N/ATotal : 0Double BitDevice Memory : 0Register File : N/AL1 Cache : N/AL2 Cache : N/ATexture Memory : N/ATexture Shared : N/ACBU : N/ATotal : 0AggregateSingle BitDevice Memory : 2111Register File : N/AL1 Cache : N/AL2 Cache : N/ATexture Memory : N/ATexture Shared : N/ACBU : N/ATotal : 2111Double BitDevice Memory : 255Register File : N/AL1 Cache : N/AL2 Cache : N/ATexture Memory : N/ATexture Shared : N/ACBU : N/ATotal : 255Retired PagesSingle Bit ECC : 0Double Bit ECC : 4 #由于一个double bit ECC error,GPU device 内存页被重试的次数Pending : YesTemperatureGPU Current Temp : 47 CGPU Shutdown Temp : 95 CGPU Slowdown Temp : 92 CGPU Max Operating Temp : N/AMemory Current Temp : N/AMemory Max Operating Temp : N/APower ReadingsPower Management : SupportedPower Draw : 12.41 WPower Limit : 250.00 WDefault Power Limit : 250.00 WEnforced Power Limit : 250.00 WMin Power Limit : 125.00 WMax Power Limit : 250.00 WClocksGraphics : 544 MHzSM : 544 MHzMemory : 405 MHzVideo : 544 MHzApplications ClocksGraphics : 1303 MHzMemory : 3615 MHzDefault Applications ClocksGraphics : 1303 MHzMemory : 3615 MHzMax ClocksGraphics : 1531 MHzSM : 1531 MHzMemory : 3615 MHzVideo : 1379 MHzMax Customer Boost ClocksGraphics : 1531 MHzClock PolicyAuto Boost : N/AAuto Boost Default : N/AProcesses : None
4 监控和管理GPU Boost
管理员和用户可以使用这种方式来观察GPUs的状态。 以下显示了每个GPU的可用时钟频率(Tesla M40)。
$ nvidia-smi -q -d SUPPORTED_CLOCKS
GPU 0000:07:00.0Supported ClocksMemory : 3004 MHzGraphics : 1114 MHzGraphics : 1088 MHzGraphics : 1063 MHzGraphics : 1038 MHzGraphics : 1013 MHzGraphics : 987 MHzGraphics : 962 MHzGraphics : 949 MHzGraphics : 924 MHzGraphics : 899 MHzGraphics : 873 MHzGraphics : 848 MHzGraphics : 823 MHzGraphics : 797 MHzGraphics : 772 MHzGraphics : 747 MHzGraphics : 721 MHzGraphics : 696 MHzGraphics : 671 MHzGraphics : 645 MHzGraphics : 620 MHzGraphics : 595 MHzGraphics : 557 MHzGraphics : 532 MHzMemory : 405 MHzGraphics : 324 MHz
以上显示中只有两个内存时钟(memory clock)被支持:3004 MHz和405 MHz.运行在前者的内存,有24个支持GPU时钟频率。后者只有一个GPU频率,且是空闲状态的。在Tesla K80上,GPU Boost会自动管理这些频率,来让他们运行的尽可能快。而在其他一些模块中,比如Tesla K40,必须由管理员来指定GPU时钟频率。
查看当前GPU的时钟频率,默认的时钟加速和最小的时钟频率
$ nvidia-smi -q -d CLOCKGPU 0000:07:00.0ClocksGraphics : 949 MHzSM : 949 MHzMemory : 3004 MHzVideo : 873 MHzApplications ClocksGraphics : 947 MHzMemory : 3004 MHzDefault Applications ClocksGraphics : 947 MHzMemory : 3004 MHzMax ClocksGraphics : 1114 MHzSM : 1114 MHzMemory : 3004 MHzVideo : 1024 MHzSM Clock SamplesDuration : 10989718.85 secNumber of Samples : 46Max : 1063 MHzMin : 324 MHzAvg : 948 MHzMemory Clock SamplesDuration : 10989718.85 secNumber of Samples : 46Max : 3004 MHzMin : 405 MHzAvg : 3003 MHzClock PolicyAuto Boost : OnAuto Boost Default : On
理想状态中,你想让所有的时钟都一直运行在比较高的速度,但是对于所有的应用来说是不可能的。可以使用PERFORMANCE参数来查看每个GPU卡当前的状态以及时钟慢下来的原因。
$ nvidia-smi -q -d PERFORMANCE/performance
GPU 0000:07:00.0Performance State : P0Clocks Throttle ReasonsIdle : Not ActiveApplications Clocks Setting : ActiveSW Power Cap : Not ActiveHW Slowdown : Not ActiveSync Boost : Not ActiveUnknown : 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 memoryGPU 0000:06:00.0FB Memory UsageTotal : 22939 MiBUsed : 21800 MiBFree : 1139 MiBBAR1 Memory UsageTotal : 32768 MiBUsed : 2 MiBFree : 32766 MiBGPU 0000:07:00.0FB Memory UsageTotal : 11443 MiBUsed : 10876 MiBFree : 567 MiBBAR1 Memory UsageTotal : 16384 MiBUsed : 2 MiBFree : 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 -mGPU0 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-22Legend:X = SelfSOC = 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 switchNV# = 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