在 Linux 上使用 PyTorch 进行分布式训练,常见有 三种主流方式。下面按「从简单到专业」给你系统讲清楚,并附带可运行示例。
适合:多卡 / 多机训练,性能最好
torch.distributednccl(GPU)、gloo(CPU)torchrun --nproc_per_node=4 train.py
import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler
def main():
dist.init_process_group(backend="nccl")
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
model = MyModel().cuda(local_rank)
model = DDP(model, device_ids=[local_rank])
dataset = MyDataset()
sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, batch_size=32, sampler=sampler)
for x, y in loader:
x, y = x.cuda(local_rank), y.cuda(local_rank)
loss = model(x, y)
loss.backward()
optimizer.step()
if __name__ == "__main__":
main()
✅ 关键点
DistributedSamplerbatch_size 是 每张卡 的model = torch.nn.DataParallel(model.cuda())
❌ 问题:
| 机器 | IP |
|---|---|
| node0 | 192.168.1.1 |
| node1 | 192.168.1.2 |
# node0
torchrun \
--nnodes=2 \
--node_rank=0 \
--nproc_per_node=4 \
--master_addr=192.168.1.1 \
--master_port=29500 \
train.py
# node1
torchrun \
--nnodes=2 \
--node_rank=1 \
--nproc_per_node=4 \
--master_addr=192.168.1.1 \
--master_port=29500 \
train.py
dist.init_process_group(backend="gloo")
适合:
if dist.get_rank() == 0:
print(...)
torch.manual_seed(42)
num_workers 不要太大dist.is_available() and dist.is_initialized()
| 场景 | 方案 |
|---|---|
| 单机多卡 | ✅ DDP |
| 多机多卡 | ✅ DDP + torchrun |
| 快速测试 | ❌ DataParallel |
| CPU | gloo |
如果你愿意,可以告诉我:
我可以直接给你 可拷贝的完整训练模板。