在CentOS上使用PyTorch進行分布式訓練,通常涉及以下幾個步驟:
環境準備:
nccl
,openmpi
或mvapich
等,這些庫對于分布式訓練至關重要。網絡配置:
啟動分布式訓練:
torch.distributed.launch
工具或torch.multiprocessing.spawn
來啟動分布式訓練。以下是一個簡單的示例,展示如何在CentOS上使用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
from torchvision import datasets, transforms
def train(rank, world_size):
# 初始化進程組
dist.init_process_group(backend='nccl', init_method='tcp://<master_ip>:<master_port>', world_size=world_size, rank=rank)
# 創建模型并將其移動到對應的GPU
model = nn.Linear(10, 10).to(rank)
# 使用DistributedDataParallel包裝模型
ddp_model = DDP(model, device_ids=[rank])
# 創建數據加載器
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)
loader = DataLoader(dataset, batch_size=64, sampler=sampler)
# 創建優化器
optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)
# 訓練循環
for epoch in range(5):
sampler.set_epoch(epoch)
for data, target in loader:
data, target = data.to(rank), target.to(rank)
optimizer.zero_grad()
output = ddp_model(data)
loss = nn.functional.cross_entropy(output, target)
loss.backward()
optimizer.step()
print(f'Rank {rank}, Epoch {epoch}, Loss {loss.item()}')
# 清理進程組
dist.destroy_process_group()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--world_size', type=int, default=4, help='number of distributed processes')
parser.add_argument('--rank', type=int, default=0, help='rank 0 for master node')
args = parser.parse_args()
train(args.rank, args.world_size)
在運行上述腳本之前,你需要確保所有節點都已經安裝了PyTorch和相關的依賴庫,并且已經配置好了網絡和SSH無密碼登錄。然后,你可以使用以下命令來啟動分布式訓練:
python -m torch.distributed.launch --nproc_per_node=<num_gpus_per_node> --nnodes=<num_nodes> --node_rank=<node_rank> <your_training_script.py> --world_size <total_world_size> --rank <rank>
其中:
<num_gpus_per_node>
是每個節點上的GPU數量。<num_nodes>
是參與訓練的節點總數。<node_rank>
是當前節點的排名(從0開始)。<total_world_size>
是參與訓練的總進程數,等于<num_gpus_per_node> * <num_nodes>
。<rank>
是當前進程的排名(從0開始)。請根據你的實際情況替換上述命令中的參數。