Skip to content

多节点多卡分布式训练


快速在单机多卡或多机多卡环境中,使用 PyTorch DistributedDataParallel(DDP)训练 ResNet-18 完成 CIFAR-10 分类任务。

测试

  1. 准备数据集:拷贝相关数据集到根目录:

    bash
    cd /root
    cp /datasets/data/cifar-10-python.tar.gz .
  2. 获取训练脚本:

    bash
    cp /datasets/data/mnmc_ddp.py .
  3. 执行训练:

    bash
    OMP_NUM_THREADS=1 torchrun --nnodes=[填写训练机器数量] \
    --nproc_per_node=[填写每台机器的显卡数量] \
    --master_addr=[填写管理节点IP(多个机器中的一个机器IP)] \
    --master_port=12345 \
    --node_rank=[填写当前机器的序号] mnmc_ddp.py

    执行训练之前,需要先设定一个管理节点机器的IP,通过apt update && apt install net-tools -y && ifconfig查看网卡eth0的IP
    示例图片

    假设您租用了两台机器(两个实例),机器1有一张显卡,机器2有两张显卡。那么您应该

    在机器1执行:

    bash
    OMP_NUM_THREADS=1 torchrun --nnodes=2 --nproc_per_node=1 --master_addr=172.16.218.118 --master_port=12345 --node_rank=0 mnmc_ddp.py

    在机器2执行:

    bash
    OMP_NUM_THREADS=1 torchrun --nnodes=2 --nproc_per_node=2 --master_addr=172.16.218.118 --master_port=12345 --node_rank=1 mnmc_ddp.py

    说明:

    • --nproc_per_node=n 表示在本机起 n 个进程,对应 n 张 GPU。
    • 端口 12345 可任意未占用端口。
    • 只有 rank 0 的进程会打印日志。
    • 如果是单机多卡,使用OMP_NUM_THREADS=1 torchrun --nnodes=1 --nproc_per_node=[单机卡数] mnmc_ddp.py

常见问题

  1. NCCL 报错 “unreachable”
    • 多机训练检查各节点端口互通:nc -v <master_addr> 12345
    • 单机训练确认 CUDA_VISIBLE_DEVICES 未误设。
  2. 显存不足
    • 减小 BATCH_SIZE。
    • 检查无其他进程占卡:nvidia-smi
  3. 日志刷屏
    • 只有 rank 0 打印,属正常设计。
  4. 下载 CIFAR-10 卡住
    • 手动下载 cifar-10-python.tar.gz 放到当前目录即可跳过自动下载。