在Linux上进行PyTorch并行计算,主要依赖于PyTorch提供的多GPU支持。以下是一些关键步骤和技巧:
nvidia-smi命令检查你的GPU是否被正确识别。数据并行是最常见的并行方式,它将数据分割到多个GPU上进行处理,然后将结果合并。
import torch
import torch.nn as nn
import torch.optim as optim
# 假设你有一个模型和一个数据加载器
model = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(),
nn.Linear(128, 10)
).cuda() # 将模型移动到GPU
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 使用DataParallel进行数据并行
if torch.cuda.device_count() > 1:
print(f"Let's use {torch.cuda.device_count()} GPUs!")
model = nn.DataParallel(model)
# 假设你有一个数据加载器
for data, target in dataloader:
data, target = data.cuda(), target.cuda() # 将数据和目标移动到GPU
optimizer.zero_grad()
output = model(data)
loss = nn.CrossEntropyLoss()(output, target)
loss.backward()
optimizer.step()
模型并行是将模型的不同部分放在不同的GPU上进行处理。这种方式适用于模型非常大,无法放入单个GPU内存的情况。
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.part1 = nn.Linear(784, 128).cuda(0)
self.part2 = nn.Linear(128, 10).cuda(1)
def forward(self, x):
x = x.cuda(0)
x = self.part1(x)
x = x.cuda(1)
x = self.part2(x)
return x
model = MyModel()
分布式并行是在多个机器上进行并行计算,适用于大规模训练任务。PyTorch提供了torch.distributed模块来支持分布式训练。
pip install torch torchvision torchaudio
import torch.distributed as dist
import torch.multiprocessing as mp
def train(rank, world_size):
dist.init_process_group(backend='nccl', init_method='env://', world_size=world_size, rank=rank)
model = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(),
nn.Linear(128, 10)
).to(rank)
optimizer = optim.SGD(model.parameters(), lr=0.01)
for data, target in dataloader:
data, target = data.to(rank), target.to(rank)
optimizer.zero_grad()
output = model(data)
loss = nn.CrossEntropyLoss()(output, target)
loss.backward()
optimizer.step()
def main():
world_size = 4
mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)
if __name__ == "__main__":
main()
python -m torch.distributed.launch --nproc_per_node=4 your_script.py
通过以上步骤,你可以在Linux上有效地进行PyTorch并行计算。