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 -q3.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, xxxxxxxxxx3.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, 03228161425093.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                       : None4 监控和管理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,COMPUTE5 查看系统的拓扑结构
要适当的利用更先进的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