百度大模型算法岗面经合集:GRPO 训练与算子优化
- 轮次
- 多轮面试合集
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍
- 介绍项目中算子优化工作的整体方案和实现原理
- 如何验证算子优化效果?
- GEMM 的矩阵尺寸是多少?
- 介绍一种熟悉的 GPU 或 DCU 架构
- 使用 Tensor Core 时采用了什么精度?
- 介绍项目及承担的主要工作
- PPO 和 GRPO 有什么区别?追问:为什么要使用 DPO?
- 持续学习方法可以分为哪些类型?
- 场景题:使用 8 张 A100 训练 7B 视觉语言模型的 GRPO,如何优化训练和推理速度?
- 模型训练加速有哪些方法?
《参考解析》
1. PPO、GRPO 与 DPO 的区别。PPO 是标准的 actor-critic 式在线策略优化:除了策略模型,还要训练一个同等规模的价值模型(critic)来估计优势,用 GAE 计算优势后做带裁剪的梯度更新,并用 KL 惩罚约束新策略别偏离参考模型太远。它效果稳,但显存和计算开销大——价值模型本身就是一份额外的模型权重与优化器状态,长序列训练时显存压力尤其明显。GRPO 的核心改动是去掉价值模型:对同一个 prompt 采样一组(group)答案,用组内奖励的均值与标准差把每个答案的奖励归一化成优势,即 A_i = (r_i - mean(r)) / std(r),这样优势估计只依赖组内相对比较,省掉了一整份 critic 的显存和计算,工程上更容易训起来,特别适合奖励可自动判定(数学、代码单测)的场景;代价是每组要采样多个答案,采样成本上升,且组内奖励全相同(全对或全错)时优势为 0、没有梯度信号。DPO 走的是另一条路:它不做在线采样,而是直接在偏好数据对(chosen/rejected)上用闭式目标函数优化,等价于把「奖励建模 + PPO」两步压成一步监督式训练,稳定、便宜、无需 rollout,因此常用于 SFT 之后的对齐阶段;缺点是依赖离线偏好数据的质量与覆盖度,无法在训练中探索新的回答,对分布外问题的泛化不如在线 RL。面试里被追问「为什么用 DPO」时,标准答法是:数据与算力受限、追求稳定和低成本时选 DPO;需要模型自己探索、奖励可自动验证、有条件做大量 rollout 时用 GRPO;PPO 则是需要最精细控制(尤其是通用人类偏好奖励)时的经典方案。
2. 8 张 A100 上训 7B 视觉语言模型 GRPO 的加速优化。这类场景题要按「先算瓶颈、再分训练与推理」的结构答。先估算:7B 模型全参数训练时,权重 + 梯度 + Adam 优化器状态约 16 字节/参数,即百 GB 量级,单卡 80GB 放不下,所以必须并行与省显存技术。推理(rollout)侧:用 vLLM/SGLang 这类高性能推理引擎做采样,开连续批处理与 PagedAttention,避免用训练框架逐条生成;把采样和训练放在不同进程/不同卡组上(colocate 时权重同步用 NCCL 广播或 CUDA IPC,非 colocate 时走参数服务器式传输);采样时用 KV Cache 复用、按长度分组减少 padding 浪费,合理设置每 prompt 的采样条数(group size,如 8)与最大生成长度,因为生成长度直接决定 rollout 耗时。训练侧:优先上 ZeRO-2/ZeRO-3 或 FSDP 做参数与优化器状态切分,配梯度检查点(activation checkpointing)压激活显存;用 bf16 混合精度而不是 fp16(RL 里数值更稳);序列打包(sequence packing)把长短不一的样本拼进同一条,减少 padding 与计算浪费;开启 FlashAttention 类融合算子;优化器换 CPU offload 或 8-bit Adam(如 bitsandbytes)进一步省显存;通信上用梯度累积降低 all-reduce 频次、按拓扑做通信分组。多模态特有的一刀是砍视觉 token:图像分辨率分级(按需放大)、动态切图后做 token 合并/池化、视频按帧采样而不是全帧输入——VLM 的序列长度往往被图像 token 主导,这块收益通常比纯文本侧的调优大得多。最后要提到工程手段:用 profiler(Nsight、torch profiler)确认时间到底花在 rollout、前向反传还是通信上,通常 GRPO 的最大头是采样;以及把参考模型的 logprob 计算放在推理引擎里批量算,避免用训练图重复前向。答完再补一句验收口径:在固定 step 内看 reward 曲线和吞吐(samples/s),确保加速没有牺牲训练稳定性。
3. 持续学习方法分类。按「怎么防止灾难性遗忘」分,主流有四大类:正则化类(EWC、SI、LwF 等)在损失里加约束,惩罚对重要参数的改动,其中重要性常用 Fisher 信息或路径积分估计,优点是不需要存旧数据、开销小,缺点是任务多起来后约束会互相打架、容量被锁死;回放类(experience replay、生成式回放)保留或生成旧任务的样本混合训练,效果通常最好,代价是存储与隐私问题,还有可能偏向新任务;参数隔离类(PackNet、HAT、Adapter、LoRA 增量)为每个任务分配独立的参数子集或增量模块,几乎不遗忘、可扩展到多任务,代价是参数量增长和推理时需要任务标识;架构/蒸馏类用知识蒸馏把旧模型的输出作为监督信号传给新模型,常和其他方法组合。此外从训练范式看还有持续预训练、增量微调、以及 RLHF 场景里的持续对齐。答题时最好落到具体场景:如果旧数据可以留存,回放 + 少量正则通常是最省事的最优解;如果数据不能留存(合规要求),就只能在正则化与参数隔离里选。
4. 算子优化怎么做,以及如何验证效果。方案层面要讲清「定位 → 优化 → 验证」闭环:先用 profiler(Nsight Systems/Compute、torch profiler)抓时间线,找出耗时占比最高的算子与是否存在 kernel launch 间隙、显存拷贝、同步等待;再判断瓶颈类型——是访存受限(arithmetic intensity 低,靠合并访存、向量化读写、共享内存/寄存器分块、减少 bank conflict 改善)还是计算受限(靠 Tensor Core、指令级并行、循环展开改善),roofline 模型是判断这两类问题的标准工具。常见优化手法包括算子融合(把 elementwise 链合成一个 kernel,砍掉中间张量的读写)、分块与流水(cp.async 预取、双缓冲隐藏延迟)、降低精度(FP16/BF16/FP8 配 FP32 累加)、以及用 CUTLASS/Triton 这类模板生成高质量实现而不是从零手写。验证效果要分三个层次,缺一层都不算论证充分:一是正确性,与参考实现(cuBLAS/PyTorch 原生)逐元素比对,给最大相对误差与通过阈值(fp16 通常看 1e-2~1e-3 量级),覆盖边界尺寸;二是性能,单独测 kernel 的耗时与带宽/算力利用率(Nsight Compute 的 achieved occupancy、DRAM throughput、tensor core utilization),并给出不同 shape 下的曲线而不是一个数;三是端到端,把优化后的算子放回模型,看整体时延/吞吐/QPS 是否真的变好(避免「kernel 快了但整体没变」——这在瓶颈不在该算子时非常常见),同时确认精度指标(如下游任务准确率)没有下降。
5. GEMM 尺寸、GPU 架构与 Tensor Core 精度怎么答。「GEMM 的矩阵尺寸是多少」问的是你项目里那个矩阵乘的 M/N/K,考的是你有没有真正跑过而不是抄了个 kernel:回答要给出具体形状(例如 M=4096, N=4096, K=4096 的方阵,或推理里 M=batch×seq_len, N=hidden, K=hidden 的形态),并解释形状为什么影响性能——M/N/K 决定了算力与访存的比例(arithmetic intensity ≈ MNK/(MN+NK+MK)),小 batch 时 GEMM 往往退化成访存受限,因此推理场景更依赖 continuous batching 把 M 撑起来;K 的取值还决定累加循环的分块策略与是否需要 split-K。介绍 GPU/DCU 架构时按层次讲:SM/CU(计算核心)与 warp 调度、寄存器文件与共享内存/L1 的层级、Tensor Core/矩阵引擎的吞吐能力、HBM 的带宽与容量、以及片内互联(NVLink/Infinity Fabric)与多卡拓扑;DCU 属于类 GPU 加速器,编程模型与 CUDA 相近但生态工具链不同,若熟悉可以对比其矩阵单元与显存体系,不熟就老实说以 CUDA 为主、只了解概念。Tensor Core 精度上要能列出档位与用法:FP16/BF16 输入 + FP32 累加是训练与推理的常用组合,TF32 是 A100 起的「省心档」(沿用 FP32 动态范围、10 位尾数,几乎不用改代码就能提速),FP8(E4M3/E5M2)在 Hopper 及以后配合缩放因子用于推理和大模型训练,INT8/INT4 用于量化推理。选择依据是数值稳定性与精度损失的权衡:训练常用 BF16(动态范围大、不易溢出),需要更高精度时用 FP32 累加或局部升精度;一旦用了低精度,就必须用上一题说的三层验证证明精度没有掉。