在PyTorch中,我们可以使用单个GPU或多个GPU进行模型训练和测试。本文将详细讲解如何使用单个GPU和多个GPU进行训练和测试,并提供两个示例说明。
1. 使用单个GPU进行训练和测试
在PyTorch中,我们可以使用torch.cuda.device()方法将模型和数据移动到GPU上,并使用torch.nn.DataParallel()方法将模型复制到多个GPU上进行并行计算。以下是使用单个GPU进行训练和测试的示例代码:
import torch
import torch.nn as nn
# 定义模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 2)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 实例化模型
net = Net()
# 将模型和数据移动到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(10):
# 训练代码
pass
# 测试模型
net.eval()
with torch.no_grad():
# 测试代码
pass
在上面的代码中,我们首先定义了一个包含两个全连接层的模型Net。然后,我们实例化了该模型,并使用torch.device()方法将模型和数据移动到GPU上。接下来,我们定义了损失函数和优化器,并使用它们训练模型。最后,我们使用net.eval()方法将模型设置为评估模式,并使用torch.no_grad()方法关闭梯度计算,进行模型测试。
2. 使用多个GPU进行训练和测试
在PyTorch中,我们可以使用torch.nn.DataParallel()方法将模型复制到多个GPU上进行并行计算。以下是使用多个GPU进行训练和测试的示例代码:
import torch
import torch.nn as nn
# 定义模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 2)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 实例化模型
net = Net()
# 将模型和数据移动到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)
# 复制模型到多个GPU上
if torch.cuda.device_count() > 1:
net = nn.DataParallel(net)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(10):
# 训练代码
pass
# 测试模型
net.eval()
with torch.no_grad():
# 测试代码
pass
在上面的代码中,我们首先定义了一个包含两个全连接层的模型Net。然后,我们实例化了该模型,并使用torch.device()方法将模型和数据移动到GPU上。接下来,我们使用torch.cuda.device_count()方法判断GPU数量,如果GPU数量大于1,则使用nn.DataParallel()方法将模型复制到多个GPU上进行并行计算。接下来,我们定义了损失函数和优化器,并使用它们训练模型。最后,我们使用net.eval()方法将模型设置为评估模式,并使用torch.no_grad()方法关闭梯度计算,进行模型测试。
3. 示例3:使用DistributedDataParallel进行分布式训练
除了使用torch.nn.DataParallel()方法进行多GPU训练外,我们还可以使用torch.nn.parallel.DistributedDataParallel()方法进行分布式训练。以下是使用DistributedDataParallel进行分布式训练的示例代码:
import torch
import torch.nn as nn
import torch.distributed as dist
import torch.multiprocessing as mp
# 定义模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 2)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 定义训练函数
def train(rank, world_size):
# 初始化进程组
dist.init_process_group("gloo", rank=rank, world_size=world_size)
# 实例化模型
net = Net()
# 将模型和数据移动到GPU上
device = torch.device("cuda:{}".format(rank))
net.to(device)
# 分布式训练
net = nn.parallel.DistributedDataParallel(net, device_ids=[rank])
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(10):
# 训练代码
pass
# 释放进程组
dist.destroy_process_group()
# 启动多个进程进行分布式训练
if __name__ == "__main__":
world_size = 2
mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)
在上面的代码中,我们首先定义了一个包含两个全连接层的模型Net。然后,我们定义了一个train()函数,该函数使用torch.distributed.init_process_group()方法初始化进程组,并使用torch.nn.parallel.DistributedDataParallel()方法进行分布式训练。接下来,我们定义了损失函数和优化器,并使用它们训练模型。最后,我们使用torch.distributed.destroy_process_group()方法释放进程组,并使用torch.multiprocessing.spawn()方法启动多个进程进行分布式训练。
需要注意的是,分布式训练需要在多个节点上进行,需要在每个节点上运行相同的代码,并使用相同的进程组名称和进程组大小。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 使用单个GPU与多个GPU进行训练与测试的方法 - Python技术站