pytorch配置雙顯卡方式,使用雙顯卡跑代碼
項(xiàng)目場(chǎng)景
Linux系統(tǒng),pytorch環(huán)境
問(wèn)題描述
使用的服務(wù)器有兩張顯卡,感覺一張顯卡跑代碼比較慢,想配置兩張顯卡同時(shí)跑代碼,只需要在你的代碼中添加幾行,就可以使用雙顯卡,親測(cè)有效。
解決方案
提示:這里填寫該問(wèn)題的具體解決方案:
先看以下官方示例代碼,插入添加的地方是需要我們添加在代碼中的代碼行
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import os
#######添加
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # 這里輸入你的GPU_id
# Parameters and DataLoaders
input_size = 5
output_size = 2
batch_size = 30
data_size = 100
#######添加
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# Dummy DataSet
class RandomDataset(Dataset):
def __init__(self, size, length):
self.len = length
self.data = torch.randn(length, size)
def __getitem__(self, index):
return self.data[index]
def __len__(self):
return self.len
rand_loader = DataLoader(dataset=RandomDataset(input_size, data_size),
batch_size=batch_size, shuffle=True)
# Simple Model
class Model(nn.Module):
# Our model
def __init__(self, input_size, output_size):
super(Model, self).__init__()
self.fc = nn.Linear(input_size, output_size)
def forward(self, input):
output = self.fc(input)
print("\tIn Model: input size", input.size(),
"output size", output.size())
return output
################添加
# Create Model and DataParallel
model = Model(input_size, output_size)
if torch.cuda.device_count() > 1:
print("Let's use", torch.cuda.device_count(), "GPUs!")
model = nn.DataParallel(model)
model.to(device)
#Run the Model
for data in rand_loader:
input = data.to(device)
output = model(input)
print("Outside: input size", input.size(),
"output_size", output.size())其中我將model = nn.DataParallel(model)修改為model = nn.DataParallel(model.cuda()),這一步直接參照網(wǎng)上修改的,因此這一步?jīng)]有報(bào)錯(cuò)。
比如我自己在我代碼中添加如下
from model.hash_model import DCMHT as DCMHT
import os
from tqdm import tqdm
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
import scipy.io as scio
from .base import TrainBase
from model.optimization import BertAdam
from utils import get_args, calc_neighbor, cosine_similarity, euclidean_similarity
from utils.calc_utils import calc_map_k_matrix as calc_map_k
from dataset.dataloader import dataloader
###############添加
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # 這里輸入你的GPU_id
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
class Trainer(TrainBase):
def __init__(self,
rank=0):
args = get_args()
super(Trainer, self).__init__(args, rank)
self.logger.info("dataset len: {}".format(len(self.train_loader.dataset)))
self.run()
def _init_model(self):
self.logger.info("init model.")
linear = False
if self.args.hash_layer == "linear":
linear = True
self.logger.info("ViT+GPT!")
HashModel = DCMHT
self.model = HashModel(outputDim=self.args.output_dim, clipPath=self.args.clip_path,
writer=self.writer, logger=self.logger, is_train=self.args.is_train, linear=linear).to(self.rank)
####################################添加
self.model= nn.DataParallel(self.model.cuda())
if torch.cuda.device_count() >1:
print("Lets use",torch.cuda.device_count(),"GPUs!")
self.model.to(device)
if self.args.pretrained != "" and os.path.exists(self.args.pretrained):
self.logger.info("load pretrained model.")
self.model.load_state_dict(torch.load(self.args.pretrained, map_location=f"cuda:{self.rank}"))
self.model.float()
self.optimizer = BertAdam([
{'params': self.model.clip.parameters(), 'lr': self.args.clip_lr},
{'params': self.model.image_hash.parameters(), 'lr': self.args.lr},
{'params': self.model.text_hash.parameters(), 'lr': self.args.lr}
], lr=self.args.lr, warmup=self.args.warmup_proportion, schedule='warmup_cosine',
b1=0.9, b2=0.98, e=1e-6, t_total=len(self.train_loader) * self.args.epochs,
weight_decay=self.args.weight_decay, max_grad_norm=1.0)
print(self.model)添加以上代碼后一般還會(huì)報(bào)如下錯(cuò)誤
“AttributeError: ‘DataParallel’ object has no attribute ‘xxx’”
解決辦法為先在dataparallel后的model調(diào)用module模塊,然后再調(diào)用xxx
比如在上述我自己的代碼中會(huì)報(bào)錯(cuò)
AttributeError: ‘DataParallel’ object has no attribute ‘clip’
解決辦法:
是將model,修改為model.module.,后續(xù)報(bào)錯(cuò)大致相同,將你的代碼中涉及到model.的地方修改為model.module.即可。
self.optimizer = BertAdam([
{'params': self.model.module.clip.parameters(), 'lr': self.args.clip_lr},
{'params': self.model.module.image_hash.parameters(), 'lr': self.args.lr},
{'params': self.model.module.text_hash.parameters(), 'lr': self.args.lr}
], lr=self.args.lr, warmup=self.args.warmup_proportion,
檢查顯卡使用情況
打開終端,在終端輸入nvidia-smi命令可查看顯卡使用情況

成功使用雙顯卡跑代碼!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch出現(xiàn)錯(cuò)誤Attribute?Error:module?‘torch‘?has?no?attrib
這篇文章主要給大家介紹了關(guān)于Pytorch出現(xiàn)錯(cuò)誤Attribute?Error:module?‘torch‘?has?no?attribute?'_six'解決的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Pycharm終端顯示PS而不顯示虛擬環(huán)境名的解決
這篇文章主要介紹了Pycharm終端顯示PS而不顯示虛擬環(huán)境名的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python閉包原理與nonlocal關(guān)鍵字實(shí)戰(zhàn)指南
閉包是Python中一個(gè)強(qiáng)大而優(yōu)雅的特性,掌握它能讓你寫出更靈活、更模塊化的代碼,本文將深入解析閉包的原理,并通過(guò)實(shí)戰(zhàn)案例帶你徹底理解nonlocal關(guān)鍵字,感興趣的朋友跟隨小編一起看看吧2026-03-03
Python?dataframe如何設(shè)置index
這篇文章主要介紹了Python?dataframe如何設(shè)置index,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
wxPython中wx.gird.Gird添加按鈕的實(shí)現(xiàn)
本文主要介紹了wxPython中wx.gird.Gird添加按鈕的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python爬蟲beautifulsoup4常用的解析方法總結(jié)
今天小編就為大家分享一篇關(guān)于Python爬蟲beautifulsoup4常用的解析方法總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Flask框架的學(xué)習(xí)指南之制作簡(jiǎn)單blog系統(tǒng)
本文是Flask框架的學(xué)習(xí)指南系列文章的第二篇主要給大家講述制作一個(gè)簡(jiǎn)單的小項(xiàng)目blog系統(tǒng)的過(guò)程,有需要的小伙伴可以參考下2016-11-11
Linux下使用python調(diào)用top命令獲得CPU利用率
這篇文章主要介紹了Linux下使用python調(diào)用top命令獲得CPU利用率,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03
Django框架實(shí)現(xiàn)分頁(yè)顯示內(nèi)容的方法詳解
這篇文章主要介紹了Django框架實(shí)現(xiàn)分頁(yè)顯示內(nèi)容的方法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架引入bootstrap樣式進(jìn)行分頁(yè)顯示相關(guān)步驟、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2019-05-05

