不同方式“选卡”方法不一样:
DataParallel(不推荐)DistributedDataParallel (DDP) ✅ 推荐DDP + 多进程CUDA_VISIBLE_DEVICES(最常用)这是物理选卡的标准做法。
CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py含义:
cuda:0 → 物理 GPU 0cuda:1 → 物理 GPU 1✅ 适合:
local_rank 选卡(推荐)import os
import torch
import torch.distributed as dist
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)启动方式:
torchrun --nproc_per_node=4 train.py✅ 优点:
gpu_id = [0, 2, 3]
torch.cuda.set_device(gpu_id[local_rank])每台机器都:
CUDA_VISIBLE_DEVICES=0,1,2,3 \
torchrun \
--nnodes=2 \
--node_rank=0 \
--nproc_per_node=4 \
--master_addr=192.168.1.1 \
--master_port=29500 \
train.pynode_rank 区分机器local_rank 区分本机 GPUCUDA_VISIBLE_DEVICES 控制nvidia-smi topo -m优先选择:
例如:
GPU0 GPU1 GPU2 GPU3
GPU0 X NV4 SYS SYS0,1 而不是 0,2❌ 错误 1:
device = "cuda:0"所有进程都用 0 号卡 → OOM
❌ 错误 2:
CUDA_VISIBLE_DEVICES=0,1
torchrun --nproc_per_node=4只有 2 张卡,却开 4 个进程
✅ 正确:
CUDA_VISIBLE_DEVICES=0,1
torchrun --nproc_per_node=2PyTorch 分布式训练选卡 =CUDA_VISIBLE_DEVICES控制物理卡 +local_rank控制逻辑卡
如果你愿意,可以告诉我:
torchrun 还是 mp.spawn?我可以直接给你一份可运行模板。