3D并行:
①、数据并行:把一批数据拆成N份(N=GPU数量),每张GPU算1份数据的"前向+反向传播",算出各自的梯度后同步平均,再用这个平均梯度更新所有GPU的模型参数(保证所有卡模型一致)
企业案例:某电商用PyTorch DDP+DeepSpeed训练"用户评论情感分类模型"(BERT-base,1.1亿参数),用8张A100 GPU数据并行
- 总批次设为256(8卡×每卡32条数据);
- 每张卡算32条评论的梯度,同步后更新模型;
- 效果:训练速度从单卡2天/轮→8卡3小时/轮,显存占用单卡仅需15GB(原单卡需60GB)
核心作用:提速(多卡同时算不同数据),适合模型不大但数据量大的场景(如推荐、CTR预估)
②、流水线并行:把模型按层切分成多段(如GPT-3的96层切为8段,每段12层),每段交给1组GPU处理,数据像"流水线"一样依次流过各段(前一段的输出作为后一段的输入)
企业案例:某AI公司训练千亿参数对话模型(类似GPT-3),用Megatron-LM+流水线并行
- 将模型切为16段(每段约60层),用16组GPU(每组8卡)处理;
- 数据流经第1段(前60层)后,传给第2段(中间60层),依此类推;
- 效果:单卡仅需存60层参数(约5GB),解决了"千亿参数单卡放不下"的问题
核心作用:训练更大模型(模型层分到多卡),适合超深模型(如GPT、LLaMA)
③、张量并行,把单个矩阵运算拆成多个小矩阵(如将一个1024维的注意力头矩阵拆为2个512维矩阵),让多张GPU同时计算这些小矩阵,再把结果拼接起来
企业案例:某科研机构用Megatron-LM张量并行训练"多语言翻译模型"(T5-large,7.5亿参数)
- 将注意力层的1024维矩阵拆为4个256维矩阵,用4张GPU同时计算
- 效果:单卡显存占用从30GB→8GB,训练速度提升3倍
核心作用:优化单卡计算效率(拆分大运算为多卡并行),常与流水线并行组合使用(如Megatron-LM的"张量+流水线"3D并行)
混合精度训练:FP16/BF16计算 + FP32主权重(省显存+提速):
用半精度浮点数(FP16/BF16,占4字节)做计算,单精度浮点数(FP32,占8字节)存模型权重,最后用FP32权重更新参数
企业案例:某金融公司训练风控大模型(10亿参数),用DeepSpeed混合精度训练
- 计算时用FP16(显存占用减半),权重存FP32(避免梯度消失)
- 效果:显存从单卡80GB→40GB,训练速度提升2倍,模型精度几乎不变(AUC下降<0.1%)
核心作用:减少显存占用+提升计算速度,是大模型训练的"标配"(几乎所有千亿模型都用)
梯度累计:小批次"攒梯度,模拟大批次"
如果单卡显存太小,无法容纳"大批次数据"(如想设批次64但单卡只能放16),就用多步小批次(如4步×16)的梯度累加,代替1步大批次的梯度,再更新参数
企业案例:某创业公司用单张V100 GPU(32GB显存) 训练"文本摘要模型"(BERT-base),想设批次32但显存不够
- 设梯度累积步数=2,每次算16条数据(小批次),累加2步梯度后再更新;
- 效果:等效批次32,显存占用从25GB→13GB,成功在小显卡上跑通训练
核心作用:用时间换显存(小显存卡也能模拟大批次训练),适合资源有限的场景(如单卡训练)
PyTorch的分布式训练策略:DDP + DeepSpeed
核心组件:DistributedDataParallel (DDP),PyTorch原生的数据并行方案,属于"多卡协作干同一件事"的基础框架
把一批数据拆成N份(N=GPU数量),每台GPU算1份数据的"前向传播→损失计算→反向传播",算出各自的梯度后,同步所有GPU的梯度(取平均),再用这个平均梯度更新每台GPU上的模型参数(保证所有卡模型一致)。
工作流程(以2张GPU为例):
- 主GPU(Rank 0)把模型复制到所有GPU(包括自己)
- 数据加载器按GPU数量拆分数据(如总批次32,每张卡算16)
- 每张卡独立算自己的16条数据,得到梯度
- 所有卡通过"集合通信"(如NCCL协议)交换梯度,取平均后更新各自模型
- 重复2-4步,直到训练结束
优化增强:DeepSpeed(微软开源的分布式训练库)
DDP虽基础,但在超大模型(如10亿+参数)或大批次训练时,会遇到"显存不够""通信耗时"问题。
DeepSpeed通过内存优化和通信优化解决这些痛点,如ds_config就是它的配置项
案例:电商公司,用PyTorch训练"用户兴趣预测模型"(类似BERT-large,3.4亿参数),单卡显存不够,需用8张A100 GPU分布式训练。
此时ds_config配置如下:
- train_batch_size总批次大小(所有GPU处理的样本总数)。比如256意味着8张卡,每张卡每次算32条数据(256÷8=32)。若单卡最大批次只能设16,可通过gradient_accumulation_steps补足
- gradient_accumulation_steps梯度累积步数。如果单卡显存太小,无法容纳train_batch_size÷GPU数的批次,就"攒几步小批次的梯度,再合并更新"。比如设为2,每卡每次算16条数据(32÷2=16),算2次后累积梯度,再同步更新。这相当于用"时间换显存",让小显存卡也能跑大批次。
- optimizer指定优化器(AdamW),DeepSpeed会自动管理优化器状态(如动量、方差),避免重复存储。
- fp16: {"enabled": True}:混合精度训练。用FP16(半精度浮点数,占4字节)代替FP32(单精度,8字节)计算,显存占用减半,计算速度提升2-3倍。DeepSpeed会自动处理"精度转换"(如关键层用FP32保稳),避免数值溢出。
- zero_optimization: {"stage": 2}:ZeRO优化,解决"多卡显存冗余"问题
python
ds_config = {
"train_batch_size":256, #总批次大小(8卡,每卡32)
"gradient_accumulation_steps":2, #梯度累计步数(实际每卡有效批次=32 * 2=64)
"optimizer":{"type":"AdamW","params":{"lr":2e-5}}, #优化器类型参数
"fp16":{"enabled":True}, #启用混合精度训练(FP16半精度)
"zero_optimization":{"stage":2} #ZeRO优化阶段2(核心)
}
TensorFlow的分布式训练策略:MirroredStrategy
核心组件:MirroredStrategy(镜像策略),TensorFlow原生的单机多卡数据并行方案(仅支持1台机器内的多张GPU,跨机器需用MultiWorkerMirroredStrategy)
和PyTorch的DDP几乎一样------"数据拆分到多卡,各算各的梯度,同步后更新参数",但API更简洁(无需手动初始化进程组)
工作流程(以2张GPU为例):
- 用tf.distribute.MirroredStrategy()创建策略对象,自动检测本机GPU
- 在strategy.scope()作用域内定义模型和编译(确保所有卡共享模型结构)
- 数据加载器自动拆分数据到各卡(如总批次64,每卡32)
- 每张卡独立计算梯度,通过NCCL协议同步梯度(取平均),更新模型参数
- 重复3-4步,完成训练
案例:金融风控模型的单机多卡训练
某银行用TensorFlow训练"交易欺诈检测模型"(DeepFM,5000万参数),服务器有4张V100 GPU(单卡显存32GB,模型+数据需40GB,单卡放不下)
python
strategy = tf.distribute.MirroredStrategy() #自动检测4张GPU
with strategy.scope():# 在策略作用域内定义模型
model = DeepFM(num_features=10000) #模型结构
model.compile(optimizer='adam',loss='binary_crossentropy') #编译
model.fit(train_dataset,epochs=5) #自动分布式训练