一、使用device控制使用CPU還是GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 單GPU或者CPU.先判斷機器上是否存在GPU,沒有則使用CPU訓練
model = model.to(device)
data = data.to(device)#或者在確定有GPU的情況下,直接使用
model = model.cuda()
data = data.cuda()#在確定沒有GPU的情況下,直接使用
model = model.cpu()
data = data.cpu()
注意:
1.tensor和numpy都是矩陣,前者能在GPU上運行,后者只能在CPU運行,所以要注意數據類型的轉換。
2.當你使用model.to(device)時,它會將模型的參數和緩沖區移動到指定的設備上。而當你使用model = model.to(device)時,它會將整個模型移動到指定的設備上。
二、.to(device)和.cuda()設置GPU的區別
建議使用model.to(device)的方式,這樣可以顯示指定需要使用的計算資源,特別是有多個GPU的情況下,可以并行處理,加快速度。
參考.to(device)和.cuda()設置GPU的區別_.cuda()和to(device)-CSDN博客
.to(device) 可以指定CPU 或者GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 單GPU或者CPU
model.to(device)
#如果是多GPU
if torch.cuda.device_count() > 1:model = nn.DataParallel(model,device_ids=[0,1,2])
model.to(device)
.cuda() 只能指定GPU
#指定某個GPU
os.environ['CUDA_VISIBLE_DEVICES']="1"
model.cuda()
#如果是多GPU
os.environ['CUDA_VISIBLE_DEVICES'] = "0,1,2,3"
device_ids = [0,1,2,3]
net = torch.nn.Dataparallel(net, device_ids =device_ids)
net = torch.nn.Dataparallel(net) # 默認使用所有的device_ids
net = net.cuda()model.cuda()
#如果是多GPU
os.environment['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
device_ids = [0,1,2,3]
net = torch.nn.Dataparallel(net, device_ids =device_ids)
net = torch.nn.Dataparallel(net) # 默認使用所有的device_ids
net = net.cuda()
三、指定使用的GPU
使用方式
import os# 給服務器上的GPU編號
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'# 指定要使用哪張卡
device_ids = [0, 1] #假設只用兩張卡# 將模型搬到GPU上,并行化處理
model = torch.nn.DataParallel(model, device_ids=device_ids)
model = model.cuda()
# 或者直接
model = torch.nn.DataParallel(model, device_ids=device_ids).cuda()
四、GPU利用率很低的可能原因分析
訓練中GPU利用率很低4%,CPU利用率很高80%左右,原因分析:
(1)CPU性能不足,沒有ssd加速;
(2)電腦只有一張顯卡,無法并行訓練model;——轉移到服務器上多卡一起并行訓練
(3)模型太復雜,要訓練的參數多;——優化模型
(4)且Dataloader讀入數據的時候numworks=0,單線程讀入比較慢;——numworks=4,適當增大,觀察GPU的提升,但CPU跑滿就沒法再繼續增加了
(5)程序中每次迭代訓練都采用日志保存所有的訓練結果,頻繁I/O讀取;——先不記錄,調好參數之后再訓練時記錄;
小結:主要考慮優化數據讀取(I/O速度);數據傳輸;數據GPU上預處理;優化算法;調整硬件資源;
在不改變硬件條件的情況下,最能夠努力的就是增加數據讀取的進程,以及盡量把數據預處理操作能移到GPU上進行的就都移到GPU上。
GPU利用率低解決方案
跑深度學習模型的時候我的gpu利用率很低_mob64ca12d2a342的技術博客_51CTO博客