MHA、MQA 和 GQA 的区别是什么?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
MHA、MQA、GQA 用 KV Head 数一眼区分:MHA 每个 Query Head 独立 K/V,MQA 全部共享,GQA 分组共享。随后解释共享为何降低 KV Cache 与 Decode 带宽,但不会同比减少 Query 计算;GQA 是常见折中,追问时再谈质量和 Tensor Parallel 的 Head 整除。
可以这样答:
三者的核心差别是 KV Head 数:MHA 为每个 Query Head 保留独立 K/V,MQA 让所有 Query Head 共享一组,GQA 则按组共享。共享 KV 会明显减少 KV Cache 和 Decode 内存带宽,但 Query 投影仍然存在。MHA 表达能力更充分,MQA 最省,GQA 常作为质量与效率的折中。
核心回答
三者主要区别是 Query Head 与 Key/Value Head 的共享方式。MHA 为每个 Query Head 配置独立的 K/V Head;MQA 让所有 Query Head 共享同一组 K/V;GQA 把多个 Query Head 分组,每组共享一组 K/V。减少 KV Head 可以缩小 KV Cache 和解码时的内存读取量,MQA 最省,MHA 表达自由度最高,GQA 在质量与推理效率之间折中。
展开说明
设 Query Head 数为 \(h_q\)、KV Head 数为 \(h_{\mathrm{kv}}\):MHA 中二者通常相等,MQA 中 \(h_{\mathrm{kv}} = 1\),GQA 则满足 \(1 < h_{\mathrm{kv}} < h_q\),且实现通常要求分组可整除。它们并没有消除注意力随上下文增长的计算,只是降低 K/V 投影、缓存容量以及解码阶段读取历史 K/V 的带宽压力。
共享 K/V 可能限制不同 Query Head 独立表示历史信息的能力,因此 MQA 并非无条件更好。GQA 论文展示了从 MHA 检查点向 GQA 转换并继续训练的方案,但具体质量仍受模型规模、数据和训练配方影响。
工程实践
部署前应根据层数、序列长度、并发和数据类型估算 KV Cache,而不只比较参数量。做张量并行时要检查 Head 数与并行度的整除关系,并确认推理框架真的支持该模型的 KV Head 布局。评测应同时覆盖任务质量、tokens/s、单 token 延迟和最大稳定并发。
常见追问
- GQA 为什么能显著减小 KV Cache,却不会同比减少全部计算? 它减少的是需要保存和读取的 KV Head,Query Head 及其投影仍保留,注意力得分计算也不会按相同比例消失。
- 如何把一个 MHA 检查点改造成 GQA? 常把同组 K/V Head 的权重做均值或池化初始化,再继续训练恢复质量;不能只改配置而不处理权重形状。
- Tensor Parallel 对 Query Head 和 KV Head 数有什么约束? Head 数需与并行分片方式兼容,通常要求可整除或复制少量 KV Head;否则会产生不均衡或额外通信。
一句话复习
MHA 不共享 K/V,MQA 全部共享,GQA 分组共享;共享越多,KV 开销越小,但要验证质量取舍。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。