当前位置:   article > 正文

pytorch配置双显卡,使用双显卡跑代码_pytorch-gpu 双卡测试代码

pytorch-gpu 双卡测试代码

项目场景:

Linux系统,pytorch环境


问题描述

使用的服务器有两张显卡,感觉一张显卡跑代码比较慢,想配置两张显卡同时跑代码,只需要在你的代码中添加几行,就可以使用双显卡,亲测有效。


解决方案:

提示:这里填写该问题的具体解决方案:

先看以下官方示例代码,插入添加的地方是需要我们添加在代码中的代码行

  1. import torch
  2. import torch.nn as nn
  3. from torch.utils.data import Dataset, DataLoader
  4. import os
  5. #######添加
  6. os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # 这里输入你的GPU_id
  7. # Parameters and DataLoaders
  8. input_size = 5
  9. output_size = 2
  10. batch_size = 30
  11. data_size = 100
  12. #######添加
  13. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  14. # Dummy DataSet
  15. class RandomDataset(Dataset):
  16. def __init__(self, size, length):
  17. self.len = length
  18. self.data = torch.randn(length, size)
  19. def __getitem__(self, index):
  20. return self.data[index]
  21. def __len__(self):
  22. return self.len
  23. rand_loader = DataLoader(dataset=RandomDataset(input_size, data_size),
  24. batch_size=batch_size, shuffle=True)
  25. # Simple Model
  26. class Model(nn.Module):
  27. # Our model
  28. def __init__(self, input_size, output_size):
  29. super(Model, self).__init__()
  30. self.fc = nn.Linear(input_size, output_size)
  31. def forward(self, input):
  32. output = self.fc(input)
  33. print("\tIn Model: input size", input.size(),
  34. "output size", output.size())
  35. return output
  36. ################添加
  37. # Create Model and DataParallel
  38. model = Model(input_size, output_size)
  39. if torch.cuda.device_count() > 1:
  40. print("Let's use", torch.cuda.device_count(), "GPUs!")
  41. model = nn.DataParallel(model)
  42. model.to(device)
  43. #Run the Model
  44. for data in rand_loader:
  45. input = data.to(device)
  46. output = model(input)
  47. print("Outside: input size", input.size(),
  48. "output_size", output.size())

其中我将model = nn.DataParallel(model)修改为model = nn.DataParallel(model.cuda()),这一步直接参照网上修改的,因此这一步没有报错。

比如我自己在我代码中添加如下:

  1. from model.hash_model import DCMHT as DCMHT
  2. import os
  3. from tqdm import tqdm
  4. import torch
  5. import torch.nn as nn
  6. from torch.utils.data import DataLoader
  7. import scipy.io as scio
  8. from .base import TrainBase
  9. from model.optimization import BertAdam
  10. from utils import get_args, calc_neighbor, cosine_similarity, euclidean_similarity
  11. from utils.calc_utils import calc_map_k_matrix as calc_map_k
  12. from dataset.dataloader import dataloader
  13. ###############添加
  14. os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # 这里输入你的GPU_id
  15. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  16. class Trainer(TrainBase):
  17. def __init__(self,
  18. rank=0):
  19. args = get_args()
  20. super(Trainer, self).__init__(args, rank)
  21. self.logger.info("dataset len: {}".format(len(self.train_loader.dataset)))
  22. self.run()
  23. def _init_model(self):
  24. self.logger.info("init model.")
  25. linear = False
  26. if self.args.hash_layer == "linear":
  27. linear = True
  28. self.logger.info("ViT+GPT!")
  29. HashModel = DCMHT
  30. self.model = HashModel(outputDim=self.args.output_dim, clipPath=self.args.clip_path,
  31. writer=self.writer, logger=self.logger, is_train=self.args.is_train, linear=linear).to(self.rank)
  32. ####################################添加
  33. self.model= nn.DataParallel(self.model.cuda())
  34. if torch.cuda.device_count() >1:
  35. print("Lets use",torch.cuda.device_count(),"GPUs!")
  36. self.model.to(device)
  37. if self.args.pretrained != "" and os.path.exists(self.args.pretrained):
  38. self.logger.info("load pretrained model.")
  39. self.model.load_state_dict(torch.load(self.args.pretrained, map_location=f"cuda:{self.rank}"))
  40. self.model.float()
  41. self.optimizer = BertAdam([
  42. {'params': self.model.clip.parameters(), 'lr': self.args.clip_lr},
  43. {'params': self.model.image_hash.parameters(), 'lr': self.args.lr},
  44. {'params': self.model.text_hash.parameters(), 'lr': self.args.lr}
  45. ], lr=self.args.lr, warmup=self.args.warmup_proportion, schedule='warmup_cosine',
  46. b1=0.9, b2=0.98, e=1e-6, t_total=len(self.train_loader) * self.args.epochs,
  47. weight_decay=self.args.weight_decay, max_grad_norm=1.0)
  48. print(self.model)

 添加以上代码后一般还会报如下错误:

“AttributeError: ‘DataParallel’ object has no attribute ‘xxx’”,解决办法为先在dataparallel后的model调用module模块,然后再调用xxx。

 比如在上述我自己的代码中会报错“AttributeError: ‘DataParallel’ object has no attribute ‘clip’”,

解决办法是将model,修改为model.module.,后续报错大致相同,将你的代码中涉及到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命令可查看显卡使用情况

成功使用双显卡跑代码!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/53788
推荐阅读
相关标签
  

闽ICP备14008679号