在 CentOS 上使用 PyTorch 进行多卡训练,常见方式有两种:DataParallel(DP) 和 DistributedDataParallel(DDP)。生产环境强烈推荐 DDP。
下面按“环境准备 → 单机多卡 → 多机多卡”说明。
nvidia-smi
能看到多张卡即正常。
确保 CUDA 版本与 PyTorch 匹配:
nvcc -V
pip install torch torchvision torchaudio
或指定 CUDA 版本:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
import torch
import torch.nn as nn
model = MyModel()
model = nn.DataParallel(model)
model.cuda()
⚠️ 缺点:
torchrun \
--nproc_per_node=4 \
train.py
4 = 4 张 GPU
import torch
import torch.distributed as dist
import torch.multiprocessing as mp
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("nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()
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()
主节点(node0)
torchrun \
--nnodes=2 \
--node_rank=0 \
--nproc_per_node=4 \
--master_addr=192.168.1.10 \
--master_port=29500 \
train.py
从节点(node1)
torchrun \
--nnodes=2 \
--node_rank=1 \
--nproc_per_node=4 \
--master_addr=192.168.1.10 \
--master_port=29500 \
train.py
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0
gradient_checkpointingCUDA_VISIBLE_DEVICES=0,1,2,3 torchrun ...
| 场景 | 方式 |
|---|---|
| 调试 / 小模型 | DataParallel |
| 训练大模型 | DDP |
| 多机训练 | DDP + torchrun |
如果你愿意,可以告诉我:
我可以直接给你可运行的启动脚本。