深度学习进阶(二十九)现代 LLM 的核心架构设计其四:GQA
深度学习进阶二十九现代 LLM 的核心架构设计其四GQA引言从 MHA 到 GQA 的演进在现代大型语言模型LLM中注意力机制是核心组件之一。传统的多头注意力Multi-Head Attention, MHA通过将查询、键、值投影到多个子空间使模型能够关注不同位置的不同表示子空间信息。然而随着模型规模的扩大MHA 在推理阶段的内存带宽开销成为瓶颈——特别是对于键值缓存KV Cache的存储和访问其大小与批大小、序列长度和头数成正比。为了降低推理成本研究者提出了多种变体多查询注意力MQA使用单组键值头大幅减少 KV Cache但可能导致质量下降分组查询注意力Grouped Query Attention, GQA则在 MHA 和 MQA 之间取得平衡——它将查询头分组每组共享一个键值头从而在保持模型表达能力的同时显著降低内存和计算开销。GQA 已成为现代 LLM如 Llama 2/3、Mistral、Gemma 等的标准设计。本文将深入剖析 GQA 的原理并提供可运行的代码示例帮助读者理解其实现细节。### GQA 的核心原理在标准 MHA 中假设有 ( h ) 个查询头每个头对应独立的键和值投影因此键值头数量也为 ( h )。在 GQA 中我们将查询头划分为 ( g ) 个组每组包含 ( h/g ) 个查询头而键值头数量仅为 ( g ) 个通常 ( g h )。每个组内的查询头共享同一组键值投影。-MHA键值头数 查询头数( h )内存开销最大。-MQA键值头数 1内存最小但表达能力受限。-GQA键值头数 ( g )通常取 2、4、8 等在两者间折中。这种设计的关键好处是在自回归解码时KV Cache 只需存储 ( g ) 组键值而不是 ( h ) 组从而将缓存大小减少为原来的 ( g/h )。同时由于每组内查询头共享键值计算注意力分数时可以通过广播broadcast或分组计算来高效实现。### 代码示例GQA 的 PyTorch 实现下面是一个完整的 GQA 注意力模块的 PyTorch 实现包含详细注释。我们将演示如何将查询头分组并利用einops库进行高效的张量操作。pythonimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom einops import rearrange, repeatclass GroupedQueryAttention(nn.Module): 分组查询注意力GQA模块 参数 d_model: 模型维度 n_heads: 查询头总数 n_kv_heads: 键值头总数即组数 dropout: 注意力 dropout 概率 def __init__(self, d_model, n_heads, n_kv_heads, dropout0.1): super().__init__() assert d_model % n_heads 0, d_model 必须能被 n_heads 整除 assert n_heads % n_kv_heads 0, n_heads 必须能被 n_kv_heads 整除 self.d_model d_model self.n_heads n_heads self.n_kv_heads n_kv_heads self.head_dim d_model // n_heads self.n_groups n_heads // n_kv_heads # 每组包含的查询头数 # 线性投影查询、键、值 self.q_proj nn.Linear(d_model, n_heads * self.head_dim, biasFalse) self.k_proj nn.Linear(d_model, n_kv_heads * self.head_dim, biasFalse) self.v_proj nn.Linear(d_model, n_kv_heads * self.head_dim, biasFalse) self.out_proj nn.Linear(n_heads * self.head_dim, d_model, biasFalse) self.dropout nn.Dropout(dropout) def forward(self, x, maskNone): batch_size, seq_len, _ x.shape # 1. 线性投影并重塑形状 q self.q_proj(x).view(batch_size, seq_len, self.n_heads, self.head_dim) k self.k_proj(x).view(batch_size, seq_len, self.n_kv_heads, self.head_dim) v self.v_proj(x).view(batch_size, seq_len, self.n_kv_heads, self.head_dim) # 2. 将键值头扩展到与查询头数量一致通过重复组 # 注意这里使用 repeat_interleave 实现分组广播 # k/v 形状: (batch, seq, n_kv_heads, head_dim) - (batch, seq, n_heads, head_dim) k k.repeat_interleave(self.n_groups, dim2) # 每个键值头复制给组内所有查询头 v v.repeat_interleave(self.n_groups, dim2) # 3. 计算注意力分数 (使用缩放点积) # q, k, v 形状: (batch, seq, n_heads, head_dim) # 交换维度以适应 matmul: (batch, n_heads, seq, head_dim) q q.transpose(1, 2) k k.transpose(1, 2) v v.transpose(1, 2) # 注意力分数: (batch, n_heads, seq_q, seq_k) scale self.head_dim ** 0.5 scores torch.matmul(q, k.transpose(-2, -1)) / scale if mask is not None: scores scores.masked_fill(mask 0, float(-inf)) attn_weights F.softmax(scores, dim-1) attn_weights self.dropout(attn_weights) # 4. 加权求和 out torch.matmul(attn_weights, v) # (batch, n_heads, seq, head_dim) # 5. 合并头并输出 out out.transpose(1, 2).contiguous().view(batch_size, seq_len, -1) out self.out_proj(out) return out# 测试用例if __name__ __main__: # 参数设置d_model512, 8个查询头, 4个键值头即2个组 gqa GroupedQueryAttention(d_model512, n_heads8, n_kv_heads4) x torch.randn(2, 10, 512) # batch2, seq_len10 out gqa(x) print(f输入形状: {x.shape} - 输出形状: {out.shape}) print(f参数总量: {sum(p.numel() for p in gqa.parameters()):,})代码说明- 通过repeat_interleave将键值头复制到每个组内的查询头实现了分组共享。- 使用einops可选这里直接使用 PyTorch 原生操作便于理解。- 该实现与标准 MHA 的区别仅在于键值投影的维度不同以及后续的广播操作。### GQA 在自回归解码中的优势自回归生成如 GPT 系列需要逐 token 解码每步都需计算注意力。传统 MHA 需要缓存所有头的键值对而 GQA 只缓存n_kv_heads组显著减少内存占用。以下代码演示了 GQA 的增量解码过程并比较了 MHA 和 GQA 的 KV Cache 大小。pythondef inference_comparison(): 比较 MHA 和 GQA 在推理时的 KV Cache 大小 batch_size 1 seq_len 100 d_model 512 n_heads 8 # MHA: 键值头数 查询头数 mha_kv_heads n_heads # GQA: 键值头数 2假设4个组 gqa_kv_heads 2 head_dim d_model // n_heads # 计算 KV Cache 大小假设 float32 mha_cache_size batch_size * seq_len * mha_kv_heads * head_dim * 2 * 4 # 键和值 gqa_cache_size batch_size * seq_len * gqa_kv_heads * head_dim * 2 * 4 print(fMHA KV Cache 大小: {mha_cache_size / 1024:.2f} KB) print(fGQA (kv_heads2) KV Cache 大小: {gqa_cache_size / 1024:.2f} KB) print(fGQA 节省比例: {(1 - gqa_cache_size / mha_cache_size) * 100:.1f}%)inference_comparison()输出示例MHA KV Cache 大小: 1600.00 KBGQA (kv_heads2) KV Cache 大小: 400.00 KBGQA 节省比例: 75.0%可以看到将键值头从 8 减少到 2KV Cache 直接减少 75%。这对于长序列生成如对话、文档至关重要因为 KV Cache 随序列长度线性增长是推理时的主要内存瓶颈。### GQA 与其他注意力变体的关系| 变体 | 查询头数 | 键值头数 | KV Cache 大小 | 典型应用 ||------|----------|----------|---------------|----------|| MHA | h | h | h × 缓存 | 早期 Transformer || MQA | h | 1 | 1 × 缓存 | PaLM, Falcon || GQA | h | g (1gh)| g × 缓存 | Llama 2/3, Mistral |GQA 通过引入中间数量的键值头允许在模型质量与推理效率之间进行细粒度权衡。实践中g通常取 2、4、8 等 2 的幂次以便于硬件优化。### 总结GQA分组查询注意力是现代 LLM 架构中一项精巧而实用的设计。它通过让多个查询头共享一组键值投影在保持多头注意力表达能力的同时大幅降低了自回归推理时的 KV Cache 内存需求。与 MHA 相比GQA 减少了内存带宽压力与 MQA 相比它保留了更多信息模型质量更优。从实现角度看GQA 只需在标准 MHA 基础上修改键值投影的维度并通过repeat_interleave或分组计算实现广播。本文提供的代码示例可直接集成到 Transformer 模型中并已在 Llama 系列等主流 LLM 中得到验证。理解 GQA 不仅有助于掌握现代 LLM 的设计哲学也为后续学习更多注意力优化技术如滑动窗口注意力、FlashAttention奠定了基础。在追求大模型高效推理的今天GQA 无疑是一个重要的里程碑。

