把核心讲清楚
你手里有 8 段说话人音频,单卡一次只能跑 4 段。 最朴素的想法是:借一张卡,一人跑 4 段。这就是数据并行(DDP,Distributed Data Parallel)的本质。
它的整个运行主线只有三步: 1. 模型完全克隆:GPU 0 和 GPU 1 上各放一份一模一样的模型权重 $W$。 2. 切分数据,独立前向与反向:GPU 0 跑样本 1~4,算出局部损失和梯度 $g_0$;GPU 1 跑样本 5~8,算出局部损失和梯度 $g_1$。此时两张卡互不干扰。 3. 梯度同步与更新:两张卡通过高速通信把梯度加起来除以卡数,算出全局平均梯度,然后各自更新本地权重。
这里唯一的核心公式是平均梯度计算: $$g_{avg} = \frac{1}{N} \sum_{i=1}^N g_i$$ 其中 $N$ 是参与训练的总卡数(World Size),$g_i$ 是第 $i$ 张卡独立反向传播算出的梯度向量。
最小例子: 假设当前权重 $W = [1.0]$,学习率 $\eta = 0.1$。 - GPU 0 算出梯度 $g_0 = 2.0$; - GPU 1 算出梯度 $g_1 = 4.0$; - 两卡通信求均值:$g_{avg} = (2.0 + 4.0) / 2 = 3.0$; - GPU 0 更新:$W_0 = 1.0 - 0.1 \times 3.0 = 0.7$; - GPU 1 更新:$W_1 = 1.0 - 0.1 \times 3.0 = 0.7$。
看,两张卡没有在更新后互相拷贝庞大的模型权重,但两边的模型参数依然完全相同!这样通信量最小,只在反向时同步一次梯度即可。
一句话边界: DDP 只把“数据”切碎分发,不切模型;因此单张显卡的显存,必须能完整塞下一个模型和对应的单卡激活值。