溫馨提示×

Linux上PyTorch如何進行分布式訓練

小樊
48
2025-07-19 18:53:01
欄目: 智能運維

在Linux上進行PyTorch的分布式訓練,你需要遵循以下步驟:

  1. 環境準備

    • 確保你有一個支持分布式訓練的環境,通常需要多個GPU或者多臺機器。
    • 安裝PyTorch,確保它支持分布式訓練。你可以從PyTorch官網獲取適合你系統的安裝命令。
  2. 初始化分布式環境

    • 使用torch.distributed.init_process_group函數來初始化分布式環境。你需要指定后端(如nccl、gloo等)、初始化方法(如tcp://intra)、世界大?。纯偟倪M程數)和當前進程的rank(每個進程的唯一標識符)。
  3. 數據并行

    • 使用torch.nn.parallel.DistributedDataParallel(DDP)來包裝你的模型。DDP會自動處理數據的劃分、梯度的聚合等。
  4. 編寫分布式訓練代碼

    • 在你的訓練腳本中,需要添加邏輯來處理分布式訓練的特殊部分,比如數據加載器的設置、模型的分發、梯度的同步等。
  5. 運行分布式訓練

    • 使用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是你的訓練腳本的名稱。在分布式訓練中,每個進程都會運行相同的腳本,但是它們會有不同的rankworld_size參數。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女