在Linux上進行PyTorch的分布式訓練,你需要遵循以下步驟:
環境準備:
初始化分布式環境:
torch.distributed.init_process_group
函數來初始化分布式環境。你需要指定后端(如nccl
、gloo
等)、初始化方法(如tcp://
或intra
)、世界大?。纯偟倪M程數)和當前進程的rank(每個進程的唯一標識符)。數據并行:
torch.nn.parallel.DistributedDataParallel
(DDP)來包裝你的模型。DDP會自動處理數據的劃分、梯度的聚合等。編寫分布式訓練代碼:
運行分布式訓練:
mpirun
、mpiexec
或者torch.distributed.launch
來啟動分布式訓練。你需要指定總的進程數、每個進程的入口腳本等。下面是一個簡單的例子,展示了如何在Linux上使用PyTorch進行分布式訓練:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP
import torch.distributed as dist
from torch.utils.data import DataLoader, DistributedSampler
import torchvision.datasets as datasets
import torchvision.transforms as transforms
def main(rank, world_size):
# 初始化分布式環境
dist.init_process_group(
backend='nccl',
init_method='tcp://localhost:23456',
world_size=world_size,
rank=rank
)
# 創建模型并將其移動到對應的GPU
model = ... # 定義你的模型
model.cuda(rank)
model = DDP(model, device_ids=[rank])
# 創建損失函數和優化器
criterion = nn.CrossEntropyLoss().cuda(rank)
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 加載數據集
transform = transforms.Compose([transforms.ToTensor()])
dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
dataloader = DataLoader(dataset, batch_size=64, sampler=sampler)
# 訓練模型
for epoch in range(10):
sampler.set_epoch(epoch)
running_loss = 0.0
for i, data in enumerate(dataloader, 0):
inputs, labels = data[0].cuda(rank), data[1].cuda(rank)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Rank {rank}, Epoch {epoch}, Loss: {running_loss/len(dataloader)}')
# 清理分布式環境
dist.destroy_process_group()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--world_size', type=int, default=2)
parser.add_argument('--rank', type=int, default=0)
args = parser.parse_args()
main(args.rank, args.world_size)
要運行這個腳本,你需要使用torch.distributed.launch
或者mpirun
/mpiexec
。例如:
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE YOUR_TRAINING_SCRIPT.py
或者使用mpirun
:
mpirun -np NUM_GPUS_YOU_HAVE -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib YOUR_TRAINING_SCRIPT.py
請注意,這里的NUM_GPUS_YOU_HAVE
是你想要使用的GPU數量,YOUR_TRAINING_SCRIPT.py
是你的訓練腳本的名稱。在分布式訓練中,每個進程都會運行相同的腳本,但是它們會有不同的rank
和world_size
參數。