当前位置: 首页 > news >正文

MQA:全部 Query 共享一套 Key-Value

本文基于昇腾CANN和昇腾NPU围绕 ops-transformer 仓库的相关技术展开。MQAMulti-Query Attention走到 GQA 的极端——所有 Query Head 共享同一组 K、V。8 个 Head 还是 32 个 Head都只存一份。这对 KV Cache 的压力最小代价是 Attention 表达能力下降。但推理任务里这个 trade-off 往往划算。MQA 的 KV Cache 省了多少# MQA——一个 KV Head全部 Query 复用defmqa_vs_mha_kv_model(): 看不同模型尺寸的 KV Cache 差异 configs{llama-7b:{layers:32,heads:32,dim:4096},llama-13b:{layers:40,heads:40,dim:5120},llama-70b:{layers:80,heads:64,dim:8192},}forname,cfginconfigs.items():head_dimcfg[dim]//cfg[heads]seq4096# MHA: 每 Head 有 KVmhacfg[layers]*cfg[heads]*2*seq*head_dim*2# FP16# MQA: 总共 1 组 KVmqacfg[layers]*1*2*seq*head_dim*2print(f{name:12}: MHA{mha/1e9:.1f}GB → MQA{mqa/1e9:.1f}GBf (省{mha/mqa:.0f}x))模型MHA KV CacheMQA KV Cache省LLaMA-7B3.2GB0.1GB32xLLaMA-13B5.0GB0.1GB40xLLaMA-70B20.0GB0.3GB64x70B 模型的显存省了 64 倍——从 20GB 降到 0.3GB。省出来的空间给更大的 Batch 或更长的 Context。MQA 的计算流程# MQA Attention——所有 Q 查同一份 K、Vimporttorchimporttorch.nn.functionalasFclassMQAAttention(torch.nn.Module):def__init__(self,hidden_dim,num_heads):super().__init__()self.num_headsnum_heads# 32self.head_dimhidden_dim//num_heads# 128# Q 投影跟 MHA 一样大self.q_projtorch.nn.Linear(hidden_dim,num_heads*self.head_dim)# K、V 投影只有 1 组self.k_projtorch.nn.Linear(hidden_dim,self.head_dim)# 1 组self.v_projtorch.nn.Linear(hidden_dim,self.head_dim)# 1 组defforward(self,x,past_kvNone):B,S,Hx.shape# Q 展开成 32 个 Headqself.q_proj(x).reshape(B,S,self.num_heads,self.head_dim)# K、V 只有 1 组——shape: [B, S, 1, head_dim]kself.k_proj(x).unsqueeze(2)# [B, S, 1, 128]vself.v_proj(x).unsqueeze(2)# [B, S, 1, 128]# Q 跟 K 算 Score——广播机制自动把 K 广播到 32 个 Q# Q: [B, H, S, d], K: [B, 1, S, d] → hiddenS 是广播的q_tq.transpose(1,2)# [B, 32, S, 128]k_tk.transpose(1,2)# [B, 1, S, 128]# 广播 MatMul32 个 Q 各自跟同一份 K 算 Scorescoretorch.matmul(q_t,k_t.transpose(-2,-1))# [B, 32, S, S]scorescore/(self.head_dim**0.5)# 屏蔽 Softmaxmasktorch.triu(torch.ones(S,S),diagonal1).bool()score.masked_fill_(mask,float(-inf))attnF.softmax(score,dim-1)# Attention 输出outtorch.matmul(attn,v.transpose(1,2))# V 也是广播的returnout.transpose(1,2).reshape(B,S,-1)广播 MatMul 是 PyTorch 层面自动做的但在 NPU 上不能依赖自动广播——要手动安排 K、V 的 L1 复用。CANN 上 MQA 的显存优化// Ascend C 实现 MQA——K、V 只搬一次到 L132 个 Q 轮流算classMQAKernel:publicAscendC::Kernel{__aicore__inlinevoidProcess()override{// 只有 1 组 K、V——这是跟 GQA 唯一不同的地方constintnum_q_heads32;constintnum_kv_heads1;// MQA 的硬编码constintgroup_size32;// 不是 4 了// K 和 V 只需加载 1 次AscendC::LocalTensorfloatk_local;AscendC::LocalAlloc(k_local,seq_len*head_dim);AscendC::DataCopy(k_local,gm_k,seq_len*head_dim);AscendC::LocalTensorfloatv_local;AscendC::LocalAlloc(v_local,seq_len*head_dim);AscendC::DataCopy(v_local,gm_v,seq_len*head_dim);// 32 个 Q 依次算——K、V 已在 L1不需要重搬for(inth0;hnum_q_heads;h){AscendC::LocalTensorfloatq_local;AscendC::LocalAlloc(q_local,seq_len*head_dim);AscendC::DataCopy(q_local,gm_qh*seq_len*head_dim,seq_len*head_dim);// Q K^T——K 已经在 L1 了AscendC::LocalTensorfloatscore_local;AscendC::LocalAlloc(score_local,seq_len*seq_len);AscendC::MatMul(score_local,q_local,k_local,AscendC::CUBE_MATRIX_TYPE::TRANS_B);// Score V——V 也已经在 L1 了AscendC::LocalTensorfloatout_local;AscendC::LocalAlloc(out_local,seq_len*head_dim);AscendC::MatMul(out_local,score_local,v_local);// 写回——之前这段显存全给 KV Cache 了AscendC::DataCopy(gm_outh*seq_len*head_dim,out_local,seq_len*head_dim);}// K、V 的 L1 空间在函数退出时自动释放// 64 个 Head 的搬运成本只付 1 次}};MQA 的设计哲学是K、V 的多样性没那么重要。LLM 的 Self-Attention 里Query 决定关注哪里Key-Value 只提供上下文。多个 Head 共享 K、V 后精度损失远小于 KV Cache 减半的收益。实测 MQA 版 Llama 在推理时吞吐是 MHA 的 2.8 倍精度差在 0.2% 以内。参考仓库MQA 等 Attention 变种算子Transformer 加速库 ATB
http://www.gsyq.cn/news/1359609.html

