1,nvidia-smi指令解析
Nvidia自帶了一個nvidia-smi的命令行工具,會顯示顯存使用情況:
nvidia -smi
如圖,其可以在終端打印出GPU的各種屬性。
解析:
第一行Driver Version :384.81 表示我們使用的驅動是384.81
第二行中:第一行表示GPU序號,名字,Persisitence-M(持續模式狀態),如我中有一個GPU序號為0;名字為 Tesla 系列的P100-PCIE;持續模式的狀態,持續模式雖然耗能大,但是在新的GPU應用啟動時,花費的時間更少,這里顯示的是off的狀態。
第一欄Fan:N/A是風扇的轉速,從0到100%之間變動。有的nvidia設備如筆記本,tesla系列不是主動散熱的可能顯示不了轉速
第二欄Temp:溫度,35攝氏度
第三欄Perf:是性能狀態,從P0到P12,P0表示最大性能,P12表示最小性能
第四欄中Pwr表示能耗,29瓦
第五欄中Bus-Id是表示GPU總線的東西
第六欄中Disp.A是DisPlay Active ,表示GPU是否有初始化
下方的Memory-Usage表示顯存的使用率:共16GB 我已經使用了0MB
第七欄Volatile GPU-Util表示GPU的利用率
第八欄Uncorr.ECC是表示ECC的相關東西,ECC即 Error Correcting Code 錯誤檢查和糾正,在服務器和工作站上的內存中才有的技術
再下面是關於進程的相關GPU使用率,如這邊有三個進程對GPU進行了利用,Xorg,compiz和FireFox和各自調用時顯存的使用量
Linux查看顯卡信息:
lspci | grep -i vga
使用nvidia GPU可以
lspci |grep -i nvidia
有GPU的Linux服務器
沒有GPU的Linux服務器
2,GPU的使用
在用TensorFlow深度學習模型訓練中,假設我們在訓練之前沒有指定具體用哪一塊GPU進行訓練,則默認的是選用第0塊GPU用來訓練我們的模型,如果電腦有多塊GPU的話,其他幾塊GPU的也會顯示被占用。
有些時候,我們希望可以通過自己指定一塊或者幾塊GPU來訓練我們的模型,而不是用這種系統默認的方法。
下面代碼是默認指定第0塊GPU訓練,但是我們指定了第二塊進行訓練。
# coding: utf-8 import argparse import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' flags = argparse.ArgumentParser() flags.add_argument('--gpu', default=0, type=float, help='gpu number') FLAGS = flags.parse_args() # 使用GPU gpun = FLAGS.gpu os.environ['CUDA_VISIBLE_DEVICES'] = str(gpun)
我們發現使用GPU的時候,我們在代碼中通過CUDA_VISIBLE_DEVICES來指定,我們可以不用設定外面參數,直接在Python代碼中加入下面兩行即可:
import os os.environ['CUDA_VISIBLE_DEVICES']='1'
使用這種方法,在訓練模型的餓時候,只使用了第“1”塊GPU,並且其他幾塊GPU沒有被占用,這就相當於我們在運行程式的時候,將除第”1“塊以外的其他GPU全部屏蔽了,只有第”1“塊GPU對當前運行的程序是可見的。
同理,如果要指定第“1,2”兩塊GPU來訓練,則上面的代碼可以修改為:
import os os.environ['CUDA_VISIBLE_DEVICES']='2,3'
類似的如果還有更多的GPU要指定,都可以仿照上面的代碼進行添加,——顯卡數字中間使用英文逗號隔開即可。
或者我們可以在終端執行py文件的時候通過CUDA_VISIBLE_DEVICES來指定,與上面類似,只不過在代碼外面而已。
CUDA_VISIBLE_DEVICES=1 python train.py