服务器利用PyTorch对多个GPU或单个GPU使用的几个方式

由于要在服务器的不同GPU中进行模型训练,这里记录一下改变使用GPU的一些方式。

一、单个GUP使用修改

Note:“cuda:0"或"cuda"都代表起始device_id为0,系统默认从0开始。可根据需要修改起始位置,如“cuda:1”等效"cuda:0"或"cuda”

# 任取一个,torch版本不同会有差别
torch.cuda.device(id)  # id 是GPU编号
or 
torch.cuda.set_device(id)
or
torch.device('cuda') 

还有一种方式是在终端指定运行GPU:

CUDA_VISIBLE_DEVICES=1 python main.py,表示只有第1块gpu可见,其他gpu不可用。第1块gpu编号已变成第0块,如果依然使用cuda:1会报invalid device ordinal;以下同效。

单GPU中保存训练模型(2选1)

state = {'model': self.model.state_dict(), 'epoch': ite}
torch.save(state, self.model.name())

or   # 直接保存
torch.save(self.model.state_dict(), 'Mymodel.pth')  # 当前目录

单GPU/CPU中加载 single-gpu 训练模型(3选1)

checkpoint = torch.load(self.model.name())
self.model.load_state_dict(checkpoint['model'])

or   # 直接加载
self.model.load_state_dict(torch.load('Mymodel.pth'))

or   # load gpu or cpu
if torch.cuda.is_available(): # gpu
    self.model.load_state_dict(torch.load('Mymodel.pth'))
else: # cpu  官方推荐CPU的加载方式
    checkpoint = torch.load(self.model.name(),map_location=lambda storage, loc: storage)
	self.model.load_state_dict(checkpoint['model'])

二、多个GPU使用修改

1. 在终端shell:CUDA_VISIBLE_DEVICES=0,1,3 python main.py

2.

# gpu_ids = [0, 1, 3]   # 或 os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,3"
# os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, [0, 1, 3]))
import os 
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,3"  # CUDA_VISIBLE_DEVICES 表当前可被python程序检测到的显卡
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")  # 多GPU时可指定起始位置/编号

# 若不加if项,也不报错,但训练可能会变成单GPU
if torch.cuda.device_count() > 1: # 查看当前电脑可用的gpu数量,或 if len(gpu_ids) > 1:
    print("Let's use", torch.cuda.device_count(), "GPUs!")
    # self.model = torch.nn.DataParallel(self.model, device_ids=gpu_ids)
    self.model = torch.nn.DataParallel(self.model)    # 声明所有设备
net = self.model.to(device)        # 从指定起始位置开始,将模型放到gpu或cpu上
images = self.images.to(device)    # 模型和训练数据都放在主设备
labels = self.labels.to(device)

Note:使用多GPU训练,单用 model = torch.nn.DataParallel(model),默认所有存在的显卡都会被使用。

多GPU中保存训练模型(3选1)

if isinstance(self.model,torch.nn.DataParallel):  # 判断是否并行
    self.model = self.model.module
state = {'model': self.model.state_dict(), 'epoch': ite}
torch.save(state, self.model.name())  # No-module
    
or
if isinstance(self.model, torch.nn.DataParallel):
    torch.save(self.model.module.stat_dict, 'Mymodel')  # No-module
else:
    torch.save(self.model.stat_dict, 'Mymodel')  # No-module

or    # 直接保存
torch.save(self.model.state_dict(), 'Mymodel.pth')  # is-module

PyTorch是一个流行的深度学习框架,支持使用单个GPU多个GPUs进行训练和测试。在使用单个GPU时,需要将模型和数据加载到GPU上。使用单个GPU进行训练和测试的示例代码如下: 示例代码如下: ```python #将模型加载到GPU device = torch.device('cuda:0') #选择第一个GPU model.to(device) #将数据加载到GPU x = x.to(device) y = y.to(device) #在GPU上进行前向传播 y_pred = model(x) #计算损失 loss = criterion(y_pred, y) #在GPU上进行反向传播 loss.backward() #更新权重 optimizer.step() ``` 使用多个GPU可以加快训练和测试的速度。PyTorch提供了两种多GPU的方法:DataParallel和DistributedDataParallel(DDP)。其中,DataParallel是在单台机器上使用多个GPU的方法,而DDP是在多台机器上使用多个GPU的方法。 使用DataParallel时,可以将模型和数据加载到单个GPU上,然后使用torch.nn.DataParallel将模型复制到其他GPU上。使用DataParallel进行训练和测试的示例代码如下: 示例代码如下: ```python #将模型加载到GPU device = torch.device('cuda:0') #选择第一个GPU model.to(device) #使用DataParallel将模型复制到其他GPU上 if torch.cuda.device_count() > 1: model = nn.DataParallel(model) #将数据加载到GPU x = x.to(device) y = y.to(device) #在GPU上进行前向传播 y_pred = model(x) #计算损失 loss = criterion(y_pred, y) #在GPU上进行反向传播 loss.backward() #更新权重 optimizer.step() ``` 使用DDP时,需要在多台机器上安装PyTorch和NCCL库,并按照官方文档中的说明进行配置。使用DDP进行训练和测试的示例代码如下: ```python #在每个进程中选择一个GPU device = torch.device('cuda', rank % torch.cuda.device_count()) #使用DistributedDataParallel初始化模型 model = nn.parallel.DistributedDataParallel(model, device_ids=[device]) #在GPU上进行前向传播 y_pred = model(x) #计算损失 loss = criterion(y_pred, y) #在GPU上进行反向传播 loss.backward() #更新权重 optimizer.step() ``` 以上就是PyTorch使用单个GPU多个GPU进行训练和测试的方法。具体使用哪种方法,需要根据硬件和应用场景的要求进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬晚归客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值