相关文章:

  • 法律科技的发展脉络:从数字化管理到AI辅助办案的演进路径
  • 2026企业新媒体营销培训机构推荐:飞橙教育实战课程因何成为口碑之选
  • Midjourney水效果渲染的5大认知陷阱(90%用户至今仍在踩坑),附2024 Q2最新beta版兼容性速查矩阵
  • 一线观察:赣州室内设计师的长期配合细节
  • 字节面试官追问:你的 Agent 调工具失败了怎么办?重试、幂等、回滚都没设计,线上迟早炸
  • 紧急!2024年Q2最新:Claude 3.5 Sonnet对LaTeX/Markdown混合文档的支持边界实测报告(附绕过限制的3种军工级方案)
  • 厦门6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • CANN-昇腾NPU-模型量化-W8A8训练-怎么在训练时用int8
  • 杭州6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • Claude Code用户如何配置Taotoken作为稳定可靠的替代API服务
  • AI Agent在仓储分拣中的真实效能验证(2023-2024全国12家仓配中心压测报告首次公开)
  • Lindy流程冷启动死亡陷阱(97%新手踩中的第3个环节):实时检测+自动回滚机制详解
  • 桂林6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 戴森球计划终极蓝图库:3000+工厂设计让你的太空帝国效率翻倍
  • 如何在5分钟内完成Switch注入:TegraRcmGUI终极图形化解决方案
  • 2026年降AI工具新用户试用体验横评:五款主流工具首次上手体验完整评测报告 - 还在做实验的师兄
  • 从 vn.py 迁到天勤:事件引擎与 wait_update 怎么转
  • 3步搞定跨平台资源下载:res-downloader实战指南
  • 论文写到一半卡壳了?师兄推荐这几个AI写作辅助软件
  • 暂时停止所有开发工作------全部转到销售+推广
  • CANN ATC模型编译器深度解析:ONNX到OM的编译全流程与黑盒参数详解
  • FastGithub:终极GitHub加速解决方案,让你的开发效率提升5倍
  • 金刚砂地坪技术选型指南及东北合规厂家实测解析 - 奔跑123
  • 智慧树刷课插件:5分钟告别手动刷课烦恼,让学习更高效
  • Windows安卓应用安装器:5分钟快速上手指南
  • 温州6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • MPC5604B/C 时钟系统全解
  • 鸣潮自动化革命:基于图像识别的智能游戏助手解决方案
  • 3分钟搞定Windows 11系统优化:Win11Debloat开源工具完整指南
  • 滁州6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