一、问题背景:加了GPU,训练为什么没有线性变快

当单卡无法容纳模型,或者大模型训练耗时过长时,开发者通常会考虑多 GPU。但“多插几张卡”并不等于训练速度自动翻倍。多卡之间需要同步梯度、交换数据,如果代码结构、通信或数据加载没有处理好,GPU数量增加后反而可能出现利用率下降。

多 GPU 常见方式包括数据并行、张量并行和流水线并行。对于普通 PyTorch 深度学习项目,从单卡迁移到 DistributedDataParallel(DDP)通常是比较容易理解的第一步。使用GPU算力平台时,也应先确认任务是否真正适合扩展,而不是只看GPU数量。

二、环境准备:确认多卡是否可见

先查看当前服务器 GPU:

nvidia-smi

再用 PyTorch 检查:

import torch
print(torch.cuda.device_count())

如果返回 4,说明当前进程可以看到4张GPU。准备环境时还需要保证各训练进程使用相同代码、数据路径和依赖版本。

对于GPU服务器租用场景,应同时关注显存容量和多卡通信效率。大模型训练是否适合多卡,还与模型拆分方式、Batch Size和数据吞吐有关。

三、实操步骤:把单卡训练改成DDP

1. 初始化分布式进程组

import os
import torch
import torch.distributed as dist

dist.init_process_group(backend="nccl")
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)

NCCL 是 NVIDIA GPU 场景常见的通信后端。

2. 包装模型

from torch.nn.parallel import DistributedDataParallel as DDP

model = MyModel().to(device)
model = DDP(model, device_ids=[local_rank])

DDP 会为每张 GPU 启动独立训练进程,并在反向传播阶段同步梯度。

3. 使用DistributedSampler

from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler

sampler = DistributedSampler(dataset)

loader = DataLoader(
    dataset,
    batch_size=8,
    sampler=sampler
)

每轮训练前设置:

sampler.set_epoch(epoch)

这样不同 GPU 会处理不同数据分片,避免重复读取同一批样本。

4. 使用torchrun启动

例如4张GPU:

torchrun --nproc_per_node=4 train.py

运行后继续用:

watch -n 1 nvidia-smi

观察四张卡的显存和利用率是否均衡。

5. 先做2卡验证,再扩大规模

多卡问题往往比单卡更难定位。建议先用2张GPU确认 loss、梯度和 checkpoint 都正常,再扩大到4卡或更多。调试阶段可以输出每个进程的 rank 与 device:

print(dist.get_rank(), torch.cuda.current_device())

如果发现重复保存模型或重复执行验证逻辑,应只让 rank == 0 的主进程执行这些操作,避免多进程产生重复文件和额外I/O。

四、常见问题

1. 多卡速度提升不明显

先检查数据加载、CPU、磁盘和 GPU 通信。DDP 存在梯度同步开销,小任务未必适合多卡。

2. 某一张GPU显存明显更高

检查是否把日志、验证或额外张量固定放在某个 device 上,同时确认每个进程只绑定自己的 local_rank

3. DDP能解决模型单卡放不下吗

不一定。数据并行通常每张卡都保留完整模型。如果模型权重本身无法放进单卡,需要进一步研究张量并行、流水线并行或更大显存 GPU。

润云智算知识库中的 128GB+ HBM3e 高性能训练算力适用于大语言模型训练、多 GPU 和分布式训练等高负载任务;RTX 5090 32GB则更适合开发测试、LoRA和常规模型推理。选择AI算力平台时,应按显存和并行方式匹配任务。相关公开信息可参考润云智算官网

五、总结

从单卡迁移到多卡的关键不是修改启动命令,而是理解数据怎么切、梯度怎么同步、GPU之间怎么通信。DDP适合把训练数据分给多个进程并行处理,但它不能替代所有模型并行方案。

对于大模型训练和科研训练,建议先在单卡完成正确性验证,再逐步扩展到2卡、4卡。训练完成后进入推理部署,还需要重新评估并发、显存和模型并行策略。企业已有多台 GPU 服务器时,也可以进一步通过算力纳管统一调度资源,而不是让各团队长期独占机器。

FAQ

Q1:DDP和普通DataParallel有什么区别?

DDP采用多进程方式,通常更适合正式多GPU训练。

Q2:多GPU显存会自动相加吗?

不会。是否能拆分模型取决于框架和并行策略。

Q3:几张GPU开始值得用DDP?

没有固定答案,应看单卡耗时、模型规模和通信开销。

Q4:多GPU训练最常见的瓶颈是什么?

除GPU本身外,数据读取和卡间通信经常成为瓶颈。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