标签: AGI

  • KV 缓存:深度解析大型语言模型推理的内存挑战

    大型语言模型(LLM)的推理过程通常需要大量的计算资源,特别是自注意力机制的计算量会随着序列长度的平方增长。为了优化推理效率,KV 缓存应运而生。它通过存储过去token的键值张量来避免重复计算,从而将计算复杂度从平方级降低到线性级。

    KV 缓存的权衡:内存换算力

    KV 缓存是一种权衡策略,它以牺牲内存为代价来换取更快的计算速度。本文将深入探讨 KV 缓存的规模、面临的挑战以及应对策略。

    KV 缓存到底有多大?

    对于每个序列中的每个token,我们需要存储两个向量张量(一个键张量和一个值张量),每个张量的维度为 d_head,对应于每个注意力层的每个注意力头的维度。每个张量参数所占用的空间取决于其精度:全精度(FP32)为 4 字节/参数,半精度(BF16、FP16)为 2 字节/参数,8 位数据类型(INT8、FP8)为 1 字节/参数,等等。

    假设批次大小为 b,总序列长度(提示 + 完成)为 t,解码器块/注意力层数为 n_layers,每个注意力层的注意力头数为 n_heads,注意力层的隐藏维度为 d_head,精度为 p_a。那么,多头注意力(MHA)模型的 KV 缓存每个token的内存消耗(以字节为单位)为:

        \[KV_cache_per_token = 2 \cdot n_heads \cdot d_head \cdot p_a\]

    注意:在 MHA 模型中,n_heads \cdot d_head = d_model,但为了简化公式,我们不会使用它。

    因此,KV 缓存的总大小(以字节为单位)为:

        \[KV_cache_total = b \cdot t \cdot KV_cache_per_token\]

    KV 缓存的挑战:内存爆炸

    从公式可以看出,KV 缓存的大小与批次大小和总序列长度成线性关系。由于总序列长度无法事先确定,因此 KV 缓存的内存需求也是未知的,这给内存管理带来了巨大的挑战。

    以流行的 MHA 模型为例(表 1),包括 Meta 的 Llama-2 和 OPT,MosaicML 的 MPT 和 BigScience 的 BLOOM:

    模型参数量层数头数隐藏维度
    Llama-2-7B7B32324096
    OPT-1.3B1.3B2416768
    MPT-7B7B32324096
    BLOOM-176B176B646412288

    表 1:流行的多头注意力 (MHA) 模型规格

    假设参数存储在半精度(FP16、BF16)中,我们选择一个较小的模型(Llama-2-7B)和一个较大的模型(BLOOM-176B)。对于 Llama-2-7B(BLOOM-176B),KV 缓存的内存消耗约为 0.5 MB/token(4 MB/token)。

    以 Llama-2-7B 为例,使用半精度,加载模型权重大约需要 14 GB 的内存,与缓存 28k 个token的键值相同。28k 个token可能对应于 56 个长度为 512 的序列的批次,这并不算极端。

    从上面的数字可以看出,KV 缓存的内存消耗会非常大,甚至可能超过加载大型序列模型权重所需的内存量。

    应对 KV 缓存挑战:内存优化策略

    为了应对 KV 缓存带来的内存压力,我们可以采取多种优化策略:

    1. 减少模型权重内存占用

    • 权重量化: 使用诸如 AWQ 或 GPTQ 等算法将模型权重量化为更小的数据类型,例如 INT8 或 FP8,从而减少模型权重的内存占用。

    2. 减少 KV 缓存内存占用

    • 减少批次大小: 降低批次大小可以减少 KV 缓存的内存占用,但也会降低硬件利用率,影响成本效益。
    • 减少对总序列长度的依赖:
      • 滑动窗口注意力: 使用诸如 Mistral-7B 等模型,其注意力机制只关注最后几个相邻的token,从而限制了 KV 缓存的大小。
      • 注意力压缩:
        • StreamingLLM 框架: 只保留第一个位置token(“汇聚token”)和最后一个相邻token(局部注意力)的键值,从而构建一个固定长度的滑动窗口。
        • H2O 和 Scissorhands: 通过设置缓存预算并丢弃一些token来压缩 KV 缓存。
        • FastGen: 通过设置最大近似误差来压缩注意力矩阵,从而实现更高的模型精度。
    • 减少层数: 较小的模型通常层数较少,如果小型模型能够满足你的用例,可以选择更小的模型。
    • 减少注意力头数:
      • 多查询注意力 (MQA): 所有查询头共享相同的键和值头,从而减少 KV 缓存的大小。
      • 分组查询注意力 (GQA): 将查询头分成组,同一组内的查询头共享相同的键和值头,提供了一种介于 MHA 和 MQA 之间的折衷方案。
    • 减少注意力头隐藏维度: 如果选择相同模型系列的不同大小版本,可能不会对 KV 缓存大小产生影响。
    • 使用更少的字节/参数: 对 KV 缓存进行量化可以显著减小其大小,但仅对权重进行量化(如 AWQ 或 GPTQ)无效。需要对权重和激活进行量化(如 LLM.int8() 或 SmoothQuant)才能实现 KV 缓存的量化。

    3. 利用多设备内存

    • 模型并行: 将模型拆分到多个 GPU 上,利用多个 GPU 的总内存和带宽,从而释放内存压力。
    • 内存卸载: 将 KV 缓存卸载到 CPU 内存或磁盘等更廉价的存储设备上,但会带来性能下降。

    4. 优化内存管理

    • PagedAttention: 将内存分配成固定大小的块,每个块可以包含固定数量的token,并可以跨请求共享,从而减少内存浪费。
    • RadixAttention: 通过对 KV 缓存进行索引,实现跨请求的 KV 缓存重用,从而提高性能。

    5. 扩展存储容量

    • 多 GPU: 使用多个 GPU 可以扩展存储容量,但受到单个主机所能容纳的最大多 GPU 实例的限制。
    • 多主机模型并行: 将模型和 KV 缓存拆分到多个主机上,可以实现无限的存储容量和序列长度。

    KV 缓存优化:未来方向

    随着 LLM 的不断发展,KV 缓存优化将成为一个重要的研究方向。未来,我们将看到更多针对 KV 缓存的优化策略,例如:

    • 更有效的注意力机制: 例如,基于稀疏注意力或局部注意力的模型。
    • 更智能的缓存压缩算法: 例如,能够根据模型的特定需求动态调整压缩策略的算法。
    • 更先进的内存管理技术: 例如,能够根据请求的具体情况动态分配和释放内存的算法。

    总结

    本文深入探讨了 KV 缓存的内存挑战以及应对策略。通过优化模型权重、KV 缓存、内存管理和存储容量,我们可以有效地解决 KV 缓存带来的内存压力,提高 LLM 推理的效率。

    参考文献

    [1]: Llama 2: Open Foundation and Fine-Tuned Chat Models (Touvron et al., 2023)
    [2]: OPT: Open Pre-trained Transformer Language Models (Zhang et al., 2022)
    [3]: Release blog posts for: MPT-7B (May 2023) and MPT-30B (June 2023)
    [4]: BLOOM: A 176B-Parameter Open-Access Multilingual Language Model (BigScience, 2023)
    [5]: Scaling Laws for Neural Language Models (Kaplan et al., 2020)
    [6]: Mistral 7B (Jiang et al., 2023)
    [7]: Efficient Streaming Language Models with Attention Sinks (Xiao et al., 2023) + GitHub repository
    [8]: H_2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models (Zhang et al., 2023) + GitHub repository
    [9]: Scissorhands: Exploiting the Persistence of Importance Hypothesis for LLM KV Cache Compression at Test Time (Liu et al. 2023)
    [10]: Model Tells You What to Discard: Adaptive KV Cache Compression for LLMs (Ge et al., 2023)
    [11]: Fast Transformer Decoding: One Write-Head is All You Need (Shazeer, 2019)
    [12]: GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints (Ainslie et al., 2023)
    [13]: PaLM: Scaling Language Modeling with Pathways (Chowdhery et al., 2022)
    [14]: The Falcon Series of Open Language Models (Almazrouei et al., 2023)
    [15]: AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration (Lin et al., 2023) + GitHub repository
    [16]: GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers (Frantar et al., 2022) + GitHub repository
    [17]: LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (Dettmers et al., 2022) + GitHub repository
    [18]: SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models (Xiao et al., 2022) + GitHub repository
    [19]: FlexGen: High-Throughput Generative Inference of Large Language Models with a Single GPU (Sheng et al., 2023) + GitHub repository
    [20] Efficient Memory Management for Large Language Model Serving with PagedAttention (Kwon et al., 2023) + GitHub repository
    [21] vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention (Kwon et al. 2023)
    [22] Efficiently Programming Large Language Models using SGLang (Zheng et al., 2023) + Blog post
    [23]: GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism (Huang et al., 2018)
    [24]: Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM (Narayanan et al., 2021)
    [25]: Efficiently Scaling Transformer Inference (Pope et al., 2022)
    [26]: Infinite-LLM: Efficient LLM Service for Long Context with DistAttention and Distributed KVCache (Lin et al., 2024)

  • 巨齿龙:无限上下文长度的 LLM 预训练与推理

    近年来,大型语言模型(LLM)在各个领域取得了显著的进步,但其在处理长序列数据方面仍然存在挑战。传统的 Transformer 架构由于其二次复杂度和对长度泛化的有限归纳偏差,在处理长序列时效率低下。为了克服这些限制,研究人员提出了各种亚二次复杂度解决方案,例如线性注意力和状态空间模型,但这些方法在预训练效率和下游任务准确性方面通常不如 Transformer。

    本文介绍了 巨齿龙(MEGALODON),一种能够高效处理无限上下文长度的序列建模神经架构。巨齿龙继承了 MEGA(带门控注意力的指数移动平均)的架构,并引入了多个技术组件来提升其能力和稳定性,包括:

    • 复指数移动平均(CEMA):将 MEGA 中的多维衰减 EMA 扩展到复数域,进一步提升了 EMA 的表达能力。
    • 时间步归一化层:将组归一化层推广到自回归序列建模任务,允许沿序列维度进行归一化,从而更好地处理序列数据中的内部协变量偏移。
    • 归一化注意力机制:通过对共享表示进行归一化,提高了注意力机制的稳定性,并简化了模型结构。
    • 带两跳残差的预归一化:通过重新排列每个块中的残差连接,有效地缓解了预归一化在模型规模扩大时出现的稳定性问题。

    巨齿龙通过将输入序列分割成固定长度的块,在模型训练和推理过程中都实现了线性计算和内存复杂度。

    巨齿龙的优势

    在与 LLAMA2 的对比实验中,巨齿龙在 70 亿参数规模和 2 万亿训练数据的情况下,展现出比 Transformer 更高的效率。巨齿龙的训练损失达到了 1.70,介于 LLAMA2-7B(1.75)和 LLAMA2-13B(1.67)之间。

    巨齿龙在各种下游任务和数据模态的基准测试中,都表现出比 Transformer 更强的鲁棒性,包括:

    • 常识推理:HellaSwag、PIQA、SIQA、WinoGrande、ARC-e 和 ARC-c
    • 世界知识:NaturalQuestions 和 TriviaQA
    • 阅读理解:BoolQ
    • 综合评估:MMLU
    • 长上下文问答:Scrolls 数据集中的 NarrativeQA、Qasper 和 QMSum
    • 指令微调:MT-Bench
    • 图像分类:ImageNet-1K
    • 自回归语言建模:PG-19

    巨齿龙的未来展望

    巨齿龙的成功为未来的 LLM 研究指明了方向:

    • 巨齿龙能够高效地处理无限上下文长度的序列数据,为处理长文本、多轮对话和视频生成等任务提供了新的可能性。
    • 巨齿龙在各种数据模态的基准测试中都表现出色,表明它有潜力成为未来大规模多模态预训练的通用架构。

    参考文献


    https://gateway.ipfsscan.io/ipfs/QmY8ia4azH6H351Ss1rXjg27idXyDwdpKWR1kBrrrUd43Q?filename=从第一性原理出发,让深度学习更加生动.pdf

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 2084 | UV: 1141
Last updated: 2025-06-20 16:32:19
沪ICP备2024052574号-1