溫馨提示×

PyTorch在Ubuntu上的分布式訓練

小樊
45
2025-07-05 20:57:08
欄目: 智能運維

PyTorch是一個流行的開源機器學習庫,它支持在多個GPU上進行分布式訓練。在Ubuntu上進行PyTorch的分布式訓練通常涉及以下步驟:

  1. 安裝PyTorch: 首先,確保你已經在Ubuntu系統上安裝了PyTorch。你可以從PyTorch官網獲取適合你系統的安裝命令。

  2. 設置環境變量: 為了啟用分布式訓練,你需要設置一些環境變量。例如,你可以設置NCCL_DEBUG=INFO來獲取NCCL(NVIDIA Collective Communications Library)的調試信息。

  3. 準備數據集: 分布式訓練通常需要將數據集分割成多個部分,每個部分由不同的進程處理。你可以使用PyTorch的DataLoaderDataset類來實現這一點。

  4. 編寫分布式訓練代碼: 在PyTorch中,你可以使用torch.nn.parallel.DistributedDataParallel來包裝你的模型,以實現模型的并行訓練。你需要確保每個進程都有自己的GPU,并且它們能夠通過網絡通信。

  5. 啟動分布式訓練: 使用torch.distributed.launch工具或者mp.spawn函數來啟動分布式訓練。你需要指定總的進程數、每個節點的GPU數量以及啟動腳本。

以下是一個簡單的分布式訓練腳本示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data import DataLoader, DistributedSampler
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 初始化進程組
world_size = 4  # 總進程數
rank = 0  # 當前進程的rank
master_ip = 'localhost'  # 主節點的IP地址
master_port = '12345'  # 主節點的端口號
torch.distributed.init_process_group(
    backend='nccl',  # 使用NCCL后端
    init_method=f'tcp://{master_ip}:{master_port}',
    world_size=world_size,
    rank=rank
)

# 定義模型
class Model(nn.Module):
    # ...

# 創建模型實例并移動到對應的GPU
model = Model().to(rank)

# 使用DistributedDataParallel包裝模型
model = DDP(model, device_ids=[rank])

# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 加載數據集
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_sampler = DistributedSampler(train_dataset)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, sampler=train_sampler)

# 訓練模型
for epoch in range(num_epochs):
    train_sampler.set_epoch(epoch)
    for data, target in train_loader:
        data, target = data.to(rank), target.to(rank)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

# 清理
torch.distributed.destroy_process_group()

在運行上述腳本之前,你需要確保所有節點都能夠通過網絡相互通信,并且已經安裝了必要的依賴庫,如NCCL和CUDA。

啟動分布式訓練的命令可能如下所示:

python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE YOUR_TRAINING_SCRIPT.py

或者使用mp.spawn

import torch.multiprocessing as mp

def train(rank, world_size):
    # 初始化進程組和分布式訓練代碼
    # ...

if __name__ == '__main__':
    world_size = 4
    mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)

請注意,這只是一個簡化的例子,實際的分布式訓練可能需要更復雜的設置,包括模型并行化、梯度累積、混合精度訓練等高級特性。

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