MiniMax AI Infra 实习 二面
Q: 你在训练大模型时用过哪些分布式训练方案?数据并行、模型并行、流水并行的区别是什么?
- 数据并行(DP/DDP):模型完整复制到每卡,数据分片,梯度AllReduce同步。通信量与模型大小成正比,与数据量无关。
- 模型并行(TP):将单层参数切分到多卡,每卡只持有部分参数,层内需要通信(AllReduce/AllGather)。适合单层参数量大的情况。
- 流水线并行(PP):将不同层分配到不同卡,数据以micro-batch形式流水通过各阶段。通信量小(只传激活值),但存在pipeline bubble。
Q: DeepSpeed ZeRO-1/ZeRO-2/ZeRO-3的核心差异是什么?
- ZeRO-1:只切分优化器状态(如Adam的m和v),每卡显存减少约4倍。
- ZeRO-2:切分优化器状态 + 梯度,每卡显存进一步减少约8倍。
- ZeRO-3:切分优化器状态 + 梯度 + 参数,显存减少与GPU数成线性。代价是前向时需要All-Gather参数,通信量增加1.5倍。
Q: 如何估算训练一个70B模型的单卡显存占用?
以混合精度训练(FP16参数 + FP32优化器)为例:
- 参数:70B * 2字节(FP16)= 140GB
- 梯度:70B * 2字节 = 140GB
- 优化器状态(Adam):70B * (4+4+4)字节 = 840GB(FP32参数副本+m+v)
- 总计约1120GB(单卡显然放不下)
使用ZeRO-3在8卡上:约140GB/卡,仍需A100 80GB多卡。实际还需加上激活显存(取决于batch size和序列长度,可用gradient checkpointing减少)。
Q: 除了ZeRO,还有哪些训练优化方法?
- 混合精度训练:FP16/BF16前向反向,FP32主参数更新。
- Gradient Checkpointing:不保存中间激活,反向时重新计算,以时间换空间。
- Flash Attention:减少注意力计算的显存和IO。
- Gradient Accumulation:累积多步梯度等效大batch。
- CPU/NVMe Offload:将暂不使用的数据卸载到CPU/NVMe。
- Selective Activation Recomputation:只重算显存占用大的层。
Q: LoRA的原理是什么?为什么低秩分解可以减少训练参数?
LoRA在冻结的预训练权重旁添加低秩分解矩阵:W' = W + BA,其中B∈R^(d×r),A∈R^(r×k),r<<min(d,k)。
为什么有效:研究表明预训练模型的权重更新矩阵ΔW具有较低的”内在维度”(intrinsic rank),即微调时参数变化可以被低秩矩阵很好地近似。r通常取4-64,参数量从d*k降至(d+k)*r,减少百倍以上。
Q: LoRA中矩阵A和B为什么通常采用不同初始化方式?
A使用正态分布或Kaiming初始化,B初始化为零。这样训练初始时BA=0,模型行为与预训练模型完全一致(无损初始化),从预训练的好起点出发微调。如果两者都随机初始化,初始时BA非零,会破坏预训练模型学到的表示,可能导致训练不稳定。
Q: 手撕:实现滑动窗口最大值?
(编程题)