PyTorch是一个非常流行的深度学习框架,支持分布式多卡并行,可以利用多个GPU加速模型训练。在多卡并行训练时,载入模型操作是非常重要的一个环节。本文将详细讲解PyTorch中多卡并行载入模型的详细攻略。
1.使用torch.nn.DataParallel
首先,PyTorch提供了torch.nn.DataParallel
模块,可以方便地实现多卡并行。对于已有的模型,只需将其传入DataParallel
并指定使用的GPU,即可自动并行运算。同时,对于每个GPU,所有的权重和梯度都被复制到该GPU上,每个GPU均独立训练。
示例1: 对于已有的model
,使用DataParallel
实现多卡并行:
import torch
import torch.nn as nn
# 假设我们有一台机器,有4个GPU
device_ids = [0, 1, 2, 3]
# 定义模型
model = nn.Sequential(
nn.Linear(10, 10),
nn.ReLU(),
nn.Linear(10, 5)
)
# 使用DataParallel
model = nn.DataParallel(model, device_ids=device_ids)
# 将模型移到GPU上
model = model.cuda(device_ids[0])
示例2: 对于已有的model
,使用DataParallel
并行训练数据集:
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# 假设我们有一台机器,有4个GPU
device_ids = [0, 1, 2, 3]
# 定义模型
model = nn.Sequential(
nn.Linear(10, 10),
nn.ReLU(),
nn.Linear(10, 5)
)
# 使用DataParallel
model = nn.DataParallel(model, device_ids=device_ids)
# 将数据集移到GPU上
X_train = torch.randn(1000, 10)
y_train = torch.randint(0, 5, (1000,))
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, pin_memory=True)
for X_batch, y_batch in train_loader:
X_batch = X_batch.cuda(device_ids[0])
y_batch = y_batch.cuda(device_ids[0])
# 将模型移到GPU上
model = model.cuda(device_ids[0])
# 训练模型
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
for epoch in range(10):
for X_batch, y_batch in train_loader:
y_pred = model(X_batch)
loss = loss_fn(y_pred, y_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
2.使用torch.nn.parallel.DistributedDataParallel
除了DataParallel
,PyTorch还提供了更加灵活的分布式多卡并行DistributedDataParallel
模块,可以自由控制每个卡上的模型参数,同时支持多机训练。其中,使用方法和DataParallel
基本相同,不同的是需要使用torch.distributed
模块中的函数初始化和销毁进程组,并设置每个GPU的参数。
示例3: 对于已有的模型,使用DistributedDataParallel
实现多卡并行:
import torch
import torch.nn as nn
import torch.distributed as dist
# 假设我们有一台机器,有4个GPU,使用端口号为1234的初始化方法
device_ids = [0, 1, 2, 3]
dist.init_process_group(backend='nccl', init_method='tcp://localhost:1234', world_size=len(device_ids), rank=device_ids[0])
# 定义模型
model = nn.Sequential(
nn.Linear(10, 10),
nn.ReLU(),
nn.Linear(10, 5)
)
# 设置模型参数,指定每个GPU上的模型参数
for i in range(1, len(device_ids)):
model.module.add_module('linear%d' % i, nn.Linear(10, 5))
setattr(model, 'linear%d' % i, getattr(model.module, 'linear%d' % i).to(device_ids[i]))
# 使用DistributedDataParallel
model = nn.parallel.DistributedDataParallel(model, device_ids=device_ids)
# 将模型移到GPU上
model = model.cuda(device_ids[0])
示例4: 对于已有的model
,使用DistributedDataParallel
并行训练数据集:
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
import torch.distributed as dist
# 假设我们有一台机器,有4个GPU,使用端口号为1234的初始化方法
device_ids = [0, 1, 2, 3]
dist.init_process_group(backend='nccl', init_method='tcp://localhost:1234', world_size=len(device_ids), rank=device_ids[0])
# 定义模型
model = nn.Sequential(
nn.Linear(10, 10),
nn.ReLU(),
nn.Linear(10, 5)
)
# 设置模型参数,指定每个GPU上的模型参数
for i in range(1, len(device_ids)):
model.module.add_module('linear%d' % i, nn.Linear(10, 5))
setattr(model, 'linear%d' % i, getattr(model.module, 'linear%d' % i).to(device_ids[i]))
# 使用DistributedDataParallel
model = nn.parallel.DistributedDataParallel(model, device_ids=device_ids)
# 将数据集移到GPU上
X_train = torch.randn(1000, 10)
y_train = torch.randint(0, 5, (1000,))
train_dataset = TensorDataset(X_train, y_train)
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
train_loader = DataLoader(train_dataset, batch_size=32, sampler=train_sampler, pin_memory=True)
for X_batch, y_batch in train_loader:
X_batch = X_batch.cuda(device_ids[0])
y_batch = y_batch.cuda(device_ids[0])
# 将模型移到GPU上
model = model.cuda(device_ids[0])
# 训练模型
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
for epoch in range(10):
train_sampler.set_epoch(epoch)
for X_batch, y_batch in train_loader:
y_pred = model(X_batch)
loss = loss_fn(y_pred, y_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 销毁进程组
dist.destroy_process_group()
以上就是PyTorch中多卡并行载入模型的完整攻略,包含了使用DataParallel
和DistributedDataParallel
处理多卡并行的两条示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch distributed 多卡并行载入模型操作 - Python技术站