在Ubuntu上使用PyTorch进行并行计算可以通过多种方式实现,主要包括数据并行和模型并行。以下是一些基本步骤和示例代码,帮助你在Ubuntu环境下设置和使用PyTorch进行并行计算。
数据并行是指将数据分成多个小批次,然后将这些小批次分配给多个GPU进行处理。PyTorch提供了torch.nn.DataParallel模块来实现数据并行。
安装PyTorch: 确保你已经安装了PyTorch。你可以使用以下命令安装:
pip install torch torchvision
编写代码:
下面是一个简单的示例,展示如何使用DataParallel进行数据并行:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(784, 10)
def forward(self, x):
x = x.view(x.size(0), -1)
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 使用DataParallel包装模型
if torch.cuda.device_count() > 1:
print(f"Let's use {torch.cuda.device_count()} GPUs!")
model = nn.DataParallel(model)
# 将模型移动到GPU
model.cuda()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 加载数据集
transform = transforms.Compose([transforms.ToTensor()])
trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
# 训练模型
for epoch in range(5):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = inputs.cuda(), labels.cuda()
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print(f"[Epoch {epoch + 1}, Batch {i + 1}] loss: {running_loss / 100:.3f}")
running_loss = 0.0
print('Finished Training')
模型并行是指将模型的不同部分分配给不同的GPU进行处理。PyTorch没有内置的模型并行模块,但可以通过手动管理不同部分的计算来实现。
编写代码: 下面是一个简单的示例,展示如何手动实现模型并行:
import torch
import torch.nn as nn
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc1 = nn.Linear(784, 100).cuda(0)
self.fc2 = nn.Linear(100, 10).cuda(1)
def forward(self, x):
x = x.view(x.size(0), -1).cuda(0)
x = self.fc1(x)
x = x.cuda(1)
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleModel()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 加载数据集
transform = transforms.Compose([transforms.ToTensor()])
trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
# 训练模型
for epoch in range(5):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = inputs.cuda(0), labels.cuda(0)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print(f"[Epoch {epoch + 1}, Batch {i + 1}] loss: {running_loss / 100:.3f}")
running_loss = 0.0
print('Finished Training')
通过以上步骤,你可以在Ubuntu上使用PyTorch进行并行计算,提高训练速度和效率。