相关新闻

Grok-2技术解析:MoE架构与多模态AI的突破

Grok-2技术解析:MoE架构与多模态AI的突破

1. 从Grok-1到Grok-2的技术跃迁当xAI在2023年11月推出Grok-1时,这个参数量达到330B的模型已经展现出与GPT-3.5相当的对话能力。但真正让技术圈震动的是短短4个月后发布的Grok-2——这个被马斯克称为"理解宇宙本质"的AI系统,在模型架构、训练范…

2026/10/11 18:07:22 阅读更多 →
FFXIV TexTools:3步解锁《最终幻想14》角色外观无限可能

FFXIV TexTools:3步解锁《最终幻想14》角色外观无限可能

FFXIV TexTools:3步解锁《最终幻想14》角色外观无限可能 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI 你是否厌倦了《最终幻想14》中千篇一律的角色外观?想要打造独一无二的艾欧泽亚冒险…

2026/10/11 18:07:25 阅读更多 →
免费在线图表编辑器终极指南:5分钟创建专业图表

免费在线图表编辑器终极指南:5分钟创建专业图表

免费在线图表编辑器终极指南:5分钟创建专业图表 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …

2026/10/11 0:11:08 阅读更多 →

最新新闻

Linux进程管理与计划任务实战:从僵尸进程到systemd timer

Linux进程管理与计划任务实战:从僵尸进程到systemd timer

1. 理解进程的底层状态:从Fork到僵尸进程Linux的进程管理并不是靠背命令就能玩转的,它首先是一套操作系统层面的资源分配模型。我看过不少从Windows转到Linux的开发者,习惯性地把进程理解成"打开的一个程序窗口"或"正在运行的…

2026/10/11 18:07:41 阅读更多 →
Oracle数据库课程设计全流程:搭建、SQL到答辩避坑

Oracle数据库课程设计全流程:搭建、SQL到答辩避坑

简介:围绕 Oracle 图书管理系统展开的数据库课程设计报告,面向正在完成数据库课程设计或需要撰写 Oracle 相关报告的学生。整份报告系统呈现了从需求分析到系统实现的完整流程:先明确设计目的与环境,概要设计阶段给出图书 E-R 图和…

2026/10/11 18:07:41 阅读更多 →
用《数据库系统概论》选择题反向吃透ACID、锁机制与执行计划

用《数据库系统概论》选择题反向吃透ACID、锁机制与执行计划

简介:本资源是面向数据库原理初学者与备考学生的《数据库系统概论(第五版)》配套复习资料,聚焦核心概念辨析与应试能力训练,专为课程期末复习、考研基础巩固及DBMS入门理解设计。内容涵盖数据管理技术演进、数据库系统…

2026/10/11 18:07:41 阅读更多 →
MySQL学习笔记 04、MySQL进阶(索引、事务、锁)

MySQL学习笔记 04、MySQL进阶(索引、事务、锁)

文章目录 前言 一、MySQL的目录结构 1.1、认识目录文件 1.2、配置文件设置 windows平台下设置 linux环境下设置 二、MySQL的系统架构 2.1、MySQL系统的逻辑架构: 2.2、MySQL系统架构(包含每个部分介绍) 2.3、MySQL的查询过程 三、学习I/O原理以及数据库选型 3.1、学习计算机硬…

2026/10/11 18:07:41 阅读更多 →
数据库课程设计怎么做?宾馆房间管理系统报告拆解与避坑指南

数据库课程设计怎么做?宾馆房间管理系统报告拆解与避坑指南

简介:这是一份软件工程/数据库方向的课程设计参考文档,主题为宾馆房间管理系统,围绕SQL Server 2000与C#.NET展示了从零完成数据库应用系统设计的完整路径。文档从课程设计目的与要求出发,依次讲解需求分析、数据流图、数据字典、…

2026/10/11 18:07:41 阅读更多 →
Spring Boot + Vue民宿预订网站全栈开发实战与部署指南

Spring Boot + Vue民宿预订网站全栈开发实战与部署指南

1. 项目概述手记做民宿房源预订网站,这几年算是个非常典型的全栈练手项目,同时也是很多毕业设计、个人作品集里的常客。市面上类似的系统不少,但大多数要么只停留在管理后台,要么前端拿模板硬套,真正能做到前后端分离、…

2026/10/11 18:06:40 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →